加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactjs – React form error将类型文本的受控输入更改为不受控

发布时间:2020-12-15 05:06:41 所属栏目:百科 来源:网络整理
导读:我正在使用受控输入创建一个简单的表单.在我的组件状态中,我在状态上有2个属性“clientName”和“license”.改变这些工作正常.但是有一个“运输”属性是一个对象.更改任何运输属性会产生错误.例如,如果我更改“address1”,只要在handleShippingChange函数中
我正在使用受控输入创建一个简单的表单.在我的组件状态中,我在状态上有2个属性“clientName”和“license”.改变这些工作正常.但是有一个“运输”属性是一个对象.更改任何运输属性会产生错误.例如,如果我更改“address1”,只要在handleShippingChange函数中设置了状态,我就会收到错误:

Warning: TextField is changing a controlled input of type text to be
uncontrolled. Input elements should not switch from controlled to
uncontrolled (or vice versa). Decide between using a controlled or
uncontrolled input element for the lifetime of the component.

我怀疑它与我如何定义那些TextFields的值以及我如何设置运输属性的状态有关.我究竟做错了什么?我的组件的代码如下:

import React,{Component} from 'react';
    import TextField from 'material-ui/TextField';
    import RaisedButton from 'material-ui/RaisedButton';
    import 'whatwg-fetch';

    class Clients extends Component {
      constructor() {
        super();
        this.state = {
          "clientName": "client name","shipping": {
            "name": "name","address1": "address 1","address2": "address 2","city": "city","state": "state","zip": "zip","country": "country"
          },"license": "license"
        };

        this.handleChange = this.handleChange.bind(this);
        this.handleShippingChange = this.handleShippingChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      };       

      handleChange(event) {
        this.setState({
          [event.target.name]: this.getFieldValue(event.target)
        });
      };

      handleShippingChange(event) {
        this.setState({
          shipping: {
            [event.target.name]: this.getFieldValue(event.target)
          }
        });
      };

      getFieldValue(target) {
        return target.type === 'checkbox' ? target.checked : target.value;
      };

      handleSubmit = (event) => {
        event.preventDefault();

        // do some stuff
      };   

      render() {
        return <div>
          <h1>
            Clients Page
          </h1>

          <form onSubmit={this.handleSubmit}>
            <TextField
              hintText="Enter the client name"
              floatingLabelText="Client Name"
              value={this.state.clientName}
              onChange={this.handleChange}
              name="clientName"
            />
            <h2>Shipping Info</h2>
            <TextField
              hintText=""
              floatingLabelText="Name"
              value={this.state.shipping.name}
              onChange={this.handleShippingChange}
              name="name"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="Address Line 1"
              value={this.state.shipping.address1}
              onChange={this.handleShippingChange}
              name="address1"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="Address Line 2"
              value={this.state.shipping.address2}
              onChange={this.handleShippingChange}
              name="address2"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="City"
              value={this.state.shipping.city}
              onChange={this.handleShippingChange}
              name="city"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="State"
              value={this.state.shipping.state}
              onChange={this.handleShippingChange}
              name="state"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="Zip Code"
              value={this.state.shipping.zip}
              onChange={this.handleShippingChange}
              name="zip"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="Country"
              value={this.state.shipping.country}
              onChange={this.handleShippingChange}
              name="country"
            />
            <br />
            <TextField
              hintText=""
              floatingLabelText="License"
              value={this.state.license}
              onChange={this.handleChange}
              name="license"
            />
            <br />
            <RaisedButton label="OK" primary={true} type="submit" />
          </form>
        </div>
      };
    }

    export default Clients;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
受控/不受控制的输入意味着< input>字段是否有值.
// This is a controlled input
<input value="foo"/>

// This is an uncontrolled input
<input value={null}/>

我们的想法是,您不希望从受控输入更改为不受控制的输入.两种类型的输入都不同,这可能导致潜在的错误或不一致.

最简单的解决方法是确保始终存在默认值(在空字段的情况下,默认值为空字符串”).

另外,请注意,一致类型通常优于可空类型,因为您对某个值的类型有所保证.这有助于减少由于空检查导致的开销(if(val!= null){/ * … etc * /})

但是如果你只想要一行修复,你也可以在jsx中提供内联的默认值:

<input value={value || ''}/>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读