【问题标题】:React Native - Form Field Validation: Unable to create password validation for password confirmationReact Native - 表单字段验证:无法为密码确认创建密码验证
【发布时间】:2018-08-13 17:27:41
【问题描述】:

我正在注册表中建立一个 pin 验证,以检查第一个 pin 是否与第二个匹配。我创建了一个 validatePinConfirmation 函数来检查 pin 是否等于 pin_confirmation。如果是,那么我们将 pin_confirmation 的状态设置为用户插入的值。由于某种原因,函数或表单没有传递值并将其保存到数据库中。如果有人能准确指出我做错了什么,我将不胜感激。

import React, { Component } from 'react';
import { View, AsyncStorage } from 'react-native';
import { Form, Item, Input, Label, Button, Text } from 'native-base';
import axios from 'axios';
import { JWT } from 'App';

class RegistrationForm extends Component {
	constructor(props) {
		super(props);
		this.state = {
			name: '',
			email: '',
			emailValidate: '',
			pin: '',
			pinValidate: '',
			role: 'Consumer',
			pin_confirmation: ''
		};
	}

	validateEmail(text, type) {
		alph = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g;
		if (type == 'email') {
			if (alph.test(text)) {
				this.setState({ emailValidate: true });
			} else {
				this.setState({ emailValidate: false });
			}
		}
		if ({ emailValidate: true }) {
			this.setState({ email: text });
		}
	}

	validatePinConfirmation(text) {
		const { pin, pin_confirmation } = this.state;
		if (text == pin) {
			this.setState({ pinValidate: true });
		} else {
			this.setState({ pinValidate: false });
		}
		if ({ pinValidate: true }) {
			this.setState({ pin_confirmation });
		}
	}

	onSubmit = () => {
		const { name, email, pin, role, pin_confirmation } = this.state;
		axios
			.post('http://0.0.0.0:4000/api/v1/sign_up', {
				user: {
					name,
					email,
					pin,
					role,
					pin_confirmation
				}
			})
			.then(response => {
				AsyncStorage.setItem('JWT', response.data.jwt);
				console.log(response.data.jwt);
				this.props.navigation.navigate('Profile');
			})
			.catch(error => {
				console.log(error);
			});
	};

	render() {
		return (
			<View>
				<Form>
					<Item floatingLabel>
						<Label>Name</Label>
						<Input
							value={this.state.name}
							onChangeText={name => {
								this.setState({ name });
							}}
						/>
					</Item>
					<Item floatingLabel last>
						<Label>Email</Label>
						<Input
							autoCapitalize="none"
							value={this.state.email}
							onChangeText={text => this.validateEmail(text, 'email')}
						/>
					</Item>
					<Item floatingLabel last>
						<Label>Pin</Label>
						<Input
							keyboardType={'number-pad'}
							secureTextEntry
							value={this.state.pin}
							onChangeText={pin => {
								this.setState({ pin });
							}}
						/>
					</Item>
					<Item floatingLabel last>
						<Label>Pin Confirmation</Label>
						<Input
							keyboardType={'number-pad'}
							secureTextEntry
							value={this.state.pin_confirmation}
							onChangeText={text => this.validatePinConfirmation(text)}
						/>
					</Item>
				</Form>
				<Button onPress={this.onSubmit}>
					<Text> Submit</Text>
				</Button>
			</View>
		);
	}
}

export default RegistrationForm;

【问题讨论】:

    标签: javascript reactjs forms validation react-native


    【解决方案1】:

    尝试以下方法:

    <Input
        keyboardType={'number-pad'}
        secureTextEntry
        value={this.state.pin_confirmation}
        onChangeText={this.validatePinConfirmation.bind(this)}
    />
    

    this 的上下文超出了您要使用的范围。让我知道这是否有效。您可能也必须对 onSubmit 执行相同的操作。

    【讨论】:

    • @isProf 感谢您的评论。我按照你说的做了,但现在模拟器告诉我 pin_confirmation 是未定义的。我尝试将 pin_confirmation 作为参数传递给 validatePinConfirmation 函数,但它不起作用。你觉得我应该怎么做?
    • @AlyDabbous 检查作为回调传递的所有访问this 的函数。他们都需要使用bind(this) 了解上下文。
    • @isProf 我不明白你能详细说明一下吗? :) 谢谢!
    • 在构造函数的某个地方只调用一次bind()不是更好吗?在模板中进行此操作将返回新函数,因此 Input 将与其父容器中的任何更改一起重新渲染。
    【解决方案2】:

    这个使用 function 关键字创建的内部函数是未定义的,这就是你面临的问题,你有两个选择

    1. 使用 .bind() 函数 this.validatePinConfirmation.bind(this)
    2. 使用箭头函数,例如 validatePinConfirmation 应该定义为流

      validatePinConfirmation = (text) => { /* 你的代码 */} // 这里的 this 不是未定义的,因为箭头函数保留了封闭词法上下文的 this 的值

    您可以从blog post获得更多相关信息

    【讨论】:

      【解决方案3】:

      除了其他建议修复您的支票

      if ({ emailValidate: true }) {
      

      这总是被执行,因为任何对象都被转换为布尔值true。 我相信你需要检查类似的东西

      if (this.state.emailValidate) {
      

      但这实际上不起作用,因为.setState()async operation。即:调用.setState 不会立即改变状态。 所以你最好引入中间变量并检查它:

      let isEmailValid = true;
      ...
      this.setState({emailValidate: isEmailValid});
      if (isEmailValid) {
          this.setState({email: text});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-11
        • 2013-09-18
        • 2015-04-03
        • 2023-02-23
        • 2014-10-18
        • 2018-09-26
        • 2017-07-26
        • 1970-01-01
        相关资源
        最近更新 更多