李跃崑 發表於 2019-6-16 15:04:00

[RN] React Native 获取验证码 按钮

<p>&nbsp;React Native 获取验证码 按钮</p>
<p>&nbsp;</p>
<p>效果如图:</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1653347/201906/1653347-20190618175902552-1809252360.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/1653347/201906/1653347-20190618175908245-1584969583.png" alt=""></p>
<p>&nbsp;</p>
<p>实现方法:</p>
<p>一、获取验证码 按钮组件 封装</p>
<pre>CountDownButton.js</pre>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">use strict</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

import React </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import PropTypes </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">prop-types</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

import {
    View,
    Text,
    TouchableOpacity,
    ViewPropTypes, StyleSheet
} </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-native</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">const</span> defaultShowText = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">获取验证码</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> CountDownButton extends React.Component {
    constructor(props) {
      super(props);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
            timerCount: </span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.timerCount || <span style="color: rgba(128, 0, 128, 1)">60</span><span style="color: rgba(0, 0, 0, 1)">,
            timerTitle: </span><span style="color: rgba(0, 0, 255, 1)">this</span>.props.timerTitle ||<span style="color: rgba(0, 0, 0, 1)"> defaultShowText,
            counting: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
            selfEnable: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
      };
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>._shouldStartCount = <span style="color: rgba(0, 0, 255, 1)">this</span>._shouldStartCount.bind(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>._countDownAction = <span style="color: rgba(0, 0, 255, 1)">this</span>._countDownAction.bind(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">static</span> propTypes =<span style="color: rgba(0, 0, 0, 1)"> {
      style: ViewPropTypes.style,
      textStyle: Text.propTypes.style,
      onClick: PropTypes.func,
      disableColor: PropTypes.</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">,
      timerTitle: PropTypes.</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">,
      enable: PropTypes.oneOfType(),
      timerEnd: PropTypes.func,
      timerActiveTitle: PropTypes.array,
      executeFunc: PropTypes.func
    };

    _countDownAction() {
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> codeTime = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.timerCount;
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> {timerActiveTitle, timerTitle} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> now =<span style="color: rgba(0, 0, 0, 1)"> Date.now();
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> overTimeStamp = now + codeTime * <span style="color: rgba(128, 0, 128, 1)">1000</span> + <span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">过期时间戳(毫秒) +100 毫秒容错</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.interval = setInterval(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">const</span> nowStamp =<span style="color: rgba(0, 0, 0, 1)"> Date.now();
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (nowStamp &gt;=<span style="color: rgba(0, 0, 0, 1)"> overTimeStamp) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.interval &amp;&amp; clearInterval(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.interval);
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
                  timerCount: codeTime,
                  timerTitle: timerTitle </span>||<span style="color: rgba(0, 0, 0, 1)"> defaultShowText,
                  counting: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                  selfEnable: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
                });
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.timerEnd) {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.timerEnd()
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">const</span> leftTime = parseInt((overTimeStamp - nowStamp) / <span style="color: rgba(128, 0, 128, 1)">1000</span>, <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">);
                let activeTitle </span>=<span style="color: rgba(0, 0, 0, 1)"> `重新获取(${leftTime}s)`;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (timerActiveTitle) {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (timerActiveTitle.length &gt; <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
                        activeTitle </span>= timerActiveTitle[<span style="color: rgba(128, 0, 128, 1)">0</span>] + leftTime + timerActiveTitle[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]
                  } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (timerActiveTitle.length &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
                        activeTitle </span>= timerActiveTitle[<span style="color: rgba(128, 0, 128, 1)">0</span>] +<span style="color: rgba(0, 0, 0, 1)"> leftTime
                  }
                }
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
                  timerCount: leftTime,
                  timerTitle: activeTitle,
                })
            }
      }, </span><span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">)
    }

    _shouldStartCount(shouldStart) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.counting) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (shouldStart) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._countDownAction();
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({counting: <span style="color: rgba(0, 0, 255, 1)">true</span>, selfEnable: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">})
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({selfEnable: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">})
      }
    }

    componentDidMount() {
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> {executeFunc} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
      executeFunc </span>&amp;&amp; executeFunc(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._shouldStartCount);
    }

    componentWillUnmount() {
      clearInterval(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.interval)
    }

    render() {
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> {onClick, style, textStyle, enable, disableColor} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> {counting, timerTitle, selfEnable} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;View style={[{width: <span style="color: rgba(128, 0, 128, 1)">90</span>, height: <span style="color: rgba(128, 0, 128, 1)">34</span>}, style]}&gt;
                &lt;<span style="color: rgba(0, 0, 0, 1)">TouchableOpacity
                  activeOpacity</span>={counting ? <span style="color: rgba(128, 0, 128, 1)">1</span> : <span style="color: rgba(128, 0, 128, 1)">0.8</span><span style="color: rgba(0, 0, 0, 1)">}
                  onPress</span>={() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!counting &amp;&amp; enable &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> selfEnable) {

                            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({selfEnable: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">});
                            onClick(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._shouldStartCount)
                        }
                  }}
                  style</span>=<span style="color: rgba(0, 0, 0, 1)">{[styles.container,
                        {backgroundColor: ((</span>!counting &amp;&amp; enable &amp;&amp; selfEnable) ? <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">red</span><span style="color: rgba(128, 0, 0, 1)">'</span> : disableColor || <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#ccc</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)}
                  ]}
                </span>&gt;
                  &lt;<span style="color: rgba(0, 0, 0, 1)">Text
                        style</span>=<span style="color: rgba(0, 0, 0, 1)">{[
                            styles.defaultText,
                            textStyle,
                        ]}</span>&gt;{timerTitle}&lt;/Text&gt;
                &lt;/TouchableOpacity&gt;
            &lt;/View&gt;<span style="color: rgba(0, 0, 0, 1)">
      )
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">const</span> styles =<span style="color: rgba(0, 0, 0, 1)"> StyleSheet.create({
    container: {
      flex: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">,
      justifyContent: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">center</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      alignItems: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">center</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      borderWidth: </span><span style="color: rgba(128, 0, 128, 1)">0.5</span><span style="color: rgba(0, 0, 0, 1)">,
      borderRadius: </span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">,
      borderColor: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">white</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    },
    defaultText: {
      fontSize: </span><span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">,
      color: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">white</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    }
});</span></pre>
</div>
<p>&nbsp;</p>
<p>使用:</p>
<div class="cnblogs_code">
<pre>import React, {Component} <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
import {StyleSheet, View,} </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-native</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import CountDownButton </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./CountDownButton</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> TestButton extends Component {
    constructor(props) {
      super(props);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {}
    }

    render() {

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;View style={{flex: <span style="color: rgba(128, 0, 128, 1)">1</span>}}&gt;

                &lt;CountDownButton enable={<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">}
                                 timerCount</span>={<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">}
                                 onClick</span>={(_shouldStartCount) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                                     _shouldStartCount(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
                                 }}</span>/&gt;

            &lt;/View&gt;<span style="color: rgba(0, 0, 0, 1)">
      );

    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>本博客地址: wukong1688</p>
<p>本文原文地址:https://www.cnblogs.com/wukong1688/p/11031600.html</p>
<p>转载请著名出处!谢谢~~</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/wukong1688/p/11031600.html
頁: [1]
查看完整版本: [RN] React Native 获取验证码 按钮