查找并推送结果将两个对象推送到数组中

肖恩·索伯恩

单击下面的测试按钮时,对象的 2 个副本被推入阵列。

谁能解释为什么会发生这种情况?我只期望 1 个对象。

class Testing extends React.Component {
    state = {
        things: []
    }

    test = () => {
        this.setState(prevState => {
            const things = [...prevState.things];

            things.find(x => x.id === '39cc413f-a25c-409d-ad09-05df5b4b28b6')['stats'].push({
                mana: 100,
                health: 1
            });

            return { things};
        });
    }

    componentDidMount = () => {
        this.setState({
            things: this.state.things.concat({
                id: '39cc413f-a25c-409d-ad09-05df5b4b28b6',
                stats: [],
                enemies: []
            })
        });
    }

    render() {
        const { things } = this.state;

        return (
            <React.Fragment>
                <button type="button" onClick={this.test}>Test</button>
                <br />
                {things.map((thing, i) => <div key={i}>{JSON.stringify(thing)}</div>)}
            </React.Fragment>
        );
    }
}

ReactDOM.render(<React.StrictMode>
  <Testing />
</React.StrictMode>, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>

丹尼尔

我假设您使用的是严格模式。在许多情况下,React 会触发两次状态回调,以捕获生产中可能发生的状态管理错误。

特别是 this.setState 的回调参数运行了两次——第一个结果被丢弃,第二个结果被使用。这应该没有区别,但在这里这样做是因为底层状态正在发生变化:事物只是 prevState.things 的浅拷贝,因此使用 .find 然后改变找到的对象会导致明显的双重更新。- 罗宾·齐格蒙德

见:

GitHub 问题

反应文档

您可以使用 JSON.parse(JSON.stringify(thingy)) 轻松地(不一定是高效的)深度复制数组,如下所示。

[如果 id 不存在,还添加了错误处理。]

class Testing extends React.Component {
    state = {
      things: []
    }

    test = () => {
      this.setState(prevState => {
        console.log(prevState)
        let things = JSON.parse(JSON.stringify(prevState.things));

        const index = prevState.things.findIndex(x => x.id === '39cc413f-a25c-409d-ad09-05df5b4b28b6');

        if (index !== -1) {
          let statsCopy = [...things[index].stats, {
            mana: 100,
            health: 1
          }];
          //console.log(statsCopy)
          things[index]["stats"] = [...statsCopy];

          return {
            ...prevState,
            things: [...things]
          }
        }
        return {
          ...prevState
        }

      });
    }

    componentDidMount = () => {
      this.setState({
        things: this.state.things.concat({
          id: '39cc413f-a25c-409d-ad09-05df5b4b28b6',
          stats: [],
          enemies: []
        })
      });
    }

    render() {
        const {
          things
        } = this.state;

        return ( <
          React.Fragment >
          <
          button type = "button"
          onClick = {
            this.test
          } > Test < /button> <
          br / > {
            things.map((thing, i) => < div key = {
                i
              } > {
                JSON.stringify(thing)
              } < /div>)} < /
              React.Fragment >
            );
          }
        }

        ReactDOM.render( <
            React.StrictMode >
            <
            Testing / >
            <
            /React.StrictMode>, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何计算两个不同数组中每个对象的值并推送到新数组?

来自分类Dev

如何合并包含相同键的不同值的两个对象数组,并将新对象推送到数组中?

来自分类Java

根据条件合并两个列表,然后使用Java 8将结果推送到地图

来自分类Dev

在mongodb中的一个更新调用中推送到两个单独的数组

来自分类Dev

如何将数组推送到对象数组中?

来自分类Dev

比较两个不同的对象数组,并在API调用后找到匹配项时将数据推送到新对象

来自分类Dev

将嵌套对象推送到数组中的下一个对象 [功能风格]

来自分类Dev

如何将数组推送到另一个数组内的对象中?

来自分类Dev

如何将代码推送到两个不同的文件夹中?

来自分类Dev

猫鼬将结果推送到数组

来自分类Dev

映射两个数组以查看一个属性是否匹配,然后将特定信息推送到第一个数组中

来自分类Dev

将 JSON 数据推送到 ANGULAR 对象数组中

来自分类Dev

Meter 将新对象推送到集合中的数组

来自分类Dev

如何使用 R 将 json 对象推送到数组中

来自分类Dev

使用Mongoose将项目推送到对象中的数组

来自分类Dev

将对象推送到数组中,始终推送最后一个数组

来自分类Javascript

将获取的数据推送到对象数组

来自分类Dev

将 new 作为对象推送到数组

来自分类Dev

将项目推送到嵌套对象数组

来自分类Dev

将js对象推送到数组

来自分类Dev

比较两个数组并将结果推送到新数组

来自分类Dev

推送到数组中的多维对象

来自分类Dev

将对象推送到 JSON 数组中

来自分类Dev

如何从 Mongoose 推送到对象中的数组?

来自分类Dev

我们如何将静态对象数组推送到另一个对象数组中?

来自分类Dev

将两个本地提交合并为一个并在 git 中推送到 master

来自分类Dev

将数据推送到json对象中

来自分类Dev

将JSON数据推送到数组中?

来自分类Dev

如何将架构对象推送到另一个架构对象的数组属性中?

Related 相关文章

  1. 1

    如何计算两个不同数组中每个对象的值并推送到新数组?

  2. 2

    如何合并包含相同键的不同值的两个对象数组,并将新对象推送到数组中?

  3. 3

    根据条件合并两个列表,然后使用Java 8将结果推送到地图

  4. 4

    在mongodb中的一个更新调用中推送到两个单独的数组

  5. 5

    如何将数组推送到对象数组中?

  6. 6

    比较两个不同的对象数组,并在API调用后找到匹配项时将数据推送到新对象

  7. 7

    将嵌套对象推送到数组中的下一个对象 [功能风格]

  8. 8

    如何将数组推送到另一个数组内的对象中?

  9. 9

    如何将代码推送到两个不同的文件夹中?

  10. 10

    猫鼬将结果推送到数组

  11. 11

    映射两个数组以查看一个属性是否匹配,然后将特定信息推送到第一个数组中

  12. 12

    将 JSON 数据推送到 ANGULAR 对象数组中

  13. 13

    Meter 将新对象推送到集合中的数组

  14. 14

    如何使用 R 将 json 对象推送到数组中

  15. 15

    使用Mongoose将项目推送到对象中的数组

  16. 16

    将对象推送到数组中,始终推送最后一个数组

  17. 17

    将获取的数据推送到对象数组

  18. 18

    将 new 作为对象推送到数组

  19. 19

    将项目推送到嵌套对象数组

  20. 20

    将js对象推送到数组

  21. 21

    比较两个数组并将结果推送到新数组

  22. 22

    推送到数组中的多维对象

  23. 23

    将对象推送到 JSON 数组中

  24. 24

    如何从 Mongoose 推送到对象中的数组?

  25. 25

    我们如何将静态对象数组推送到另一个对象数组中?

  26. 26

    将两个本地提交合并为一个并在 git 中推送到 master

  27. 27

    将数据推送到json对象中

  28. 28

    将JSON数据推送到数组中?

  29. 29

    如何将架构对象推送到另一个架构对象的数组属性中?

热门标签

归档