React Native (9)利用Modal 自定义类似MBProgressHUD组件

利用Modal 自定义类似MBProgressHUD组件

WechatIMG122.jpeg
1. 效果如下
2018-11-29 10_13_08.gif

2.用法

var MessageToast = require('../../MainPage/Tool/MessageToast');

render(){

    return (
      <View style={styles.containerAll}>
        <StatusBar />
        <MessageToast ref='toast'/>
        <View style={styles.contentView}>
            
             <TitleButton title='获取成功' style={{width:100,height:40}} onPress={()=>this.onPress('Success')} />
             <TitleButton title='获取失败' style={{width:100,height:40}} onPress={()=>this.onPress('Fail')} />
             <TitleButton title='显示toast' style={{width:100,height:40}} onPress={()=>this.onPress('Toast')} />
             <TitleButton title='显示加载中' style={{width:100,height:40}} onPress={()=>this.onPress('Loading')} />
         </View>
      </View>
      );
  }


onPress(event){

    if(event=='Success'){
      this.refs.toast.showSuccess('获取接口成功');
    }
    else if(event=='Fail'){
      this.refs.toast.showFail('获取接口失败');
    }
    else if(event=='Toast'){
      this.refs.toast.showMessage('哇哈哈哈哈哈哈哈哈哈哈哈哈哈哈哇哈哈哈哈哈哈哈哈哈哈哈哈哈哈');
    }
    else if(event=='Loading'){
      this.refs.toast.showLoading('加载中...',2000);
    }
  }
3.MessageToast的代码
var React = require('react-native');
var {
  Component,
  StyleSheet,
  Dimensions,
  View,
  Text,
  Modal,
  Image,
  ActivityIndicatorIOS,
} = React;

var screenWidth = Dimensions.get('window').width;
var screenHeight = Dimensions.get('window').height;
var MHPluginSDK = require('NativeModules').MHPluginSDK;

var TostType = {Success:0,Fail:1,Message:2,Loading:3};

var SuccessImage = MHPluginSDK.basePath +'NewImage/Toast_success.png';
var InfoImage    = MHPluginSDK.basePath +'NewImage/Toast_info.png';
var ErrorImage   = MHPluginSDK.basePath +'NewImage/Toast_error.png';

class MessageToast extends React.Component{
  constructor(props) {
    super(props);

    var defaultTimer= (this.props.defaultTimer)?(this.props.defaultTimer):(1200);
    var loadingTimer= (this.props.loadingTimer)?(this.props.loadingTimer):(10000);
    this.state={
      isShowMessage:false,                /*是否显示弹窗*/
      toastType:TostType.Message,         /*弹窗类型*/
      showMessage:undefined,              /*消息内容*/
      defaultTimer:defaultTimer,          /*默认弹窗显示时间*/
      loadingTimer:loadingTimer,          /*默认loading显示时间*/
    };
  }

  render(){

      return(
        <Modal 
        animationType="slide"
        visible={this.state.isShowMessage}
        transparent={true}
        onRequestClose={()=>this.setState({modalVisible:false})} >
            <View style={styles.containerAll} >
                  {this.show_Content(this.state.toastType)}
            </View>
        </Modal>
      );
  }


  show_Content(toastType){

    if(toastType==TostType.Loading){
      return (
      <View style={styles.LoadingView} >
        <View style={styles.MessageContentView}>
              <ActivityIndicatorIOS size="large" color='white' />
              <Text style={styles.MessageText}>loading.....</Text>
        </View>
      </View>
      );
    }
    else if(toastType==TostType.Success){
      
      return (
        <View style={styles.SuccessView} >
          <View style={styles.MessageContentView}>
             <Image style={[{width: 35, height: 35}]}
             source={{isStatic:!MHPluginSDK.devMode, uri:SuccessImage}}/>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
    else if(toastType==TostType.Fail){

      return (
        <View style={styles.ErrorView} >
          <View style={styles.MessageContentView}>
             <Image style={[{width: 20, height: 20}]}
             source={{isStatic:!MHPluginSDK.devMode, uri:ErrorImage}}/>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
    else{

      return (
        <View style={styles.MessageView} >
          <View style={styles.MessageContentView}>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
  }
  
  /* 显示loading 效果弹窗 */
  showLoading(message,timer){

    if(typeof(timer)=='string'){ timer = parseInt(timer);}
    if(timer ==undefined){ timer = this.state.loadingTimer;}
    this.loading_TostWithTimer(message,TostType.Loading,timer);
  }

  /* 显示成功弹窗 */
  showSuccess(message){

    this.showMessage(message,TostType.Success);
  }
  
  /* 显示失败弹窗 */
  showFail(message){

    this.showMessage(message,TostType.Fail);
  }

  /* 显示不带图片的弹窗 */
  showMessage(message,type){

    if((message ==undefined) ||(message ==null)){ return;}
    if(message.length<6){ /* 过短-加宽处理*/
      message = '   '+message+'   ';
    }
    this.default_ToastWithTimer(message,type);
  }

  /* 销毁显示的Toast*/
  disMiss(){

    this.setState({showMessage:null,isShowMessage:false,toastTimer:TostType.Message})
  }

  /* ---------------------------------------------------------------------------------*/


  default_ToastWithTimer(message,type,showTimer){
    
    var self = this;
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:message,isShowMessage:true,toastType:type})
      },
      0
    );
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:'',isShowMessage:false,toastType:TostType.Message})
      },
      this.state.defaultTimer
    );
  }

  loading_TostWithTimer(message,type,showTimer){

    var self = this;
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:message,isShowMessage:true,toastType:type})
      },
      0
    );
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:'',isShowMessage:false,toastType:TostType.Message})
      },
      showTimer
    );
  }

}

var styles = StyleSheet.create({

  containerAll:{
    flex:1,
    flexDirection:'column',
    width:screenWidth,
    height:screenHeight,
  },
  LoadingView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  SuccessView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  ErrorView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  MessageView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(2/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  MessageContentView:{
    alignItems:'center',
    alignSelf:'center',
    padding:10,
    backgroundColor:'#25292e',
    borderRadius:3,    
  },
  MessageText:{
    color:'#ffffff',
    textAlign:'center',
    fontSize:15,
    marginTop:5,
  },
});

module.exports = MessageToast;

var React = require('react-native');
var {
  Component,
  StyleSheet,
  Dimensions,
  View,
  Text,
  Modal,
  Image,
  ActivityIndicatorIOS,
} = React;

var screenWidth = Dimensions.get('window').width;
var screenHeight = Dimensions.get('window').height;
var MHPluginSDK = require('NativeModules').MHPluginSDK;

var TostType = {Success:0,Fail:1,Message:2,Loading:3};

var SuccessImage = MHPluginSDK.basePath +'NewImage/Toast_success.png';
var InfoImage    = MHPluginSDK.basePath +'NewImage/Toast_info.png';
var ErrorImage   = MHPluginSDK.basePath +'NewImage/Toast_error.png';

class MessageToast extends React.Component{
  constructor(props) {
    super(props);

    var defaultTimer= (this.props.defaultTimer)?(this.props.defaultTimer):(1200);
    var loadingTimer= (this.props.loadingTimer)?(this.props.loadingTimer):(10000);
    this.state={
      isShowMessage:false,                /*是否显示弹窗*/
      toastType:TostType.Message,         /*弹窗类型*/
      showMessage:undefined,              /*消息内容*/
      defaultTimer:defaultTimer,          /*默认弹窗显示时间*/
      loadingTimer:loadingTimer,          /*默认loading显示时间*/
    };
  }

  render(){

      return(
        <Modal 
        animationType="slide"
        visible={this.state.isShowMessage}
        transparent={true}
        onRequestClose={()=>this.setState({modalVisible:false})} >
            <View style={styles.containerAll} >
                  {this.show_Content(this.state.toastType)}
            </View>
        </Modal>
      );
  }


  show_Content(toastType){

    if(toastType==TostType.Loading){
      return (
      <View style={styles.LoadingView} >
        <View style={styles.MessageContentView}>
              <ActivityIndicatorIOS size="large" color='white' />
              <Text style={styles.MessageText}>loading.....</Text>
        </View>
      </View>
      );
    }
    else if(toastType==TostType.Success){
      
      return (
        <View style={styles.SuccessView} >
          <View style={styles.MessageContentView}>
             <Image style={[{width: 35, height: 35}]}
             source={{isStatic:!MHPluginSDK.devMode, uri:SuccessImage}}/>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
    else if(toastType==TostType.Fail){

      return (
        <View style={styles.ErrorView} >
          <View style={styles.MessageContentView}>
             <Image style={[{width: 20, height: 20}]}
             source={{isStatic:!MHPluginSDK.devMode, uri:ErrorImage}}/>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
    else{

      return (
        <View style={styles.MessageView} >
          <View style={styles.MessageContentView}>
              <Text style={styles.MessageText}>{this.state.showMessage}</Text>
          </View>
        </View>
        );
    }
  }
  
  /* 显示loading 效果弹窗 */
  showLoading(message,timer){

    if(typeof(timer)=='string'){ timer = parseInt(timer);}
    if(timer ==undefined){ timer = this.state.loadingTimer;}
    this.loading_TostWithTimer(message,TostType.Loading,timer);
  }

  /* 显示成功弹窗 */
  showSuccess(message){

    this.showMessage(message,TostType.Success);
  }
  
  /* 显示失败弹窗 */
  showFail(message){

    this.showMessage(message,TostType.Fail);
  }

  /* 显示不带图片的弹窗 */
  showMessage(message,type){

    if((message ==undefined) ||(message ==null)){ return;}
    if(message.length<6){ /* 过短-加宽处理*/
      message = '   '+message+'   ';
    }
    this.default_ToastWithTimer(message,type);
  }

  /* 销毁显示的Toast*/
  disMiss(){

    this.setState({showMessage:null,isShowMessage:false,toastTimer:TostType.Message})
  }

  /* ---------------------------------------------------------------------------------*/


  default_ToastWithTimer(message,type,showTimer){
    
    var self = this;
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:message,isShowMessage:true,toastType:type})
      },
      0
    );
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:'',isShowMessage:false,toastType:TostType.Message})
      },
      this.state.defaultTimer
    );
  }

  loading_TostWithTimer(message,type,showTimer){

    var self = this;
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:message,isShowMessage:true,toastType:type})
      },
      0
    );
    this.toastTimer =  setTimeout(
      () =>  {
        self.setState({showMessage:'',isShowMessage:false,toastType:TostType.Message})
      },
      showTimer
    );
  }

}

var styles = StyleSheet.create({

  containerAll:{
    flex:1,
    flexDirection:'column',
    width:screenWidth,
    height:screenHeight,
  },
  LoadingView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  SuccessView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  ErrorView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(1/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  MessageView:{
    width:screenWidth,
    height:screenHeight/3,
    marginTop:screenHeight*(2/3),
    marginBottom:0,
    justifyContent:'center',
    alignItems:'center',
    alignSelf:'center',
  },
  MessageContentView:{
    alignItems:'center',
    alignSelf:'center',
    padding:10,
    backgroundColor:'#25292e',
    borderRadius:3,    
  },
  MessageText:{
    color:'#ffffff',
    textAlign:'center',
    fontSize:15,
    marginTop:5,
  },
});

module.exports = MessageToast;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容