为了账号安全,请及时绑定邮箱和手机立即绑定

使用react将属性添加到属于某个状态的列表中

使用react将属性添加到属于某个状态的列表中

当年话下 2019-04-26 18:15:05
我的状态有这个json变量:this.state = {         type:         {             name: '',             type2: {                 atribute: '',                 parameter: [                     {                         value: '',                         classtype: ''                     }                 ],                 name: '',                 atribute1: '',                 atribute2: ''             }         }     }我想要做的是在我的参数列表中添加元素,这些元素在开始时是空的。我做的是这样的:addParams = () => {     let newParam = {         value: this.state.type.type2.parameter.value,         classtype: this.state.type.type2.parameter.classtype     };     /** */     this.setState(prevState => ({         type: {             // keep all the other key-value pairs of type             ...prevState.type,             type2: {                 ...prevState.type.type2,                 //this is supposed to add an element to a list                 parameter: [...prevState.type.type2.parameter, newParam]             }         }     }))  }但是在执行最后一行代码时出现以下错误:未捕获的TypeError:在传播列表时无效传播非可迭代实例的尝试我不知道为什么这不起作用,因为参数确实是一个列表。
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

如果this.state.type.type2.parameter是数组,那么为什么要在其上引用属性:

let newParam = {
    value: this.state.type.type2.parameter.value,
    classtype: this.state.type.type2.parameter.classtype};

我不认为你的状态是你所期望的结构,似乎你在代码中的某个点上用一个对象替换该数组。我建议使用react-devtools帮助您跟踪状态的变化。

这不是一个答案,但我强烈建议使用immerjs来做这些纯嵌套更新。我几乎从不建议添加第三方库作为解决方案,但immer是轻量级的,改变生活。它导出一个名为produce的函数,并使用一个名为Proxy的概念来执行作为突变编写的纯更新。

使用immer(并修复了您的错误),您的代码变为:

const newParam = {
    value: this.state.type.type2.parameter.value,
    classtype: this.state.type.type2.parameter.classtype};this.setState(produce(draftState => {
  draftState.type.type2.parameter.push(newParam);}))

它允许您编写更易于阅读的简洁代码。是的,我知道这看起来像一个突变,但它不是一个100%纯。


查看完整回答
反对 回复 2019-05-17
?
jeck猫

TA贡献1909条经验 获得超7个赞

试试这个 :

 this.setState(prevState => {
        return {
            ...prevState,
            type: {
                ...prevState.type,
                type2: {
                    ...prevState.type.type2,
                    parameter: [...prevState.type.type2.parameter, newParam]
                }
            }
        }
    )


查看完整回答
反对 回复 2019-05-17
  • 2 回答
  • 0 关注
  • 671 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信