所需依賴原生react-native和ant-design RN;javascript
代碼比較簡單,有這方面需求的小夥伴能夠copy隨時使用;java
能夠根據本身實際業務場景做修改react
<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 }, });