我有一个包装器组件,该组件创建一个上下文使用者,并将上下文值作为道具传递给处理程序组件。当包装器组件的父组件更新时,这将导致我的处理程序组件重新安装,而不仅仅是更新。
const Wrapper = forwardRef((props, ref) => {
class ContextHandler extends Component {
componentDidMount() {
// handle the context as a side effect
}
render() {
const { data, children } = this.props;
return (
<div ref={ref} {...data}>{children}</div>
);
}
}
return (
<Context.Consumer>
{
context => (
<ContextHandler
data={props}
context={context}
>
{props.children}
</ContextHandler>
)
}
</Context.Consumer>
);
});
我将包装器放在父组件中:
class Parent extends Component {
state = {
toggle: false
}
updateMe = () => {
this.setState(({toggle}) => ({toggle: !toggle}))
}
render() {
const { children, data } = this.props;
return (
<Wrapper
onClick={this.updateMe}
{...data}
ref={me => this.node = me}
>
{children}
</Wrapper>
)
}
}
当我单击Wrapper
并在Parent
中进行更新时,ContextHandler
组件将重新安装,这将导致其状态重置。它应该只是更新/协调并维护状态。
我在这里做什么错了?
答案 0 :(得分:1)
您的ContextHandler
类在Wrapper组件的render函数中实现,这意味着将在每个渲染上创建一个全新的实例。要解决您的问题,请将ContextHandler
的实现从Wrapper
的呈现函数中拉出。