React Native 版本执行0.57的规则
import React, { Component } from 'react';
import { StyleSheet, Text, View, TextInput, ScrollView, KeyboardAvoidingView, Image, TouchableOpacity, StatusBar } from 'react-native';
import LinearGradient from 'react-native-linear-gradient'; //按钮渐变
import CountDownButton from 'react-native-smscode-count-down';// 倒计时
import { regExp } from "../../network/RegExp";
import { global } from '../../utils/Global';
import { requestUrl } from '../../network/Url';// 请求url
import Fetch from '../../network/Fetch';
import Loading from '../../components/Loading';
import Nav from '../../components/Nav';
import * as Public from '../../utils/Public'
export default class ReplaceTel extends Component {
constructor(props) {
super(props);
this.state = {
isLoading: false,
iphone: '', //手机号
identCode: '', //验证码
iPhoneValidate: false,// 手机号验证
smsCodeValidate: false,// 验证码验证
CodeValidate: false,// 第一步验证码验证
TimingText: "获取验证码",// 获取验证码文字
ValidateFlag: true,// 展示第一步校验
length: 6, //输入框的个数
codeInput: "", //第一步验证码输入
isShowTime: false,//是否显示自定义倒计时
timeText: "60", //自定义倒计时
}
}
componentWillMount() {
}
componentDidMount() {
if (UserInfo.phone) {
this.setState({
isShowTime: true
})
//获取验证码
this._getRegisterSms();
//获取倒计时
this.renderTime()
}
}
render() {
const { navigate, goBack } = this.props.navigation;
return (
<KeyboardAvoidingView
behavior={IOS ? "padding" : null}
style={styles.container}
>
<StatusBar
animated={true}//是否动画
hidden={false}//是否隐藏
backgroundColor={'#000'}//android 设置状态栏背景颜色
translucent={false}//android 设置状态栏是否为透明
showHideTransition="fade"//IOS状态栏改变时动画 fade:默认 slide
networkActivityIndicatorVisible={this.state.isLoading}//IOS设定网络活动指示器(就是那个菊花)是否显示在状态栏。
statusBarStyle={"default"}//状态栏样式 default 默认(IOS为白底黑字、Android为黑底白字)
barStyle={"default"}// 状态栏文本的颜色。
/>
<Nav title={"更换手机号"} leftClick={() => { goBack() }} />
<ScrollView
keyboardShouldPersistTaps={"handled"}
>
{/* 第一步验证原手机号 */}
{
this.state.ValidateFlag ?
<View style={styles.oneStep}>
<View style={styles.oneStepTit}>
<Text style={styles.oneStepTxt}>请输入当前手机号</Text>
<Text style={[styles.oneStepTxt, { marginLeft: Px2dp(5), marginRight: Px2dp(5) }]}>{Public.formatPhone(UserInfo.phone)}</Text>
<Text style={styles.oneStepTxt}>的验证码</Text>
</View>
<View style={{
position: 'relative',
justifyContent: "center",
alignItems: "center",
flexDirection: "row",
marginTop: Px2dp(20),
}}>
<View style={{ width: SCREEN_WIDTH, height: Px2dp(40), justifyContent: "center", alignItems: "center", flexDirection: "row", overflow: "hidden" }}>
{this._tempDomArr()}
</View>
<TextInput
ref={"_input"}
key={"one"}
style={{ opacity: 0, width: SCREEN_WIDTH + Px2dp(60), height: Px2dp(40), position: 'absolute', top: 0, left: -Px2dp(60), zIndex: 10, }}
returnKeyType={"done"}// 键盘确定按钮类型 done/go/next/search/send
placeholderTextColor="#999"
keyboardType="numeric"
maxLength={6}
autoFocus={true}
caretHidden={true}
contextMenuHidden={true} // 禁用粘贴
defaultValue={this.state.codeInput}
underlineColorAndroid={'transparent'}
onChangeText={(text) => {
if (regExp.Reg_Number.test(text)) {
this.setState({
CodeValidate: true
})
}
else {
this.setState({
CodeValidate: false
})
}
this.setState({ codeInput: text })
}}
/>
</View>
{/* 倒计时 */}
<View style={{ justifyContent: "center", alignItems: "center", marginTop: Px2dp(20) }}>
{
this.state.isShowTime ?
<View style={{ height: Px2dp(44), justifyContent: "center" }}>
<Text style={{ fontSize: Px2dp(12), color: "#9B9B9BFF" }}>重新获取({this.state.timeText})</Text>
</View>
:
<CountDownButton
style={{ marginBottom: Px2dp(5) }}
textStyle={{
fontSize: Px2dp(12),
color: "rgba(44,125,201,1)"
}}// 文字样式
timerCount={60}// 倒计时时长
timerTitle={this.state.TimingText}// 提示文字
enable={true}
onClick={(shouldStartCounting) => {
this._getRegisterSms()
shouldStartCounting(true); //重置验证码状态
}}
timerEnd={() => {
this.setState({
TimingText: '重新获取',
iPhoneFocus: true,
})
}}// 倒计时结束
/>
}
<TouchableOpacity activeOpacity={0.8} onPress={() => {
this._verifyAuthCode()
}}>
<LinearGradient
start={{ x: 0, y: 1 }}
end={{ x: 1, y: 1 }}
colors={['#EF6666', '#EA2424']}
locations={[0, 1.0]}
style={[styles.LoginBtnLg, this.state.CodeValidate ? { opacity: 1 } : { opacity: 0.5 }]}>
<Text style={styles.LoginBtnTxt}>下一步</Text>
</LinearGradient>
</TouchableOpacity>
</View>
</View>
: //第二步更新手机号
<View style={styles.LoginBox}>
{/* 填写更新手机号 */}
<Text style={{ width: Px2dp(300), lineHeight: Px2dp(15), marginBottom: Px2dp(35), fontSize: Px2dp(12), color: "#504949FF", }}>解除后该手机号的信息将全部转移至新绑定的手机中, 请知悉。</Text>
<View style={styles.LoginAccount}>
<Image style={styles.LoginAccountImg} source={require('../../images/login_account.png')} />
<TextInput
key={"phone"}
style={styles.input}
returnKeyType={"done"}// 键盘确定按钮类型 done/go/next/search/send
placeholderTextColor="#999"
keyboardType="numeric"
placeholder="请输入手机号"
underlineColorAndroid={'transparent'}
maxLength={11}
onChangeText={(text) => {
if (regExp.Reg_TelNo.test(text)) {
this.setState({
iPhoneValidate: true
})
}
else {
this.setState({
iPhoneValidate: false
})
}
this.setState({ iphone: text })
}}
onBlur={() => {
this.iphoneBlur()
}}
/>
</View>
{/* 填写更新验证码 */}
<View style={styles.LoginAccount}>
<Image style={styles.identCodeImg} source={require('../../images/ident_code.png')} />
<TextInput
key={"code"}
style={styles.input}
returnKeyType={"done"}// 键盘确定按钮类型 done/go/next/search/send
placeholderTextColor="#999"
keyboardType="numeric"
placeholder="请输入验证码"
defaultValue={this.state.identCode}
maxLength={6}
underlineColorAndroid={'transparent'}
onChangeText={(text) => {
if (regExp.Reg_Number.test(text)) {
this.setState({
smsCodeValidate: true
})
}
else {
this.setState({
smsCodeValidate: false
})
}
this.setState({ identCode: text })
}}
onBlur={() => {
this.smsCodeBlur()
}}
/>
{/* 更新倒计时 */}
<CountDownButton
style={[styles.getIdentCode, this.state.iPhoneValidate ? { opacity: 1 } : null]}
textStyle={{
fontSize: Px2dp(12),
color: Colors.white
}}// 文字样式
timerCount={60}// 倒计时时长
timerTitle={this.state.TimingText}// 提示文字
enable={true}
onClick={(shouldStartCounting) => {
//校验新手机号是否已注册
if (!this.state.iPhoneValidate) {
ToastShow({ "text": '请输入正确的手机号' })
shouldStartCounting(false);
} else {
Fetch(requestUrl.URL, {
"phone": this.state.iphone,
}).then(data => {
console.log(data)
if (data.status == "SUCCESS") {
if (this.state.iPhoneValidate) {
if (!this.state.iphone) {
shouldStartCounting(false);
}
else {
this._getRegisterSms(this.state.iphone)
shouldStartCounting(true); //重置验证码状态
}
}
} else if (data.status == "ERROR") {
ToastShow({ "text": data.msg })
shouldStartCounting(false);
} else {
ToastShow({ "text": '手机号校验失败' })
shouldStartCounting(false);
}
})
}
}}
timerEnd={() => {
this.setState({
TimingText: '重新获取',
iPhoneFocus: true
})
}}// 倒计时结束
/>
</View>
{/* 立即绑定 */}
<TouchableOpacity activeOpacity={0.8} onPress={() => {
if (this.state.iPhoneValidate && this.state.smsCodeValidate) {
this._replacePhone()
}
}}>
<LinearGradient
start={{ x: 0, y: 1 }}
end={{ x: 1, y: 1 }}
colors={['#EF6666', '#EA2424']}
locations={[0, 1.0]}
style={[styles.LoginBtnLg, this.state.iPhoneValidate && this.state.smsCodeValidate ? { opacity: 1 } : { opacity: 0.5 }]}>
<Text style={styles.LoginBtnTxt}>立即绑定</Text>
</LinearGradient>
</TouchableOpacity>
<View style={{ flex: 1 }}></View>
</View>
}
</ScrollView>
{this.state.isLoading ? <Loading /> : null}
</KeyboardAvoidingView>
);
}
//倒计时
renderTime() {
let timeCount = 60// 总秒数
let timer = setInterval(() => {
timeCount -= 1;
this.setState({
timeText: timeCount,
})
if (timeCount <= 0) {
// 倒计时结束
clearInterval(timer);
this.setState({
isShowTime: false
})
}
}, 1000)
}
//手机号失去焦点
iphoneBlur() {
if (!this.state.iphone) {
ToastShow({ "text": '请输入手机号' })
}
else if (!regExp.Reg_TelNo.test(this.state.iphone)) {
ToastShow({ "text": '请输入正确的手机号' })
} else {
return true
}
}
//验证码失去焦点
smsCodeBlur() {
if (!this.state.identCode.length) {
ToastShow({ "text": '请输入验证码' })
}
else if (!regExp.Reg_Number.test(this.state.identCode)) {
ToastShow({ "text": '请输入正确的验证码格式' })
}
else {
return true
}
}
//渲染展示input
_tempDomArr() {
let tempDomArr = [];
for (var i = 0; i < this.state.length; i++) {
tempDomArr.push(
<View key={i} style={styles.inputBoxItem}>
<Text>{this.state.codeInput.length >= i + 1 ? this.state.codeInput[i] : ""}</Text>
</View>
)
}
return tempDomArr;
}
// 获取第一步验证码
_getRegisterSms(iphone) {
Fetch(requestUrl.URL, { "phone": iphone ? iphone : UserInfo.phone }).then(data => {
if (data.status == "SUCCESS") {
this.setState({
iPhoneFocus: false
})
ToastShow({ "text": '验证码发送成功' })
} else {
ToastShow({ "text": '获取验证码失败' })
}
})
}
//第一步校验原手机号
_verifyAuthCode() {
if (!this.state.codeInput) {
ToastShow({ "text": '请输入验证码' })
}
else if (!regExp.Reg_Number.test(this.state.codeInput)) {
ToastShow({ "text": '请输入正确的验证码格式' })
}
else {
Fetch(requestUrl.URL, {
"phone": UserInfo.phone, 'authCode': this.state.codeInput, "userId": UserInfo.id
}).then(data => {
console.log(data)
if (data.status == "SUCCESS") {
this.setState({
ValidateFlag: false,
})
} else if (data.status == "1") {
this.setState({
codeInput: '',
})
this.refs._input.focus();
ToastShow({ "text": data.msg })
} else {
this.setState({
codeInput: '',
})
this.refs._input.focus();
ToastShow({ "text": '手机号校验失败' })
}
})
}
}
// 立即绑定更新手机号
_replacePhone() {
if (!this.state.iphone || !this.state.identCode) {
ToastShow({ "text": '请输入正确的信息' })
}
else if (!regExp.Reg_TelNo.test(this.state.iphone)) {
ToastShow({ "text": '请输入正确的手机号' })
}
else if (!this.state.identCode) {
ToastShow({ "text": '请输入验证码' })
}
else if (!regExp.Reg_Number.test(this.state.identCode)) {
ToastShow({ "text": '请输入正确的验证码格式' })
}
else {
this.setState({
isLoading: true,
})
Fetch(requestUrl.verificationPhone, {
"phone": this.state.iphone,
}).then(data => {
console.log(data)
if (data.status == "SUCCESS") {
Fetch(requestUrl.url, { "phone": this.state.iphone, "userId": UserInfo.id, 'authCode': this.state.identCode }).then(data => {
console.log(data)
if (data.status == "SUCCESS") {
let tempUserInfo = UserInfo;
tempUserInfo.phone = this.state.iphone;
Public.setItem("userInfo", tempUserInfo);
this.props.navigation.state.params.callback(this.state.iphone);
this.props.navigation.goBack();
} else if (data.status == "ERROR") {
this.setState({
isLoading: false,
})
ToastShow({ "text": data.msg })
} else {
this.setState({
isLoading: false,
})
ToastShow({ "text": '绑定失败' })
}
})
} else {
this.setState({
isLoading: false,
})
ToastShow({ "text": data.msg })
}
})
}
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: Colors.white,
justifyContent: "center",
flex: 1,
},
LoginBox: {
justifyContent: "center",
alignItems: "center",
flex: 1,
paddingTop: Px2dp(40)
},
//通用input盒子
LoginAccount: {
width: Px2dp(306),
paddingBottom: Px2dp(7),
flexDirection: "row",
alignItems: "center",
justifyContent: 'space-between',
borderBottomWidth: Pixel,
borderBottomColor: '#ececec',
marginBottom: Px2dp(32)
},
LoginAccountImg: {
marginRight: Px2dp(10)
},
identCodeImg: {
marginRight: Px2dp(7)
},
input: {
flex: 1,
fontSize: Px2dp(16),
padding: 0,
},
//按钮及文字
LoginBtn: {
width: Px2dp(306),
backgroundColor: Colors.red,
height: Px2dp(50),
marginTop: Px2dp(2),
justifyContent: 'center', alignItems: 'center',
},
LoginBtnLg: {
width: Px2dp(306),
height: Px2dp(50),
marginTop: Px2dp(2),
opacity: 0.5,
justifyContent: 'center', alignItems: 'center',
},
LoginBtnTxt: {
fontSize: Px2dp(16),
color: Colors.white,
},
//获取验证码及文字
getIdentCode: {
width: Px2dp(89),
height: Px2dp(26),
backgroundColor: "#EA2424",
opacity: 0.5,
borderRadius: Px2dp(13),
justifyContent: "center",
alignItems: "center"
},
getIdentCodeTxt: {
fontSize: Px2dp(12),
color: Colors.white
},
// 第一步
oneStep: {
marginTop: Px2dp(110),
flex: 1,
},
oneStepTit: {
flexDirection: "row",
justifyContent: "center",
alignItems: "center"
},
oneStepTxt: {
fontSize: Px2dp(16),
color: Colors.text333
},
inputBox: {
flexDirection: "row",
justifyContent: "center",
alignItems: 'center',
marginTop: Px2dp(40),
},
inputBoxItem: {
borderBottomWidth: Pixel,
borderBottomColor: "rgba(216,216,216,1)",
width: Px2dp(30),
height: Px2dp(30),
marginRight: Px2dp(10),
textAlign: "center",
padding: 0,
alignItems: 'center',
justifyContent: 'center',
},
});