zoukankan      html  css  js  c++  java
  • [RN] React Native 获取验证码 按钮

     React Native 获取验证码 按钮

    效果如图:

     

    实现方法:

    一、获取验证码 按钮组件 封装

    CountDownButton.js
    "use strict";
    
    import React from 'react';
    import PropTypes from 'prop-types';
    
    import {
        View,
        Text,
        TouchableOpacity,
        ViewPropTypes, StyleSheet
    } from 'react-native';
    
    const defaultShowText = '获取验证码';
    export default class CountDownButton extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                timerCount: this.props.timerCount || 60,
                timerTitle: this.props.timerTitle || defaultShowText,
                counting: false,
                selfEnable: true,
            };
            this._shouldStartCount = this._shouldStartCount.bind(this);
            this._countDownAction = this._countDownAction.bind(this);
        }
    
        static propTypes = {
            style: ViewPropTypes.style,
            textStyle: Text.propTypes.style,
            onClick: PropTypes.func,
            disableColor: PropTypes.string,
            timerTitle: PropTypes.string,
            enable: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
            timerEnd: PropTypes.func,
            timerActiveTitle: PropTypes.array,
            executeFunc: PropTypes.func
        };
    
        _countDownAction() {
            const codeTime = this.state.timerCount;
            const {timerActiveTitle, timerTitle} = this.props;
            const now = Date.now();
            const overTimeStamp = now + codeTime * 1000 + 100;
            /*过期时间戳(毫秒) +100 毫秒容错*/
            this.interval = setInterval(() => {
                const nowStamp = Date.now();
                if (nowStamp >= overTimeStamp) {
                    this.interval && clearInterval(this.interval);
                    this.setState({
                        timerCount: codeTime,
                        timerTitle: timerTitle || defaultShowText,
                        counting: false,
                        selfEnable: true
                    });
                    if (this.props.timerEnd) {
                        this.props.timerEnd()
                    }
                } else {
                    const leftTime = parseInt((overTimeStamp - nowStamp) / 1000, 10);
                    let activeTitle = `重新获取(${leftTime}s)`;
                    if (timerActiveTitle) {
                        if (timerActiveTitle.length > 1) {
                            activeTitle = timerActiveTitle[0] + leftTime + timerActiveTitle[1]
                        } else if (timerActiveTitle.length > 0) {
                            activeTitle = timerActiveTitle[0] + leftTime
                        }
                    }
                    this.setState({
                        timerCount: leftTime,
                        timerTitle: activeTitle,
                    })
                }
            }, 1000)
        }
    
        _shouldStartCount(shouldStart) {
            if (this.state.counting) {
                return
            }
            if (shouldStart) {
                this._countDownAction();
                this.setState({counting: true, selfEnable: false})
            } else {
                this.setState({selfEnable: true})
            }
        }
    
        componentDidMount() {
            const {executeFunc} = this.props;
            executeFunc && executeFunc(this._shouldStartCount);
        }
    
        componentWillUnmount() {
            clearInterval(this.interval)
        }
    
        render() {
            const {onClick, style, textStyle, enable, disableColor} = this.props;
            const {counting, timerTitle, selfEnable} = this.state;
            return (
                <View style={[{ 90, height: 34}, style]}>
                    <TouchableOpacity
                        activeOpacity={counting ? 1 : 0.8}
                        onPress={() => {
                            if (!counting && enable && selfEnable) {
    
                                this.setState({selfEnable: false});
                                onClick(this._shouldStartCount)
                            }
                        }}
                        style={[styles.container,
                            {backgroundColor: ((!counting && enable && selfEnable) ? 'red' : disableColor || '#ccc')}
                        ]}
                    >
                        <Text
                            style={[
                                styles.defaultText,
                                textStyle,
                            ]}>{timerTitle}</Text>
                    </TouchableOpacity>
                </View>
            )
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            flex: 1,
            justifyContent: 'center',
            alignItems: 'center',
            borderWidth: 0.5,
            borderRadius: 5,
            borderColor: "white",
        },
        defaultText: {
            fontSize: 14,
            color: "white",
        }
    });

    使用:

    import React, {Component} from "react";
    import {StyleSheet, View,} from 'react-native';
    import CountDownButton from './CountDownButton';
    
    export default class TestButton extends Component {
        constructor(props) {
            super(props);
            this.state = {}
        }
    
        render() {
    
            return (
                <View style={{flex: 1}}>
    
                    <CountDownButton enable={true}
                                     timerCount={10}
                                     onClick={(_shouldStartCount) => {
                                         _shouldStartCount(true)
                                     }}/>
    
                </View>
            );
    
        }
    }

    本博客地址: wukong1688

    本文原文地址:https://www.cnblogs.com/wukong1688/p/11031600.html

    转载请著名出处!谢谢~~

  • 相关阅读:
    MySQL数据库----数据类型
    MySQL数据库----安装
    I2c串行总线组成及其工作原理
    感慨
    液晶操作
    串口通信
    9.19AD和DA操作
    9.19键盘的应用
    9.17键盘的操作
    9.15学习笔记
  • 原文地址:https://www.cnblogs.com/wukong1688/p/11031600.html
Copyright © 2011-2022 走看看