react-native,純數字鍵盤組件;

示例代碼:
/**
*react

  • @auther:wujh
  • @數字鍵盤組件

*/react-native

import React, { Component } from 'react';
import { StyleSheet, Text, View, Modal, Dimensions } from 'react-native';
import { Grid, Icon } from '@ant-design/react-native';ide

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
}
}flex

componentDidMount() {
this.defaultHideDom();
}this

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>);
}
}spa

defaultHideDom() {
this.setState({
hideBg: Array.from(new Array(6)).map((_val, i) => ({
text: <View style={styles.showPW} key={i}></View>,
}))
})
}component

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);
})
}
}get

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();
}}animation

<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>
);
}

}it

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
},
});

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

<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) }}
/>

代碼比較簡單,有這方面需求的小夥伴能夠copy隨時使用;

相關文章
相關標籤/搜索