当从组件数组中的回调调用时,React Hooks 状态更新仅应用一次
React Hooks state update applies only once when called from callbacks in an array of components
在那种情况下,我无法提升状态:
我有一个按钮,每次单击都会将元素添加到 'mylist' 到 'setMyList'。这些元素是 'Child' 组件(div className“站点”只是一个 CSS 方块),我希望每次单击其中一个 components/elements 它都会递增'count' 感谢 'setCount' 在给 'setMyList' 中的 'Child' 组件的回调中。
但是发生的事情是,例如,我创建一个正方形然后单击它,'count' 不会超过 1,然后创建另一个正方形,单击它会使 'count' 上升到 2但不会更多,依此类推。
当我在第一个方块上单击返回时 'count' 是 1,看起来状态是为每个 'Child' 组件保存的而不是递增它。
这是我的组件:
import React, { useState } from 'react'
import Child from './Child.js'
function Parent() {
const [count, setCount] = useState(0);
const [mylist, setMyList] = useState([])
function increment() {
console.log("TEST")
setCount(count + 1)
}
return (
<div className="App">
<button onClick={() => setMyList([...mylist, <Child onClick={increment}></Child>])}> </button>
<h2>count {count}</h2>
{mylist}
(count should be updated from child)
</div>
);
}
export default Parent
请注意,每次单击一个方块时,它都会进入 'increment' 函数,因为控制台日志会显示,但它会通过 setCount 而不执行任何操作。
import React, { useState } from 'react'
import "./Site.css"
function Child(props) {
return (
<div>
<div className="Site" onClick={props.onClick}></div>
</div>
)
}
export default Child
提前致谢
你应该使用 setCount((count) => count + 1)
;
这样可以保证setCount
每次都能得到最新的计数值。
这是因为每次pushChild
都会重新创建increment
函数,然后increment
函数中的count
实际上是increment
函数为created
.
时的值
此外,你可以使用React.useCallback
来优化这个。
const increment = React.useCallback(() => {
setCount((count) => count + 1);
}, []);
在那种情况下,我无法提升状态:
我有一个按钮,每次单击都会将元素添加到 'mylist' 到 'setMyList'。这些元素是 'Child' 组件(div className“站点”只是一个 CSS 方块),我希望每次单击其中一个 components/elements 它都会递增'count' 感谢 'setCount' 在给 'setMyList' 中的 'Child' 组件的回调中。
但是发生的事情是,例如,我创建一个正方形然后单击它,'count' 不会超过 1,然后创建另一个正方形,单击它会使 'count' 上升到 2但不会更多,依此类推。
当我在第一个方块上单击返回时 'count' 是 1,看起来状态是为每个 'Child' 组件保存的而不是递增它。
这是我的组件:
import React, { useState } from 'react'
import Child from './Child.js'
function Parent() {
const [count, setCount] = useState(0);
const [mylist, setMyList] = useState([])
function increment() {
console.log("TEST")
setCount(count + 1)
}
return (
<div className="App">
<button onClick={() => setMyList([...mylist, <Child onClick={increment}></Child>])}> </button>
<h2>count {count}</h2>
{mylist}
(count should be updated from child)
</div>
);
}
export default Parent
请注意,每次单击一个方块时,它都会进入 'increment' 函数,因为控制台日志会显示,但它会通过 setCount 而不执行任何操作。
import React, { useState } from 'react'
import "./Site.css"
function Child(props) {
return (
<div>
<div className="Site" onClick={props.onClick}></div>
</div>
)
}
export default Child
提前致谢
你应该使用 setCount((count) => count + 1)
;
这样可以保证setCount
每次都能得到最新的计数值。
这是因为每次pushChild
都会重新创建increment
函数,然后increment
函数中的count
实际上是increment
函数为created
.
此外,你可以使用React.useCallback
来优化这个。
const increment = React.useCallback(() => {
setCount((count) => count + 1);
}, []);