#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
.