【问题标题】:Store data from dynamic input form to object (React)将数据从动态输入表单存储到对象(React)
【发布时间】:2018-12-29 11:36:28
【问题描述】:

我有一个存储在状态中的对象列表。我想以这样的格式将输入数据存储到对象中。

{
    "parameter" : [{
        "id":"parameter1",
        "value":"value1"
    }, {
        "id":"parameter2", 
        "value":"value2"
    }]
}

问题是输入的数量不是恒定的。如果有 10 个输入,我的对象长度应该是 10。

(1) 在输入 id=parameter1 中键入“value1”

{
    "parameter" : [{
        "id":"parameter1",
        "value":"value1"
    }]
}

(2) 在输入 id=parameter2 中键入“value2”

{
    "parameter" : [{
        "id":"parameter1",
        "value":"value1"
    }, {
        "id":"parameter2", 
        "value":"value2"
    }]
}

(3) 在输入 id=parameter1 中键入“value3”

{
    "parameter" : [{
        "id":"parameter1",
        "value":"value3"
    }, {
        "id":"parameter2", 
        "value":"value2"
    }]
}

我编写了 onchange 处理函数,但对象的长度始终等于 1。它只更改了我的对象的 id 和 value。

onChangeHandlerParameter = e => {
  this.setState({ parameter:[{"id": e.target.id,"value": e.target.value}]})
}

(1) 在输入 id=parameter1 中键入“value1”

{
    "parameter" : [{
        "id":"parameter1",
        "value":"value1"
    }]
}

(2) 在输入 id=parameter2 中键入“value2”

{
    "parameter" : [{
        "id":"parameter2",
        "value":"value2"
    }]
}

【问题讨论】:

  • 您必须修改存储在parameter 中的数组。目前,您正在用一个新数组覆盖现有数组。

标签: javascript reactjs


【解决方案1】:

问题在于 on change 处理程序

onChangeHandlerParameter = e => {
  this.setState((prevState) => {
          parameter:[
                    ...prevState.parameter,
                    {"id": e.target.id,"value": e.target.value}
                    ]
               });
}

您正在更改您的状态,但会覆盖现有的状态。因此,每次添加的最新数据时,您只会在数组中获得一项。

'...' 是扩展器运算符,在您的情况下它正在扩展数组。

【讨论】:

  • 感谢您的帮助。但是,您在上面编写的代码不起作用。系统警告我参数是未使用的标签。我编辑了代码,但它仍然不起作用。它显示“无法读取未定义的属性'setState'” [代码] onChangeHandlerParameter(e){ this.setState({ parameter:[...this.prevState.parameter,{"id": e.target.id,"value ": e.target.value}]})}
  • 并且那个错误无法读取未定义的属性'setState'完全是因为你的函数没有与构造函数中的'this'绑定
  • 用参数定义你的状态然后警告可能会去
  • “无法读取未定义的属性 'setState'”错误已修复。但是当我在输入框 id='url' 中输入 'asd' 时,它总是会在一个数组中产生两个元素。 i.stack.imgur.com/AqLqg.jpg
【解决方案2】:

您应该将项目(推送)添加到parameter 数组,当前代码只是将新值放入整个数组。

可以改成这样:

onChangeHandlerParameter = e => {
   const { parameter } = this.state;
   parameter.push({"id": e.target.id,"value": e.target.value})
   this.setState({ parameter })
}

【讨论】:

  • 这种错误的做法。你正在改变状态
  • 解构元素是引用元素。所以当你在操作参数时,它会直接影响状态。
  • 状态不应该直接编辑,总是使用不可变的方式,使用传播操作符 {...this.state}
【解决方案3】:

当你这样写时

onChangeHandlerParameter = e => {
  this.setState({ parameter:[{"id": e.target.id,"value": e.target.value}]})
}

您实际上是在覆盖现有状态,这不起作用,它始终会保留您最后输入的数据。

要完成这项工作,您需要使用扩展运算符稍微调整一下。

修复:

    onChangeHandlerParameter = e => {
    const currentState = {...this.state};
    const edittedParametersList = [...currentState.parameter];
    let element = {};
    element.id = e.target.id;
    element.value = e.target.value;
    edittedParametersList.parameter.push(element);
    this.setState(edittedParametersList);
  }

这样你的代码就可以工作,而且我们确保我们不会直接改变状态(这是一个最佳实践),我们正在以不可变的方式对其进行编辑。

黑客攻击愉快!

【讨论】:

  • 感谢您的帮助。但是,系统显示错误(TypeError: Cannot read property 'push' of undefined)。我在构造函数中定义了 this.state={parameter=[]} 。我不确定它是否与此错误有关。
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 2020-10-29
  • 2021-02-08
相关资源
最近更新 更多