【问题标题】:Correct way of modifying list/objs in ReactJS在 ReactJS 中修改列表/对象的正确方法
【发布时间】:2019-04-12 22:05:52
【问题描述】:

我有一个代码 sn-p 下面我不太确定它是否正确完成。

这是我的代码块:

onChangeMethod(event) {
    this.setState(prevState => ({
        list: [...prevState.list, event.value]
    }));
}

我看到了另一个例子here,我在这里修改了我的代码。可以这样做吗?意思是,我可以将传递给onChangeMethod()的事件值直接用在setState()中声明的函数中吗?

onChangeMethod(event) {
    this.setState((state, event.value) => ({
        list: state.list.push(event.value)
    }));
}

欢呼社区

【问题讨论】:

  • 你的第一个 sn-p 很好,除了你应该从事件目标中提取value,因为给setState 的函数将被异步调用。 const { value } = event.target; this.setState(prevState => ({ list: [...prevState.list, value] }));
  • 第一个是推荐的。我永远喜欢第一个
  • 有人能告诉我 prevState 是怎么产生的吗?我需要在任何地方声明吗?
  • @AKJ 给setState 的参数是一个函数,该函数的第一个参数是之前的状态。在您的代码中,您将该参数命名为 prevState,但您可以将其命名为您认为合适的任何名称,例如previousState 代替。

标签: javascript arrays reactjs setstate


【解决方案1】:

您的问题的答案是肯定的,但首先我需要更正您的代码中的一些内容。
在处理状态对象中的数组属性时,您永远不应该直接通过使用数组方法(如push())来修改状态。对于您的用例,您可以执行以下操作:

onChangeMethod({ target: { value } }) {
    this.setState((prevState) => ({
        list: [ ...prevState.list, value ]
    }));
}

或者您可以使用concat() 方法,它总是返回一个新数组,如下所示:

onChangeMethod({ target: { value } }) {
    this.setState({
        list: this.state.list.concat(value)
    });
}

【讨论】:

    【解决方案2】:

    代码 prevState => ({list: [...prevState.list, event.value]}) 是一个匿名箭头函数,其参数名为prevState,返回一个对象{list: [...prevState.list, event.value]}。您将此函数作为参数传递给另一个函数setStatesetState 函数稍后调用您的函数,提供当前组件状态作为第一个参数(实际上它会使用 2 个参数调用您的函数:prevState 和 props)。

    类似: function setState(callback) { callback(component.state, component.props) }

    您的第二个代码 sn-p 在两个方面不正确:

    1. 语法不正确 - 你不能调用变量(参数)event.value

    2. setState 将组件道具作为第二个参数而不是事件传递

    我强烈建议您阅读更多关于函数、箭头函数、回调、闭包和一般 JavaScript 的内容。

    要回答你的问题,你的第一个代码示例是要走的路,你已经在匿名箭头函数上下文中有变量事件并且可以正常工作。

    【讨论】:

    • @AKJ 欢迎您。不要忘记接受某人的答案(如果您认为它回答了您的问题)或创建您自己的答案(如果您自己找到并接受)。
    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2018-04-12
    • 2017-04-25
    相关资源
    最近更新 更多