【问题标题】:Unable to modify textfield when using validation from states in Reat js在 React js 中使用状态验证时无法修改文本字段
【发布时间】:2020-10-26 09:18:23
【问题描述】:

我正在尝试构建一个 React 表单,我需要在其中将一些简单的数据提交到 post web 服务。我已经创建了表单,但是当我尝试编辑文本字段时,我无法做到。这样做的原因是我正在更新状态变量,因为用户在文本字段中键入。我不知道该怎么做,有人可以帮我解决这个问题。我的代码:

    import React, { Component } from 'react';
import { Dropdown, DropdownButton, Button, Col } from "react-bootstrap";
import Form from 'react-bootstrap/Form';

const divStyle = {
    marginTop: '30px'
};

export default class Venues extends Component {
    constructor() {
        super();
        this.state = {
          name: '',
          address: '',
          city: '',
          state: '',
          zip: '',
          nameError: "",
          addressError: "",
          cityError: "",
          stateError: "",
          zipError: "",
        };
      }

      onSubmit = (e) => {
        e.preventDefault();
        const isValid = this.validate();
        if (isValid) {
            console.log(this.state);
            // get our form data out of state
            const { name, address, city, state, zip } = this.state;
        }
        console.log("submit clicked");
        
        // axios.post('/', { fname, lname, email })
        //   .then((result) => {
        //     //access the results here....
        //   });
      }


      handleChange = event => {
        this.setState({
            [event.target.name]: event.target.value
        });
      };

      validate = () => {
        let nameError = "";
        let addressError = "";
        let cityError = "";
        let stateError = "";
        let zipError = "";
    
        if (!this.state.name) {
          nameError = "Name cannot be blank";
        }
        if (!this.state.address) {
            addressError = "Address can not be blank";
        }
        if (!this.state.city) {
            cityError = "City can not be blank";
        }
        if (!this.state.state) {
            stateError = "State can not be blank";
        }
        if (!this.state.zip) {
            zipError = "Zipcode can not be blank";
        }
        if (nameError || addressError || cityError || stateError || zipError) {
          this.setState({ addressError, nameError });
          return false;
        }
    
        return true;
      };

    render() {
        const { name, address, city, state, zip } = this.state;
        return (
            <div className="col-md-4 offset-md-4">
                <div style={divStyle}>
                <h3 >Create User</h3>
                </div>
                <Form onSubmit={this.onSubmit} >
                    <div className="form-group">
                    <Form.Label>Venue Name</Form.Label>
                    <Form.Control type="text" value={this.state.name} placeholder="Enter venue name" onChange={this.handleChange.bind(this)} />
                    <div style={{ fontSize: 12, color: "red" }}>
                        {this.state.nameError}
                    </div>
                    <Form.Label>Address</Form.Label>
                    <Form.Control type="text" placeholder="Enter street address" />
                    <div style={{ fontSize: 12, color: "red" }}>
                        {this.state.addressError}
                    </div>
                    <Form.Label>City</Form.Label>
                    <Form.Control type="text" value={this.state.city} placeholder="Enter city" />
                    <Form.Label>State</Form.Label>
                    <Form.Control type="text" value={this.state.state}  placeholder="Enter state" />
                    <Form.Label>Zip</Form.Label>
                    <Form.Control type="text" value={this.state.zip}  placeholder="Enter zipcode" />
                    <div style={divStyle}>
                        <Button type="submit" className="btn btn-primary mb-2">
                            Submit
                        </Button>
                    </div>
                    </div>
                </Form>
            </div>
        )
    }
}

【问题讨论】:

    标签: javascript reactjs forms validation react-bootstrap


    【解决方案1】:
    1. 您没有将名称属性传递给输入字段
    2. 某些输入没有 onChange 处理程序。

    工作代码:

    import React, { Component } from "react";
    import { Dropdown, DropdownButton, Button, Col } from "react-bootstrap";
    import Form from "react-bootstrap/Form";
    
    const divStyle = {
      marginTop: "30px"
    };
    
    export default class Venues extends Component {
      constructor() {
        super();
        this.state = {
          name: "",
          address: "",
          city: "",
          state: "",
          zip: "",
          nameError: "",
          addressError: "",
          cityError: "",
          stateError: "",
          zipError: ""
        };
        this.handleChange = this.handleChange.bind(this);
      }
    
      onSubmit = (e) => {
        e.preventDefault();
        const isValid = this.validate();
        if (isValid) {
          console.log(this.state);
          // get our form data out of state
          const { name, address, city, state, zip } = this.state;
        }
        console.log("submit clicked");
    
        // axios.post('/', { fname, lname, email })
        //   .then((result) => {
        //     //access the results here....
        //   });
      };
    
      handleChange = (event) => {
        this.setState((prevState) => ({
          ...prevState,
          [event.target.name]: event.target.value
        }));
      };
    
      validate = () => {
        let nameError = "";
        let addressError = "";
        let cityError = "";
        let stateError = "";
        let zipError = "";
    
        if (!this.state.name) {
          nameError = "Name cannot be blank";
        }
        if (!this.state.address) {
          addressError = "Address can not be blank";
        }
        if (!this.state.city) {
          cityError = "City can not be blank";
        }
        if (!this.state.state) {
          stateError = "State can not be blank";
        }
        if (!this.state.zip) {
          zipError = "Zipcode can not be blank";
        }
        if (nameError || addressError || cityError || stateError || zipError) {
          this.setState({ addressError, nameError });
          return false;
        }
    
        return true;
      };
    
      render() {
        const { name, address, city, state, zip } = this.state;
    
        return (
          <div className="col-md-4 offset-md-4">
            <div style={divStyle}>
              <h3>Create User</h3>
            </div>
            <Form onSubmit={this.onSubmit}>
              <div className="form-group">
                <Form.Label>Venue Name</Form.Label>
                <Form.Control
                  type="text"
                  name="name"
                  value={this.state.name}
                  placeholder="Enter venue name"
                  onChange={this.handleChange}
                />
                <div style={{ fontSize: 12, color: "red" }}>
                  {this.state.nameError}
                </div>
                <Form.Label>Address</Form.Label>
                <Form.Control
                  type="text"
                  name="address"
                  value={this.state.address}
                  placeholder="Enter street address"
                  onChange={this.handleChange}
                />
                <div style={{ fontSize: 12, color: "red" }}>
                  {this.state.addressError}
                </div>
                <Form.Label>City</Form.Label>
                <Form.Control
                  type="text"
                  name="city"
                  value={this.state.city}
                  placeholder="Enter city"
                  onChange={this.handleChange}
                />
                <Form.Label>State</Form.Label>
                <Form.Control
                  type="text"
                  name="state"
                  value={this.state.state}
                  placeholder="Enter state"
                  onChange={this.handleChange}
                />
                <Form.Label>Zip</Form.Label>
                <Form.Control
                  type="text"
                  name="zip"
                  value={this.state.zip}
                  placeholder="Enter zipcode"
                  onChange={this.handleChange}
                />
                <div style={divStyle}>
                  <Button type="submit" className="btn btn-primary mb-2">
                    Submit
                  </Button>
                </div>
              </div>
            </Form>
          </div>
        );
      }
    }
    

    【讨论】:

    • 嗨 Punit,我收到 TypeError: Cannot read property 'name' of null
    • 当我尝试编辑 handleChange 函数中的字段时,我得到了这个
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2018-11-27
    • 2018-01-25
    • 1970-01-01
    • 2020-07-08
    • 2012-04-27
    • 2021-04-27
    • 2020-08-11
    相关资源
    最近更新 更多