【问题标题】:ReactJS Semantic ui - Cannot type into form when value attribute existsReactJS语义ui - 当值属性存在时无法输入表单
【发布时间】:2018-03-10 09:07:27
【问题描述】:

我正在按照 ReactJS 教程设置登录表单。使用和导入语义 ui。电子邮件和密码被传递到表单内的value 属性中。发生这种情况时,我无法在表单中输入任何内容。删除它后,我可以输入信息,但我认为它不会传递到任何地方。

似乎在其他任何地方都找不到这个问题。有没有人遇到过这个问题?

import React from 'react';
import PropTypes from 'prop-types';
import { Form, Button } from 'semantic-ui-react';
import Validator from 'validator';
import InlineError from '../messages/InlineError';



class LoginForm extends React.Component {
    state = {
        data: {
            email: "",
            password: ""
        },
        loading: false,
        errors: {}
    };

    //... is called spread
    onChange = e => this.setState({
        data: {...this.state.data, [e.target.name]: e.target.value }
    });

    //() means function takes no params
    onSubmit = () => {
        const errors = this.validate(this.state.data);
        this.setState({errors}); //if there are errors, display them
        if(Object.keys(errors).length === 0){
            this.props.submit(this.state.data);
        }
    };

    validate = (data) => {
        const errors = {};
        if(!Validator.isEmail(data.email))
            errors.email = "Invalid email";
        if(!data.password)
            errors.password = "Can't be blank";

        return errors;
    };

    render() {

        const { data, errors } = this.state; // import variables into html
        return (
            <div>
                <Form onSubmit={ this.onSubmit }>
                    <Form.Field error={!!errors.email}>
                        <label htmlFor="email">Email</label>
                        <input type="email"
                               id="email"
                               placeholder="example@abc.com"
                               value={ data.email }
                               onChange={ this.onChange }/>
                        {errors.email && <InlineError text={errors.email}/>}
                    </Form.Field>
                    <Form.Field error={!!errors.email}>
                        <label htmlFor="password">Password</label>
                        <input type="password"
                               id="password"
                               value={ data.password }
                               onChange={this.onChange}/>
                        {errors.password && <InlineError text={errors.password}/>}
                    </Form.Field>
                    <Button primary>Login</Button>
                </Form>
            </div>
        );

    }
}

LoginForm.propTypes = {
    submit: PropTypes.func.isRequired
};



export default LoginForm;

教程:https://www.youtube.com/watch?v=NO2DaxhoWHk&t=879s

【问题讨论】:

    标签: forms reactjs semantic-ui


    【解决方案1】:
    onChange = e => this.setState({
        data: {...this.state.data, [e.target.name]: e.target.value }
    });
    

    此函数将状态设置为共享输入字段名称的变量。因此e.target.name。但是您的输入字段没有名称属性。

    您可以通过以下方式解决此问题:

    import React from 'react';
    import PropTypes from 'prop-types';
    import { Form, Button } from 'semantic-ui-react';
    import Validator from 'validator';
    import InlineError from '../messages/InlineError';
    
    
    
    class LoginForm extends React.Component {
        state = {
            data: {
                email: "",
                password: ""
            },
            loading: false,
            errors: {}
        };
    
        //... is called spread
        onChange = e => this.setState({
            data: {...this.state.data, [e.target.name]: e.target.value }
        });
    
        //() means function takes no params
        onSubmit = () => {
            const errors = this.validate(this.state.data);
            this.setState({errors}); //if there are errors, display them
            if(Object.keys(errors).length === 0){
                this.props.submit(this.state.data);
            }
        };
    
        validate = (data) => {
            const errors = {};
            if(!Validator.isEmail(data.email))
                errors.email = "Invalid email";
            if(!data.password)
                errors.password = "Can't be blank";
    
            return errors;
        };
    
        render() {
    
            const { data, errors } = this.state; // import variables into html
            return (
                <div>
                    <Form onSubmit={ this.onSubmit }>
                        <Form.Field error={!!errors.email}>
                            <label htmlFor="email">Email</label>
                            <input type="email"
                                   id="email"
                                   name="email"
                                   placeholder="example@abc.com"
                                   value={ data.email }
                                   onChange={ this.onChange }/>
                            {errors.email && <InlineError text={errors.email}/>}
                        </Form.Field>
                        <Form.Field error={!!errors.email}>
                            <label htmlFor="password">Password</label>
                            <input type="password"
                                   id="password"
                                   name="password"
                                   value={ data.password }
                                   onChange={this.onChange}/>
                            {errors.password && <InlineError text={errors.password}/>}
                        </Form.Field>
                        <Button primary>Login</Button>
                    </Form>
                </div>
            );
    
        }
    }
    
    LoginForm.propTypes = {
        submit: PropTypes.func.isRequired
    };
    
    
    
    export default LoginForm;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2019-04-12
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多