Я использую новый контекстный API реакции (v16.6.0 или выше), объявив public static contextType
внутри компонента, который использует контекст.Это работает нормально, пока компонент, который объявляет Provider
, напрямую не использует компонент, который использует контекст в своем методе render()
.
Пример:
ParentWithContext
Это компонент, который создает и предоставляет контекст.
export const SomeContext = React.createContext({
someValue: false
});
export default class ParentWithContext extends Component {
public render(){
const contextValue = {someValue: true};
return (
<SomeContext.Provider value={contextValue}>
<ChildOne />
{this.props.children}
</SomeContext.Provider>
);
}
}
Обратите внимание, что этот компонент использует компонент ChildOne
(см. Ниже)в его методе render()
.
ChildOne и ChildTwo
Эти два компонента просто используют вышеуказанный контекст и отображают его.
export default class ChildOne extends Component {
public static contextType = SomeContext;
public render(){
return (
<div>
{`Context of ChildOne: ${this.context.someValue}`}
</div>
);
}
}
export default class ChildTwo extends Component {
public static contextType = SomeContext;
public render(){
return (
<div>
{`Context of ChildTwo: ${this.context.someValue}`}
</div>
);
}
}
index.tsx
class App extends Component {
render() {
return (
<ParentWithContext>
<ChildTwo />
<ChildOne />
</ParentWithContext>
);
}
}
Запуск этого примера приведет к следующим строкам:
Context of ChildOne: undefined
Context of ChildTwo: true
Context of ChildOne: undefined
Так что ChildTwo
, кажется, получает правильную информациюот this.context
, в то время как ChildOne
ничего не получает.
Теперь возникает странная часть (для меня): когда вы удаляете <ChildOne/>
из ParentWithContext
, он неожиданно работает как для ChildOne
, так и ChildTwo
Новый ParentWithContext
export default class ParentWithContext extends Component {
public render(){
const contextValue = {someValue: true};
return (
<SomeContext.Provider value={contextValue}>
{this.props.children}
</SomeContext.Provider>
);
}
}
Новый вывод HTML
Context of ChildTwo: true
Context of ChildOne: true
Рабочий код
Вопрос
Почему не работает API контекста (> = v16.6) (использование static contextType
), когда компонент Provider
напрямую использует дочерний компонент, который использует контекст в своей функции render()
?Это ошибка или известное ограничение?Я что-то пропустил?
Дополнительная информация
Использование <SomeContext.Consumer>
будет работать должным образом.
export default class ChildOne extends Component {
public render(){
return (
<SomeContext.Consumer>
{context =>
<div>
{`Context of ChildOne: ${context.someValue}`}
</div>
}
</SomeContext.Consumer>
);
}
}
Конечно, это не решение этой проблемы, но может бытьполезная информация.