我正在使用受控输入创建一个简单的表单.在我的组件状态中,我在状态上有2个属性"clientName"和"license".改变这些工作正常.但是有一个"运输"属性是一个对象.更改任何运输属性会产生错误.例如,如果我更改"address1",只要在handleShippingChange函数中设置了状态,我就会收到错误:
警告:TextField正在更改类型文本的受控输入以使其不受控制.输入元素不应从受控切换到不受控制(反之亦然).决定在组件的使用寿命期间使用受控或不受控制的输入元素.
我怀疑它与我如何定义那些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;Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
Sim*_*ias 39
受控/非受控输入表示<input>字段是否具有值.
// This is a controlled input
<input value="foo"/>
// This is an uncontrolled input
<input value={null}/>
Run Code Online (Sandbox Code Playgroud)
我们的想法是,您不希望从受控输入更改为不受控制的输入.两种类型的输入都有不同的行为,这可能会导致错误和/或不一致.
最简单的解决方法是确保始终存在默认值(在空字段的情况下,默认值为空字符串'').
另外,请注意,一致类型通常优于可空类型,因为您可以保证某个值的类型.这有助于减少由于空检查引起的开销(if (val != null) { /* ...etc */ })
但是如果你只想要一行修复,你也可以在jsx中提供内联的默认值:
<input value={value || ''}/>
Run Code Online (Sandbox Code Playgroud)
根本问题是我在运输对象上设置属性的方式,它不会将新属性值与原始属性值合并。因此,警告不是针对我正在编辑的文本字段,而是针对其他被吹走的运输文本字段。我不确定这是否是公认的做法,因为很难找到在该状态下使用对象的示例。但是,将 handleShipping 方法更改为此解决了我的问题:
handleShippingChange(event) {
var shipping = this.state.shipping;
shipping[event.target.name] = this.getFieldValue(event.target);
this.setState({
shipping: shipping
});
};
Run Code Online (Sandbox Code Playgroud)
基本上,我正在从状态创建现有运输对象的副本,对其进行更改并将整个运输对象设置为等于更改后的副本。
| 归档时间: |
|
| 查看次数: |
11335 次 |
| 最近记录: |