我试图记住一个子组件,它包含一个函数,该函数设置父数组状态的值并依赖于父数组状态。然而,这意味着如果我将父数组状态作为依赖项,重新呈现的数量不会有显著改善。
const Parent = () => {
const [state, setState] = useState([{},{},{}]);
const setA = (index, a) => {
let copyArr = [...state];
copyArr[index] = a;
setState(copyArr);
}
return (
state.map((item, index)=>{
<Child index={index} item={item} setA={setA}>
}
)
}
const Child = ({index, item, setA}) => {
return (
<View>
<Button onClick={() => {setA(index, Math.randInt(0,100))}>
<Text>{item.a}</Text>
</View>
)
}
到目前为止我尝试的是
const Parent = () => {
const [state, setState] = useState([{},{},{}]);
const setA = React.useCallBack((index, a) => {
let copyArr = [...state];
copyArr[index] = a;
setState(copyArr);
}, [state]);
return (
state.map((item, index)=>{
<Child index={index} item={item} setA={setA}>
}
)
}
const Child = React.memo(({index, item, setA}) => {
return (
<View>
<Button onClick={() => {setA(index, Math.randInt(0,100))}>
<Text>{item.a}</Text>
</View>
)
});
然而,这并不重要,因为无论何时状态作为一个数组被更新,由于函数被重新创建,所有的兄弟组件都会重新呈现。
或者,如果我不在依赖项数组中使用state,则函数不会重新创建,状态在内部也不会改变(闭包)。
我想知道是否有一种方法可以在不对结构进行重大改革的情况下适当地实现这一目标。
2条答案
按热度按时间2ledvvac1#
不必复制当前状态,而是使用以前的状态:
现在,您可以从依赖项列表中移除状态
hgb9j2n62#
1.编写泛型
update(arr, index, value)
函数1.使用
useCallback
钩子创建记忆回调1.在
setState
调用中使用functional update从回调中删除所有依赖项。在父组件中,我们创建记忆回调并将其传递给子组件-
现在
Child
仅在index
、item,
或setA
更改时重新渲染-型