React Context API似乎重新渲染每个组件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React Context API似乎重新渲染每个组件相关的知识,希望对你有一定的参考价值。
我正在尝试在我的应用程序中使用新的Context API,看起来每次更新上下文时,它都会重新呈现连接到它的任何组件。我有一个沙盒演示设置来查看代码和工作问题。当您输入输入时 - 按钮上下文被渲染,反之亦然。我最初的想法是,如果输入输入,只会输出输入上下文。
这是它的工作原理还是我错过了什么?谢谢,斯宾塞
这是预期的行为。作为消费者的组件在其提供者数据更新时重新呈现。此外,shouldComponentUpdate
钩子不适用于消费者。
引用React的内容API:
作为提供者后代的所有消费者将在提供者的价值支柱发生变化时重新呈现。从Provider到其后代使用者的传播不受shouldComponentUpdate方法的约束,因此即使祖先组件退出更新,Consumer也会更新。
有关更多信息,请查看here
我避免使用react context API重新渲染的方式:
First I write my component as pure functional component:
const MyComponent = React.memo(({
somePropFromContext,
otherPropFromContext,
someRegularPropNotFromContext
}) => {
... // regular component logic
return(
... // regular component return
)
});
Then I write a function to select props from context:
function select(){
const { someSelector, otherSelector } = useContext(MyContext);
return {
somePropFromContext: someSelector,
otherPropFromContext: otherSelector,
}
}
I have my connect HOC wrote:
function connect(WrappedComponent, select){
return function(props){
const selectors = select();
return <WrappedComponent {...selectors} {...props}/>
}
}
All together
import connect from 'path/to/connect'
const MyComponent ... //previous code
function select() ... //previous code
export default connect(MyComponent, select)
Usage
<MyComponent someRegularPropNotFromContext={something} />
Demo
Conclusion
MyComponent
只有在具有新值的上下文更新中才会重新呈现,如果值相同,则不会重新呈现。此外,它还避免重新渲染MyComponent
中未使用的上下文中的任何其他值。 select中的代码将在每次上下文更新时执行,但由于它什么也没做,所以没问题,因为没有浪费重新渲染MyComponent
。
以上是关于React Context API似乎重新渲染每个组件的主要内容,如果未能解决你的问题,请参考以下文章
新的 React Context API 会触发重新渲染吗?
React (Native) Context API 导致 Stack Navigator (React Navigation 5) 在状态更新后重新渲染