父级更新导致重新安装上下文使用者吗?

时间:2019-04-02 21:06:09

标签: javascript reactjs react-context

我有一个包装器组件,该组件创建一个上下文使用者,并将上下文值作为道具传递给处理程序组件。当包装器组件的父组件更新时,这将导致我的处理程序组件重新安装,而不仅仅是更新。

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组件将重新安装,这将导致其状态重置。它应该只是更新/协调并维护状态。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

您的ContextHandler类在Wrapper组件的render函数中实现,这意味着将在每个渲染上创建一个全新的实例。要解决您的问题,请将ContextHandler的实现从Wrapper的呈现函数中拉出。