我正在使用ReactJS,我需要更改值的状态,但是value属性以这种方式处于状态:
this.state = {
form:{
name:{
value:''
}
}
}
我以不同的方式尝试了以下形式:
<TextInput
name='form.name.value'
value={this.state.form.name.value}
onChange={value => this.onChange('name', value)}
/>
onChange = (e) => {
this.setState({ [e.target.name]: e.target.value})
}
但是永远不要更改状态值。
我该怎么做?谢谢!!!!!!
答案 0 :(得分:1)
您的onChange
函数应更改为
onChange = (e) => {
this.setState({ form: {...this.state.form, [e.target.name]: e.target.value}})
}
编辑:我能够成功运行以下代码
class App extends React.Component {
state = {
form: {
test: ""
}
}
onChange = (e) => {
this.setState({
form: {
...this.state.form,
[e.nativeEvent.target.name]: e.target.value,
}
})
}
render() {
return <div>
<TextInput
name='test'
value={this.state.form.test}
onChange={this.onChange}
/>
<br/><br/>
The State : {JSON.stringify(this.state)}
</div>;
}
}
const TextInput = (props) => {
return <input type="text" {...props}/>;
}
ReactDOM.render(
<App />,
document.getElementById('container')
);
<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>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
编辑:根据您的新结构,我进行了更改
class App extends React.Component {
state = {
form: {
test: {
value: "",
type: "text"
}
}
}
onChange = (e) => {
this.setState({
form: {
...this.state.form,
[e.nativeEvent.target.name]: {
...this.state.form[e.nativeEvent.target.name],
value: e.nativeEvent.target.value
},
}
})
}
render() {
return <div>
<CustomInput
name='test'
value={this.state.form.test.value}
onChange={this.onChange}
/>
<br/><br/>
The State : {JSON.stringify(this.state)}
</div>;
}
}
const CustomInput = (props) => {
return <input {...props}/>;
}
ReactDOM.render(
<App />,
document.getElementById('container')
);
<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>
<div id="container"></div>
答案 1 :(得分:1)
您使用输入字段名称的方式不正确。在setState
中,它被认为是字符串,而不是object.key
。
onChange= (e) => {
let inputName = e.target.name;
let inputValue = e.target.value;
let updatedFormState = Object.assign({}, this.state);
updatedFormState.form[inputName].value = inputValue;
this.setState(updatedFormState);
}
答案 2 :(得分:0)
为了设置嵌套对象的setState,可以遵循以下方法,因为我认为setState无法处理嵌套更新。
let form = {...this.state.form}
let name = [e.target.name];
form.name = e.target.value;
this.setState({form});
想法是创建一个虚拟对象,对其执行操作,然后用更新的对象替换组件的状态
答案 3 :(得分:0)
我不知道您的情况,但我认为您做错了做法。 解决问题的方法:
<TextInput
name="form.name.value"
value={this.state.form.name.value}
onChange={(a, b) => this.handleTextChange(a, b)}
/>
现在handleTextChange
喜欢
handleTextChange(name, value) {
const arr = name.split(".");
const obj = {
[arr[2]]: value
};
const nameObj = {
[arr[1]]: { ...obj }
};
console.log("fomr", nameObj);
this.setState({ form: nameObj });
}
考虑您的customComponent
const TextInput = props => {
return (
<input
name={props.name}
onChange={e => props.onChange(e.target.name, e.target.value)}
/>
);
};
CodeSandbox工作示例
答案 4 :(得分:0)
您需要使用es6进行解构:
我在这里创建了一个工作副本:CodePen InputForm
var sp = {...this.state.form};
sp.name.value = event.target.value;
this.setState({sp})