Reactjs 重用的React元素可防止组件更新
Reactjs 重用的React元素可防止组件更新,reactjs,Reactjs,Foo是只应渲染一次的组件。这可以用于性能优化,尽管这只是一个纯理论问题,没有解决任何特定的编码问题 这可以通过使用shouldComponentUpdate或纯组件来实现,建议这样做: const Foo = () => <p>{Math.random()}</p>; const FooOnce = React.memo(Foo); const Bar = () => { const [, update] = useState(); useEffe
Foo
是只应渲染一次的组件。这可以用于性能优化,尽管这只是一个纯理论问题,没有解决任何特定的编码问题
这可以通过使用shouldComponentUpdate
或纯组件来实现,建议这样做:
const Foo = () => <p>{Math.random()}</p>;
const FooOnce = React.memo(Foo);
const Bar = () => {
const [, update] = useState();
useEffect(() => {
setTimeout(() => {
update({});
}, 500);
}, []);
return <>
<FooOnce/>
</>;
};
constfoo=()=>{Math.random()};
const FooOnce=React.memo(Foo);
常数条=()=>{
const[,update]=useState();
useffect(()=>{
设置超时(()=>{
更新({});
}, 500);
}, []);
返回
;
};
或者通过保留对React元素对象的引用并重用它:
const fooOnce = <Foo/>;
const Bar = () => {
const [, update] = useState();
useEffect(() => {
setTimeout(() => {
update({});
}, 500);
}, []);
return <>
{fooOnce}
</>;
};
const fooOnce=;
常数条=()=>{
const[,update]=useState();
useffect(()=>{
设置超时(()=>{
更新({});
}, 500);
}, []);
返回
{fooOnce}
;
};
当重用元素对象时,组件不会被重新渲染是很直观的,但我从自己的经验中知道这一点,而不是从官方来源。这可能会导致createElement
调用少于纯组件调用,因此这可以被视为一种优势
是否在所有React版本中记录和预期了该行为
有没有理由不以这种方式重用元素以防止组件更新?我的意思是,这是只渲染组件
一次
,而只渲染一次。
仅当
是仅包含一次条件的超集时才使用
当然,只能通过这两种方式渲染一次。但作为一个图书馆,他们只会记录适用于所有案例的内容。使用后一种使用变量的方法只是决定我们如何看待事物
不过你在这里说得很好
是否在所有React版本中记录和预期了该行为
不,我没有找到说明这种行为的文档
通过深入研究react源代码并设置一些断点,我发现通过保存和重用createElement结果(const fooOnce=;
),您可以有效地每次使用完全相同的props对象,而在每次渲染中调用createElement会每次创建一个新的props对象
目前,由于光纤引擎的函数beginWork
中存在以下条件,这确实会产生影响:如果(oldProps!==newProps | | hasLegacyContextChanged())
当props对象具有相同的标识时,react立即认为该元素没有工作要做(甚至不调用render)
对我来说,这似乎很有可能继续工作,但当然不能保证这种优化将始终与这种精确的行为保持一致
我指的代码如下:
当您仅使用法线时,最终将调用render,并且由于输出不同,它将更新DOM
当您使用React.memo时,道具将不具有相同的标识,但React将进入memo组件案例()
做一个浅层的质量比较()
是否有理由不以这种方式重用元素以防止组件更新
这可能会改变,所以我不会在生产代码中使用它
除此之外,我会避免这样做,因为如果组件更新的决定来自组件本身,因为现在要使用它,您需要更改使用者代码,而不仅仅是更改组件上的代码或向其添加包装器。为什么要确保组件不会被重新引用?这通常意味着你正试图做一些必要的事情,通常有更好的方法来实现这一点React@Aron这个问题并没有针对一个具体的案例。我想这可以用作优化技术。