【发布时间】:2020-06-27 03:15:12
【问题描述】:
我有一个非常重(计算上)的功能组件(父),它没有状态并且具有本地状态的子子组件很少。孩子只依赖于父母发送的道具。
我将一个函数传递给其中一个孩子 (ChildA) 以更改 Parent 上变量的值。
此变量是不同子组件 (ChildB) 的道具之一,该子组件具有基于该道具的状态并在 useEffect 挂钩中更新它。
当作为 prop 传递的值在 Parent 组件上发生更改时,ChildB 组件不会重新渲染。
当然,在 Parent 上引入状态(useState 挂钩)可以解决此问题,但会一遍又一遍地重新渲染父级,并且会破坏性能,因为 Parent 有 500 多个嵌套组件,它们都会重新渲染。
引入某种 Store(Redux、MobX)可能会解决这个问题,但那将是矫枉过正。
一个简化的例子:
import React, { useEffect, useState } from "react";
export default function App() {
return <Parent />
}
const ChildA = ({ onAction }) => {
return <button onClick={onAction}>CLICK</button>;
};
const ChildB = ({ coreValue }) => {
const [value, setValue] = useState(0);
useEffect(() => {
setValue(coreValue);
}, [coreValue]);
return <div>My value: {value}</div>;
};
const Parent = () => {
let calculatedValue = 0;
const changeValue = () => {
calculatedValue += Math.random();
};
return (
<div>
<ChildA onAction={changeValue} />
<ChildB coreValue={calculatedValue} />
</div>
);
};
您可以在这里测试代码:https://codesandbox.io/s/vigilant-wave-r27rg
如何在道具更改时仅重新渲染 ChildB?
【问题讨论】:
标签: javascript reactjs react-hooks