输入的onChange不会使用setState

时间:2018-10-12 07:58:56

标签: javascript reactjs ecmascript-6

我有状态存储数组,例如['X','XL'],但是我的代码无法正常工作,我不知道为什么吗?

class App extends Component {
  state = {
    shirtsSize: ['X', 'XL']
  }
  handleChange = index => e => {
    const { shirtsSize } = this.state
    this.setState({
      [`${shirtsSize[index]}`]: e.target.value
    })
  }

  render() {
    const { shirtsSize } = this.state
    return (
      <div className="App">
        <label htmlFor="shirtsSize">Sizes</label>
        <button>+</button>

        {shirtsSize.map((lang, index) => (
          <input
            type="text"
            name="shirtsSize"
            id="shirtsSize"
            value={lang}
            onChange={this.handleChange(index)}
          />
        ))}
      </div>
    )
  }
}

无法找出错误所在。

2 个答案:

答案 0 :(得分:1)

使用

this.setState({
  [`${shirtsSize[index]}`]: e.target.value
})

您不是在更新shirtSize数组中的数据,而是创建一个新的密钥,例如shortsSize[0],依此类推。您需要像这样更新数组

const value = e.target.value;
this.setState(prevState => ({
  shirtsSize: [...prevState.shirtsSize.slice(0, index), value, ...prevState.shirtsSize.slice(index + 1) ]
}))

或者简单地

const shirtsSize = [...this.state.shirtsSize];
   shirtsSize[index] = e.target.value
   this.setState({
      shirtsSize
    })

答案 1 :(得分:0)

似乎您需要像这样的东西:

handleChange = index => e => {
  const {shirtsSize} = this.state
  shirtsSize[index] = e.target.value
  this.setState({shirtsSize: shirtsSize.slice()})
}