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

标签 javascript reactjs react-context

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

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

我在这里做错了什么?

最佳答案

您的 ContextHandler 类是在 Wrapper 组件的渲染函数中实现的,这意味着将在每次渲染时创建一个全新的实例。要解决您的问题,请将 ContextHandler 的实现从 Wrapper 的渲染函数中提取出来。

关于javascript - 父级更新会导致上下文使用者重新安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483564/

相关文章:

javascript - 带有 semantic-ui-react 和 webpack 的图像组件的路径

javascript - 如何在 Material-UI 中使图像响应

javascript - Eslint 在 React 组件中将字符串视为数组

reactjs - 是否可以在 react 组件之外更新上下文状态?

javascript - 与条件 promise 链使用react并在发送调度之前等待它们全部

javascript - react ,在使用 useContext 时得到未定义的结果

javascript - 僧侣发现返回奇怪的 json

javascript - 使用 Javascript 更改元素的焦点处理程序?

javascript - Javascript 无法将 HSV 转换为 RGB

javascript - Vimeo 视频灯箱