将 prevstate 参数添加到 this.setState 会导致 typeError

Posted

技术标签:

【中文标题】将 prevstate 参数添加到 this.setState 会导致 typeError【英文标题】:Adding prevstate parameter to this.setState causes typeError 【发布时间】:2019-03-20 12:24:03 【问题描述】:

我正在更新状态 onchange。 setState 在没有提供 prevstate 的情况下工作,但当然没有写入其余的状态值。但是当我在 prevstate 中添加时,我得到了这个错误:

TypeError: 无法读取未定义的属性“名称”

  110 | if(inputs[i].checked && this.state.rates[`$inputs[i].name`] !== true ) 
  111 |   this.setState(prevstate=>(
  112 |     ...prevstate,
> 113 |     rates: 
      | ^  114 |       ...prevstate.rates,
  115 |       [inputs[i].name]: true
  116 |     

我不知道是什么原因造成的。这是状态和我的 handleChange 函数:

this.state=
  rawnew:[],
  rawold:[],
  posts: [],
  count: 0,
  report: false,
  rates: 

handleChange 函数:

handleChange = (e) => 
  var inputs = document.getElementsByTagName('input')
  console.log(this.state)
  for (var i = 0; i < inputs.length; i++) 
    console.log(i, inputs[i].name)
    if (inputs[i].checked && this.state.rates[`$inputs[i].name`] !== true) 
      this.setState(prevstate => (
        ...prevstate,
        rates: 
          ...prevstate.rates,
          [inputs[i].name]: true
        
      ))
     else if (this.state.rates[`$inputs[i].name`] !== undefined && this.state.rates[`$inputs[i].name`] !== inputs[i].checked) 
      this.setState(prevstate => (
        rates: 
          ...prevstate.rates,
          [inputs[i].name]: !prevstate.rates[`$inputs[i].name`]
        
      ))
    
  

【问题讨论】:

错误Cannot read property 'name' of undefined ,嗯,错误来自这个[inputs[i].name]: true,你检查了吗? 删除这行代码 var inputs = document.getElementsByTagName('input') 改为使用 refs 访问标签 dom 节点,如下所示: if(inputs[i].refs.checked && this.state. rate.inputs[i].refs.name !== true ) 在您的输入标签上添加 ref="name"。 【参考方案1】:

setState 是异步的,这意味着i 的值可能在setState 运行时已经改变。这也意味着this.state 可能不包含每次迭代的更新值。例如,当您检查名称的汇率是否为真时:

this.state.rates[`$inputs[i].name`] !== true

可能之前的迭代将值设置为 true,但 react 尚未更新 this.state

不要在循环内更新状态,而是尝试构建新状态并在循环外只更新一次。

使用forEach 循环为每次迭代创建一个新范围,并确保inputsetState 运行时具有相同的内容。

handleChange = (e) => 
    // see Jesse's comment about using refs
    var inputs = document.getElementsByTagName('input'); 
    const newState =  ...this.state, rates: ...this.state.rates ;

    inputs.forEach(input => 
        const  checked, name  = input;
        newState.rates[name] = checked;
    );

    this.setState(newState);

【讨论】:

以上是关于将 prevstate 参数添加到 this.setState 会导致 typeError的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态输入值添加到本地状态以进行检索

如何在反应中从状态数组中添加或删除项目

react setState 的用法

反应钩子中的prevstate

componentDidUpdate 中的 prevState 是 currentState?

功能组件的setState中的prevState到底是什么?