Обновлены ли в контексте, не распространенном через обычные повторные показы?Поскольку я не вижу свои журналы / изменения цвета при изменении контекста.
Обновление значений контекста не вызывает повторную визуализацию для всех дочерних элементов поставщика, а только для компонентов, которые визуализируются изнутри получателя, поэтому в вашем случае, хотя числовой компонент содержит получателяКомпонент Number не рендерится, скорее это просто функция рендеринга в Consumer, и, следовательно, значение изменяется при обновлении контекста.Таким образом, он достаточно эффективен, поскольку не запускает повторные рендеры для всех своих дочерних элементов.
Обновлены ли все потребители этого провайдера или нет?
Все потребители этого Провайдера пройдут цикл обновления, но решение о том, будут ли они повторно отображаться, определяется сравнением реагирующей виртуальной DOM.Демонстрацию этого вы можете увидеть в консоли для этой песочницы
РЕДАКТИРОВАТЬ
Что нужно, чтобы убедитьсязаключается в том, что компоненты отображаются как дочерние компоненты компонента ContextProvider, и вы передаете ему обработчики вместо их рендеринга и обновления состояния ContextProvider, потому что это вызовет повторную визуализацию всех компонентов, которые находятся в ContextProvider
Использование Исполнителя
App.js
render() {
return (
<AppContext.Provider
value={{ ...this.state, updateNumber: this.updateNumber }}
>
{this.props.children}
</AppContext.Provider>
);
}
index.js
class Data extends React.Component {
render() {
return (
<div>
<h1>Welcome to React</h1>
<Number />
<Text />
<TestComp />
<AppContext.Consumer>
{({ updateNumber }) => (
<button onClick={updateNumber}>Change Number </button>
)}
</AppContext.Consumer>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(
<App>
<Data />
</App>,
rootElement
);
Меньше использования Исполнителя
App.js
class App extends Component {
constructor() {
super();
this.state = {
number: Math.random() * 100,
text: "testing context api"
};
}
updateNumber = () => {
const randomNumber = Math.random() * 100;
this.setState({ number: randomNumber });
};
render() {
return (
<AppContext.Provider value={this.state}>
<div>
<h1>Welcome to React</h1>
<Number />
<Text />
<TestComp />
<button onClick={this.updateNumber}>Change Number </button>
</div>
</AppContext.Provider>
);
}
}