在ReactJS的状态对象上使用setState

时间:2018-08-17 06:25:23

标签: javascript reactjs state

我正在使用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})
}  

但是永远不要更改状态值。

我该怎么做?谢谢!!!!!!

5 个答案:

答案 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})