javascript - 使用 ContextAPI 不会重新呈现其使用者,但会更改内容。为什么?
问题描述
考虑这个小例子。在通过本书学习的同时,我对 Context API 做了一些实验。
const MyContext = React.createContext(0);
const D3 = () => {
console.log('render D3');
return <MyContext.Consumer>{num => `${num}`}</MyContext.Consumer>;
};
const D2 = React.memo(() => {
console.log('render D2');
return <D3 />;
});
const D1 = React.memo(() => {
console.log('render D1');
return <D2 />;
});
const App = () => {
const [num, setNum] = useState(0);
console.log('render App');
return (
<div>
<MyContext.Provider value={num}>
<D1 />
</MyContext.Provider>
<input type='button' onClick={() => { setNum(Math.random()) }} />
</div>);
};
ReactDOM.render(<App />, document.querySelector('#root'));
当我点击按钮时,我可以看到我的小号正在改变。另请注意,App
每次单击时都会呈现,而D1
不是D2
。我明白了这其中的原因。
但奇怪的是,当按钮被点击时,D3
并没有被重新渲染!它的内容仍然在变化。究竟发生了什么?
解决方案
孩子<MyContext.Consumer>
被重新渲染。这样做可以看到:
const D3 = () => {
console.log('render D3');
return <MyContext.Consumer>{num => {console.log('CONSUMER'}; return num;}}</MyContext.Consumer>;
};
推荐阅读
- javascript - 将数组拆分为 20 项部分,并将剩余部分拆分为 vanillaJS
- python - 如何在 Python 中标记关键字并添加到新列
- minecraft - 在 1.17 的游戏面板上安装 Minecraft Mods
- go - 移位和逻辑运算给出意想不到的答案
- python - numpy : 要插入的浮点索引
- c++ - 当我重新运行我的 c++ 程序时,更新 App.Config 不会更新值?
- python - 使用 .to_csv 保存 .txt 文件的问题 - Python - Pandas
- ginkgo - 如何使用银杏测试框架运行单一规范
- reactjs - 这个文件是什么?=#.##
- java - ARCore 与 GPS 的对齐