用嵌套对象反应更新状态

时间:2019-01-19 19:57:04

标签: javascript reactjs forms state

我有一个表格,提交时我想更新状态。目前,只有名字和姓氏有效。如何使用handleChange函数还可以更新嵌套对象的地址?还是我需要为此编写另一个函数? 感谢您的帮助

class Form extends Component {
  constructor(props){
    super(props);

    this.state = {
        name: '',
        surname: '',
        address: {
            street: '',
            city: '',
        },
    }
  }

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

  handleSubmit = e => {
    e.preventDefault();
  }

  render() {
    const {name, surname} = this.state;
    const { street, city} = this.state.address;

    return (
      <form onSubmit={this.handleSubmit}>
        <input type='text'
          value={name} 
          name='name'
          onChange={this.handleChange} />
        <input type='text'
          value={surname} 
          name='surname'
          onChange={this.handleChange} />
        <input type='text'
          value={street}
          name='street' 
          onChange={this.handleChange} />
        <input type='text'
          value={city} 
          name='city'
          onChange={this.handleChange} />
        <input type='submit' value='Submit' />
      </form>
    );
  }
}

4 个答案:

答案 0 :(得分:0)

您的表单元素中必须具有name属性,然后检查该名称值是否为setState。所以render()方法看起来像这样

render() {
  const {name, surname} = this.state;
  const { street, city} = this.state.address;

  return (
    <form onSubmit={this.handleSubmit}>
      <input type='text'
        name={name}
        value={name}
        onChange={this.handleChange} />
      <input type='text'
        name={surname}
        value={surname}
        onChange={this.handleChange} />
      <input type='text'
        name={street}
        value={street}
        onChange={this.handleChange} />
      <input type='text'
        name={city}
        value={city}
        onChange={this.handleChange} />
      <input type='submit' value='Submit' />
    </form>
  );
}

handleChange()

handleChange = e => {
  const name = e.target.name;
  if (name === 'city' || name === 'street') {
    this.setState({
      address: {
        ...state.address,
        [name]: e.target.value
      }
    });
  } else {
    this.setState({
      [name]: e.target.value
    });
  }
};

...ES6 Spread Operator,这是在React中更新嵌套状态的最干净的方法。

答案 1 :(得分:0)

您只需要访问街道和城市?像这样先破坏地址即可。

更改

const {name, surname} = this.state;
const { street, city} = this.state.address;

const {name, surname, address } = this.state;
const { street, city} = address;

答案 2 :(得分:0)

我建议您为address编写单独的变更处理程序。它将使您的代码简单易懂,而不是为此简单方法增加不必要的复杂性。

function handleAddressChange = e => {
    const {name, value} = event.target
    this.setState(({ address }) => {
        address: {
            ...address,
            [name]: value
        }
    })
}

答案 3 :(得分:0)

我知道你们所有人都面临着类似的任务,但重点是要重现原始状态。 React并不专注于处理嵌套状态。

this.state = {
    name: '',
    surname: '',
    street: '',
    city: ''
}