Родительское обновление вызывает повторную установку потребителя контекста?

#javascript #reactjs #react-context

#javascript #reactjs #реагировать-контекст

Вопрос:

У меня есть компонент-оболочка, который создает потребителя контекста и передает значение контекста в качестве реквизита компоненту обработчика. Когда родительский компонент оболочки обновляется, это приводит к повторному подключению моего компонента-обработчика вместо простого обновления.

 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. Вы имеете в виду повторный рендеринг вместо повторного подключения?

2. Нет, я имею в виду повторное подключение

3. Это также может быть связано с использованием forwardRef в качестве функционального компонента, в этом случае вы можете попробовать переключиться на HOC.

4. У меня есть ContextHandler внутри ContextHandler, но я подумал, что смысл использования context в том, чтобы иметь возможность передавать данные через несколько уровней без проблем?

5. Также контекст, который передается в ContextHandler, никогда не обновляется. Это передается только один раз.

Ответ №1:

Ваш ContextHandler класс реализован в функции рендеринга компонента-оболочки, что означает, что при каждом рендеринге будет создаваться совершенно новый экземпляр. Чтобы устранить вашу проблему, извлеките реализацию ContextHandler из функции рендеринга для Wrapper .