我正在尝试在我的应用程序中使用新的Context API,但每次更新上下文时,与之连接的任何组件都会重新渲染。我已经设置了沙箱演示以查看代码和工作问题。当您在输入框中键入时,按钮上下文被呈现,反之亦然。我最初的想法是,如果您在输入框中键入,只会打印出输入上下文。
这是它的工作方式还是我错过了什么? 谢谢, Spencer
这是它的工作方式还是我错过了什么? 谢谢, Spencer
我避免使用React Context API重新渲染的方法:
const MyComponent = React.memo(({
somePropFromContext,
otherPropFromContext,
someRegularPropNotFromContext
}) => {
... // regular component logic
return(
... // regular component return
)
});
function select(){
const { someSelector, otherSelector } = useContext(MyContext);
return {
somePropFromContext: someSelector,
otherPropFromContext: otherSelector,
}
}
function connect(WrappedComponent, select){
return function(props){
const selectors = select();
return <WrappedComponent {...selectors} {...props}/>
}
}
import connect from 'path/to/connect'
const MyComponent ... //previous code
function select() ... //previous code
export default connect(MyComponent, select)
<MyComponent someRegularPropNotFromContext={something} />
MyComponent
只有当特定上下文中的属性更新为新值时才会重新渲染,如果值相同,则不会重新渲染。此外,它避免了在 MyComponent
中未使用的上下文中的任何其他值上重新渲染。选择器内的代码每次上下文更新时都会执行,但由于它不执行任何操作,所以没有浪费重新渲染 MyComponent
。
shouldComponentUpdate
钩子不适用于 Consumers。shouldComponentUpdate()
钩子来确定是否需要重新渲染。这应该可以解决你的问题,对吧? - Matthew Barbara