当前位置: 首页 > 知识库问答 >
问题:

反应:设置吊钩闭合运行两次

屠晟睿
2023-03-14

我确信这是标准的,众所周知的行为,但我不知道如何修复它。每当我使用setState(在本例中是setTheirpokeOn)时,闭包运行两次。为了让它“一次”运行,我必须在顶部添加额外的变量,以检查它是否已经运行,如果已经运行,则将其设置为之前的状态。

        /**
         * Fires when an opponent deletes one of their Pokemon.
         * Used to update the list of opponent Pokemon.
         * @param index The index of the Pokemon to delete.
         */
        socket.on('delete_pokemon', (index: number) => {
            let past: Pokemon[] | null = null

            setTheirPokemon(theirPokemon => {
                if (past === null) {

                    //stuff, isnt important
                    const newTheirPokemon = theirPokemon.filter(pokemon => {
                        return pokemon.index !== index
                    })
                    let newIndex = 0
                    newTheirPokemon.forEach(pokemon => {
                        pokemon.index = newIndex++
                    })

                    //so it won't rerun
                    past = newTheirPokemon
                    return newTheirPokemon
                } else { 
                    return past
                }
            })
        })

有没有更好的方法,或者只运行一次?谢谢

澄清:

该组件位于useEffect内部,具有一个空的依赖性数组,因此我认为它应该只在mount上运行。钩子还来自我使用的一个单独的上下文文件,因此状态不属于这个组件,如果这很重要的话。

共有1个答案

范峰
2023-03-14

“这是StrictMode的一个故意功能。这只发生在开发过程中,有助于发现放入渲染阶段的意外副作用。我们只对带有挂钩的组件执行此操作,因为这些组件更可能在错误的位置意外产生副作用。”https://github.com/facebook/react/issues/15074

 类似资料:
  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 我正在测试新的React钩子,我遇到了一个我无法修复(也无法理解)的行为。基本上,我有我的函数组件,在它里面有一个函数,我在其中设置钩子。这个函数被传递给一个呈现的组件,并使用props从最后一个呈现的组件调用它。太糟糕了,父级的钩子没有相应地更新! 我知道这似乎很难理解,但我在这里复制了这个错误https://codesandbox.io/s/vvwp33l7o5 我不知道,似乎我不能从组件外部

  • 我在React hook中遇到了一些非常奇怪的行为。在下面的代码中(https://codesandbox.io/s/purple-bush-nb5uy?file=/src/index.js): 单击时,我们在控制台中获得以下序列: 我希望: 因为我认为如果React找到setter并在重新渲染后执行以下代码,它会立即重新渲染。此外,我的React应用程序也是如此: 当运行以及值与状态变量的内容不

  • 我正在创建一个登录页面使用反应,它允许用户使用Facebook,谷歌登录,或使用用户名和密码。我只是意识到,每次我使用Facebook登录时,都会两次调用onSubmit。只有Facebook身份验证导致此问题。正因为如此,我的后端验证被调用,并返回一个res.jsonmsg,这将在前端返回一个错误msg。如果用户决定使用Facebook登录,如何避免这种情况发生?我在社交媒体登录方面使用了反应-