是否已更新到未通过通常的重新渲染传播的上下文?因为当上下文发生变化时,我看不到我的日志/颜色发生变化。
上下文值的更新不会触发提供者的所有子项的重新渲染,而只会触发从消费者内部渲染的组件,因此在您的情况下,尽管数字组件包含消费者,但不会重新渲染数字组件,而只是 Consumer 中的 render 函数,因此值在上下文更新时会发生变化。这样它的性能非常好,因为它不会触发所有子项的重新渲染。
该 Provider 的所有消费者是否都更新了?
该 Provider 的所有消费者都将经历一个更新周期,但是否重新渲染由 react 虚拟 DOM 比较决定。您可以在此沙箱的控制台中看到此演示
编辑
您需要确保组件被渲染为 ContextProvider 组件的子组件,并且您将处理程序传递给它而不是内联渲染它们并更新 ContextProvider 的状态,因为这将触发所有组件的重新渲染。这 ContextProvider
性能使用
应用程序.js
constructor() {
super();
this.state = {
number: Math.random() * 100,
text: "testing context api"
updateNumber: this.updateNumber,
};
}
render() {
return (
<AppContext.Provider
value={this.state}
>
{this.props.children}
</AppContext.Provider>
);
}
索引.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
);
低性能使用
应用程序.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>
);
}
}