[RN] React Native 获取验证码 按钮
<p> React Native 获取验证码 按钮</p><p> </p>
<p>效果如图:</p>
<p> <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> </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(() =><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 >=<span style="color: rgba(0, 0, 0, 1)"> overTimeStamp) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.interval && 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 > <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 > <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>&& 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><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]}>
<<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>={() =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!counting && enable &&<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 && enable && 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>>
<<span style="color: rgba(0, 0, 0, 1)">Text
style</span>=<span style="color: rgba(0, 0, 0, 1)">{[
styles.defaultText,
textStyle,
]}</span>>{timerTitle}</Text>
</TouchableOpacity>
</View><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> </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><View style={{flex: <span style="color: rgba(128, 0, 128, 1)">1</span>}}>
<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) =><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>/>
</View><span style="color: rgba(0, 0, 0, 1)">
);
}
}</span></pre>
</div>
<p> </p>
<p>本博客地址: wukong1688</p>
<p>本文原文地址:https://www.cnblogs.com/wukong1688/p/11031600.html</p>
<p>转载请著名出处!谢谢~~</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/wukong1688/p/11031600.html
頁:
[1]