react-native 安全数字键盘

砾漠析取
• 阅读 2462

react-native,安全 纯数字键盘组件;

所需依赖原生react-native和ant-design RN;

代码比较简单,有这方面需求的小伙伴可以copy随时使用;

可以根据自己实际业务场景作修改

使用

    <Keyboard
        type='deal'//verify,deal 
        title={'請輸入交易密碼'}
        keyboardVisible={this.state.keyboardVisible}
        toClose={this.onKeyboard}
        getPasswordstr={(str) => { console.log(str) }}
        getPasswordArr={(arr) => { console.log(arr) }}
        forgot={() => { console.log(1111) }}
    />

源码

    import React, { Component } from 'react';
    import { StyleSheet, Text, View, Modal, Dimensions } from 'react-native';
    import { Grid, Icon } from '@ant-design/react-native';
    
    
    let width = Dimensions.get('window').width;//获取设备的宽高
    let height = Dimensions.get('window').height;
    let i = 0;
    export default class Keyboard extends Component {
        static navigationOptions = {
            header: null
        }
        constructor(props) {
            super(props);
            this.state = {
                keyData: [],
                hideBg: [],
                currentIndex: undefined
            }
        }

    componentDidMount() {
        this.defaultHideDom();
    }


    configItemEl(_el, index) {
        const { currentIndex } = this.state;
        if (index <= 8) {
            return (<Text style={currentIndex === index ? styles.active : null}>{index + 1}</Text>);
        }
        if (index === 9) {
            return (<Text style={{ width: width / 3, height: 50, backgroundColor: '#CCC' }}></Text>);
        }
        if (index === 10) {
            return (<Text style={currentIndex === index ? styles.active : null}>0</Text>);
        }
        if (index === 11) {
            return (<Text style={{ color: '#0080FF', width: width / 3, height: 50, backgroundColor: '#CCC', textAlign: 'center', lineHeight: 50 }}>DELETE</Text>);
        }
    }



    defaultHideDom() {
        this.setState({
            hideBg: Array.from(new Array(6)).map((_val, i) => ({
                text: <View style={styles.showPW} key={i}></View>,
            }))
        })
    }
onKeyClick(index, i) {
        const getPasswordstr = this.props.getPasswordstr;
        const getPasswordArr = this.props.getPasswordArr;
        if (index !== 12 && index !== 10 && this.state.keyData.length < 6) {
            this.setState({
                keyData: [...this.state.keyData, index === 11 ? 0 : index],
                hideBg: this.state.hideBg.map((item, indexKey) => {
                    if (indexKey === i - 1) {
                        item.text = (<View style={styles.showPW}>
                            <Text style={styles.passWorld}></Text>
                        </View>)
                    }
                    return item
                })
            }, () => {
                if (i === 6) {
                    getPasswordstr(this.state.keyData.join(''));
                }
                getPasswordArr(this.state.keyData);
            });
        }
        if (index === 12 && this.state.keyData.length >= 0) {
            const arr = this.state.keyData.filter((item, indexKey) => i !== indexKey)
            this.setState({
                keyData: arr,
                hideBg: this.state.hideBg.map((item, indexKey) => {
                    if (indexKey === i) {
                        item.text = (<View style={styles.showPW}></View>)
                    }
                    return item
                })
            }, () => {
                getPasswordstr(this.state.keyData.join(''));
                getPasswordArr(this.state.keyData);
            })
        }
    }
render() {
        const visible = this.props.keyboardVisible;
        const type = this.props.type;
        const title = this.props.title;
        const toClose = this.props.toClose;
        const forgot = this.props.forgot;
        const { hideBg } = this.state;
        return (
            <Modal
                visible={visible}
                animationType="slide"
                transparent={true}
                onRequestClose={() => {
                    i = 0;
                    this.defaultHideDom();
                    this.setState({ keyData: [] });
                    return toClose();
                }}
            >
                <View style={styles.container}>
                    <View style={styles.header}>
                        <Text onPress={() => {
                            i = 0;
                            this.defaultHideDom();
                            this.setState({ keyData: [] });
                            toClose()
                        }} style={styles.iconContainer}><Icon name='close' /></Text>
                        <Text>{title}</Text>
                        <Text style={styles.forgot} onPress={() => { forgot() }}>忘記密碼</Text>
                    </View>
                    {type === 'deal' && (<Grid
                        data={hideBg}
                        columnNum={6}
                        hasLine={false}
                        itemStyle={{
                            justifyContent: 'center',
                            alignItems: 'center',
                            flex: 1,
                            height: 80,
                            backgroundColor: '#FFF',
                        }}
                        renderItem={(_el, index) => _el.text}
                    />)}
<Grid
                        data={[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]}
                        columnNum={3}
                        onPress={(_el, index) => {
                            this.setState({ currentIndex: index }, () => {
                                setTimeout(() => { this.setState({ currentIndex: undefined }) }, 10)
                            });
                            if (_el !== 12 && _el !== 10 && i < 6) {
                                i++
                            }
                            if (_el === 12 && i > 0) {
                                i--
                            }
                            this.onKeyClick(_el, i)
                        }}
                        itemStyle={{
                            justifyContent: 'center',
                            alignItems: 'center',
                            flex: 1,
                            height: 50,
                            backgroundColor: '#FFF'
                        }}
                        renderItem={(_el, index) =>
                            this.configItemEl(_el, index)
                        }
                    />
                </View>
            </Modal>
        );
    }

}
const styles = StyleSheet.create({
    active: {
        width: width / 3,
        height: 50,
        backgroundColor: '#0080FF',
        color: '#FFF',
        textAlign: 'center',
        lineHeight: 50
    },
    forgot: {
        marginRight: 10,
        color: '#0080FF',
        fontSize: 12,
        fontWeight: null
    },
    passWorld: {
        borderRadius: 10,
        width: 10,
        height: 10,
        backgroundColor: '#ccc'
    },
    showPW: {
        justifyContent: 'center',
        alignItems: 'center',
        borderColor: '#CCC',
        borderWidth: 1,
        borderStyle: 'solid',
        width: 25,
        height: 25
    },
    iconContainer: {
        width: 25,
        height: 25,
        marginLeft: 10
    },
    header: {
        width: width,
        height: 45,
        flexWrap: 'nowrap',
        justifyContent: 'space-between',
        alignItems: 'center',
        backgroundColor: '#FFF',
        flexDirection: 'row',
        alignContent: 'space-around',
        borderBottomWidth: 1,
        borderStyle: 'solid',
        borderBottomColor: '#EAEAEA'
    },
    container: {
        width: width,
        height: height,
        justifyContent: 'flex-end',
        alignItems: 'flex-end',
        backgroundColor: 'rgba(0,0,0,0.4)',
        position: 'absolute',
        top: -25
    },
});
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
九路 九路
4年前
如何在React Native和Expo中掩盖Text和TextInput组件
在本文中,我将向您展示如何在ReactNative和Expo中使用自定义蒙版,可用于iOS,Android和Web!我们将使用一个名为库,这是一个没有本机代码的完整javascript库,然后您可以在ReactNative环境的所有CLI中使用。(https://res.cloudinary.com/practicaldev/image/fetch/s
Stella981 Stella981
3年前
C#字节取高低位以及byte和string的转换
bytea0xF9;stringhighConvert.ToString((a&0xf0)4);//这里的位操作数以及位移的数目可以根据自己的需要修改stringlowConvert.ToString(a&0x0f);//这里的位操作数以及位移的数目可以根据自己的需要修改 byte和
Stella981 Stella981
3年前
ReactNative自定义车牌号输入框及键盘实现
项目背景目前使用ReactNative技术重构公司的原生Android应用,很多场景是和公司的需求密切相关的,开发中也遇到不少问题。比如项目中使用的即时聊天解决方案是采用融云,推送采用的是个推方案。原生方面有融云提供的一整套解决方案,包括功能和UI,相对来说,只要进行集成就能轻松添加功能,但对于跨平台方案就需要自定义uI了,我的另一篇推文中也
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
React Native第三方组件和示例链接
以下是ReactNative的链接,有需要第三方组件或者示例的小伙伴可以收藏一下01、ReactNative之TabView:https://js.coach/reactnative/reactnativetabview02、ReactNative之正在加载Loading条:https://js.coach/reactnative/
Wesley13 Wesley13
3年前
RN这个神操作,客官了解一下
在reactnative中我们可以通过setNativeProps直接改动组件并触发局部刷新,不用使用props或state.对此,官方的说明以及使用场景:什么时候使用setNativeProps呢?在(不得不)频繁刷新而又遇到了性能瓶颈的时候。直接操作组件并不是应该经常使用的工具。一般来说只是用来创建连续的动画,同时避免渲染组件结构和同步
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用