zoukankan      html  css  js  c++  java
  • React Native之倒计时组件的实现(ios android)

    React Native之倒计时组件的实现(ios android)

    一,需求分析

         1,app需实现类似于淘宝的活动倒计时,并在倒计时结束时,活动也结束。

         2,实现订单倒计时,并在倒计时结束时,订单关闭交易。

         3,实现获取验证码倒计时。

    二,技术实现

          2.1,活动倒计时与订单倒计时的实现,源码如下:

     1 componentDidMount() {
     2         this.interval = setInterval(() => {
     3             const date = this.getDateData(this.props.date);
     4             if (date) {
     5                 this.setState(date);
     6             } else {
     7                 this.stop();
     8                 this.props.onEnd();
     9             }
    10         }, 1000);
    11     }
    12     componentWillMount() {
    13         const date = this.getDateData(this.props.date);
    14         if (date) {
    15             this.setState(date);
    16         }
    17     }

         1,倒计时方法的实现:

     1  getDateData(endDate) {
     2         endDate = endDate.replace(/-/g, "/");
     3         let diff = (Date.parse(new Date(endDate)) - Date.parse(new Date)) / 1000;
     4         if (!!this.props.isOrederTime) {
     5             diff = (Date.parse(new Date(endDate)) + (Number(this.props.isOrederTime) * 60 * 1000) - Date.parse(new Date)) / 1000;
     6         }
     7 
     8         if (diff <= 0) {
     9             return false;
    10         }
    11         const timeLeft = {
    12             years: 0,
    13             days: 0,
    14             hours: 0,
    15             min: 0,
    16             sec: 0,
    17             millisec: 0,
    18         };
    19 
    20         if (diff >= (365.25 * 86400)) {
    21             timeLeft.years = Math.floor(diff / (365.25 * 86400));
    22             diff -= timeLeft.years * 365.25 * 86400;
    23         }
    24         if (diff >= 86400) {
    25             timeLeft.days = Math.floor(diff / 86400);
    26             diff -= timeLeft.days * 86400;
    27         }
    28         if (diff >= 3600) {
    29             timeLeft.hours = Math.floor(diff / 3600);
    30             diff -= timeLeft.hours * 3600;
    31         }
    32         if (diff >= 60) {
    33             timeLeft.min = Math.floor(diff / 60);
    34             diff -= timeLeft.min * 60;
    35         }
    36         timeLeft.sec = diff;
    37         return timeLeft;
    38     }

         2,退出界面,清除定时器

    1  componentWillUnmount() {
    2         this.stop();
    3     }
    4 
    5  stop() {
    6         clearInterval(this.interval);
    7     }

        3,数字不足时前面补0

     1  // 数字前面补0
     2     leadingZeros(num, length = null) {
     3         let length_ = length;
     4         let num_ = num;
     5         if (length_ === null) {
     6             length_ = 2;
     7         }
     8         num_ = String(num_);
     9         while (num_.length < length_) {
    10             num_ = '0' + num_;
    11         }
    12         return num_;
    13     }

     2.2,验证码倒计时与输入框

        1,倒计时的实现(I18n 语言国际化),Api.sendVerifyCode调用后台发送验证码接口

     1  //倒计时
     2     daoJClick() {
     3         //判断是否点击获取验证码
     4         if(this.props.isClick){
     5             this.props.isClick()
     6         }
     7       
     8         if (this.props.mobile === '') {
     9             Toast.show(I18n.t('Signin.Please_enter_phone_number'));
    10             return;
    11         }
    12         if (!(/^1[345678]d{9}$/.test(this.props.mobile))) {
    13             Toast.show(I18n.t('Signin.pla_rightphoneNumber'));
    14             return
    15         }
    16         if(this.state.isDisable){
    17             return
    18         }
    19         Api.sendVerifyCode(this.props.mobile)
    20             .then((data) => {
    21                 Toast.show(I18n.t('Signin.Verification_code_transmission_success'))
    22                
    23             }).catch((e) => {
    24         });
    25         this.setState({
    26             isDisable: false,
    27         });
    28         const codeTime = this.state.timerCount -1;
    29         const now = Date.now();
    30         const overTimeStamp = now + codeTime * 1000 + 100;
    31         /*过期时间戳(毫秒) +100 毫秒容错*/
    32         this.interval = setInterval(() => {
    33             /* 切换到后台不受影响*/
    34             const nowStamp = Date.now();
    35             if (nowStamp >= overTimeStamp) {
    36                 /* 倒计时结束*/
    37                 this.interval && clearInterval(this.interval);
    38                 this.setState({
    39                     timerCount: codeTime,
    40                     timerTitle: I18n.t('Signin.Get_verifying_code'),
    41                     isDisable: false,
    42                 });
    43             } else {
    44                 const leftTime = parseInt((overTimeStamp - nowStamp) / 1000, 10);
    45                 this.setState({
    46                     timerCount: leftTime,
    47                     timerTitle: `(${leftTime})s`,
    48                     isDisable: true,
    49                 });
    50             }
    51             /* 切换到后台 timer 停止计时 */
    52         }, 1000)
    53     }

        2,界面功能实现

     1  <InputView
     2                 {...this.props}
     3                 returnKeyLabel={this.props.returnKeyLabel}
     4                 returnKeyType={this.props.returnKeyType}
     5                 align={this.props.align}
     6                 value={this.props.pin}
     7                 name={this.props.name}
     8                 hintText={this.props.hintText}
     9                 funcDisabled={this.state.isDisable}
    10                 onChangeText={this.props.onChangeText}
    11                 funcName={this.state.timerTitle}
    12                 funcOnPress={() => this.daoJClick()}/>
    13         );

    三,应用实例

        3.1 活动与订单倒计时应用

     1 import CountDown from "../CountDown"; 
     2 <CountDown
     3                                 date={endtime}
     4                                 days={{ plural: '天 ', singular: '天 ' }}
     5                                 onEnd={() => {
     6                                     this.setState({
     7                                         isEnd: true
     8                                     })
     9                                 }}
    10                                 textColor={AppSetting.BLACK}
    11                                 isHaveword={true}//是否有汉字
    12                                 backgroundColor={'red'}
    13 isOrederTime={AppSetting.OREDER_END_TIME}//是否是订单
    14                                 textSize={AdaptationModel.setSpText(Platform.OS === 'ios' ? 18 : 20)}
    15                             />

       界面效果

           

    3.2 验证码倒计时

     1 import VeriCodeInput from "/VeriCodeInput";
     2 
     3  <VeriCodeInput
     4                                 style={styles.input}
     5                                 inputStyle={{ color: 'white' }}
     6                                 align={'center'}
     7                                 value={this.state.captcha}
     8                                 mobile={this.state.mobile}
     9                                 backgroundColor={'transparent'}
    10                                 funcNameStyle={{ color: AppSetting.GREEN }}
    11                                 hintText={I18n.t('Signin.Please_enter_verification_code')}
    12                                 isClick={() => { this.isinputverification() }}
    13                                 onChangeText={(text) => this.setState({ captcha: text })} />

    界面效果

      

  • 相关阅读:
    操作文件和目录【TLCL】
    nginx location正则写法
    elasticsearch分词器ik
    mongodb权限管理
    kafka调试遇到的问题
    mysql 安装
    jenkins 安装 + maven + git部署
    FTP服务搭建
    根据终端类型返回不同的访问内容
    上传jar包至nexus
  • 原文地址:https://www.cnblogs.com/jackson-yqj/p/9603257.html
Copyright © 2011-2022 走看看