我确信这是标准的,众所周知的行为,但我不知道如何修复它。每当我使用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上运行。钩子还来自我使用的一个单独的上下文文件,因此状态不属于这个组件,如果这很重要的话。
“这是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登录,如何避免这种情况发生?我在社交媒体登录方面使用了反应-