reactjs - React 上下文中的函数和重新渲染
问题描述
我对新的 React Context-api 有两个问题:
- React 文档有以下示例从嵌套组件更新上下文。在构造函数中声明toggleTheme-function(而不是作为类方法)是否有某些特定原因?
import {ThemeContext, themes} from './theme-context';
import ThemeTogglerButton from './theme-toggler-button';
class App extends React.Component {
constructor(props) {
super(props);
this.toggleTheme = () => {
this.setState(state => ({
theme:
state.theme === themes.dark
? themes.light
: themes.dark,
}));
};
// State also contains the updater function so it will
// be passed down into the context provider
this.state = {
theme: themes.light,
toggleTheme: this.toggleTheme,
};
}
render() {
// The entire state is passed to the provider
return (
<ThemeContext.Provider value={this.state}>
<Content />
</ThemeContext.Provider>
);
}
}
function Content() {
return (
<div>
<ThemeTogglerButton />
</div>
);
}
ReactDOM.render(<App />, document.root);
- 在许多示例中,Provider-component 具有 high-up -component 的状态作为其值(就像在上面的示例中一样)。这意味着每次我想更新 Context-value 时,我都需要更新 high-up 组件的状态。这意味着 high-up 组件在状态更新时重新渲染,这反过来意味着它的所有子组件也重新渲染。但我想要的只是让监听该 Provider 组件的 Consumer-components 重新渲染。现在基本上每次我更新上下文值时整个应用程序都会重新渲染......我错过了什么吗?
解决方案
toggleTheme
作为回调传递,应该绑定到正确的this
. 如果它是类原型方法,则它需要this.toggleTheme = this.toggleTheme.bind(this)
在构造函数中以任何方式。请参阅此相关问题。
正如文件所述,
每当 Provider 的 value 属性发生变化时,所有作为 Provider 后代的 Consumer 都会重新渲染。从 Provider 到其后代 Consumer 的传播不受 shouldComponentUpdate 方法的约束,因此即使祖先组件退出更新,Consumer 也会更新。
包含Provider
( App
) 的组件应重新渲染以提供 new value
,而其后代则不应。在这个例子中,它的直接子元素 ( Content
) 可能是PureComponent
为了防止在整个层次结构中不必要的重新渲染。对于影响整个应用程序的上下文(如主题上下文),不会有显着的性能改进。
推荐阅读
- python - 如何将 RNN 与 CNN 结合起来
- python - 从 Logic for Dataframe 创建函数
- jmeter - 我对 Jmeter 线程组部分有疑问
- android - Webrtc 需要很长时间才能连接移动数据
- python - API 请求中止
- javascript - 删除退格 tinymce 上的整个 html 块
- python - 从 AWS S3 读取并写入 Tornado GET 响应异步?
- deep-learning - 如何为小物体选择合适的 CNN 模型?
- android-studio - Gradle 不显示整个项目树(即任务和签名报告)
- typescript - 没有泛型的类型推断?