举例useContext性能低下的样例,同时推荐用什么方法改进
在React中,useContext 是一种非常方便的全局状态管理工具,它可以让我们在组件之间共享状态,而不需要通过层层传递 props。然而,当我们在一个大型的 React 应用中过度使用 useContext 时,可能会遇到性能问题。这是因为当一个 context 的值改变时,所有使用这个 context 的组件都会重新渲染,即使这个组件并不需要那个改变的值。
示例
举个例子,假设我们有一个全局的用户 context,它包含了用户的详细信息和一些设置:
const UserContext = React.createContext();
function App() {
const [user, setUser] = useState({ name: 'John', age: 30, theme: 'dark' });
const handleChangeName = () => {
setUser({ ...user, name: 'AAA' });
};
return (
<UserContext.Provider value={user}>
<Profile />
<Settings />
<button onClick={handleChangeName}>Change Name</button>
</UserContext.Provider>
);
}
function Profile() {
const user = useContext(UserContext);
return <h1>Welcome, {user.name}!</h1>;
}
function Settings() {
const user = useContext(UserContext);
return <div>Your current theme is: {user.theme}</div>;
}
在这个例子中,Profile 和 Settings 组件都使用了 UserContext。如果用户的主题改变了,Profile 组件也会重新渲染,即使它并不需要知道主题的信息。
改进方法
一种改进方法是使用 React 的 useMemo或useCallback钩子来避免不必要的重新渲染。我们可以为每一个需要共享的状态创建一个单独的 context,然后使用 useMemo 或 useCallback 来确保只有当这个状态改变时,使用这个状态的组件才会重新渲染:
const NameContext = React.createContext();
const ThemeContext = React.createContext();
function App() {
console.log('App');
const [user, setUser] = useState({ name: 'John', age: 30, theme: 'dark' });
const userName = useMemo(() => user.name, [user.name]);
const userTheme = useMemo(() => user.theme, [user.theme]);
const handleChangeName = useCallback(() => {
setUser({ ...user, name: 'AAA' });
}, [user]);
return (
<>
<NameContext.Provider value={userName}>
<ThemeContext.Provider value={userTheme}>
<Profile />
<Settings />
<button onClick={handleChangeName}>Change Name</button>
</ThemeContext.Provider>
</NameContext.Provider>
</>
);
}
const Profile = React.memo(function Profile() {
console.log('Profile');
const name = useContext(NameContext);
return <h1>Welcome, {name}!</h1>;
});
const Settings = React.memo(function Settings() {
console.log('Settings');
const theme = useContext(ThemeContext);
return <h1>Your current theme is: {theme}</h1>;
});
这样,只有当相关的状态改变时,对应的组件才会重新渲染,从而提高了性能。
举例useContext性能低下的样例,同时推荐用什么方法改进的更多相关文章
- Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数
Qt 鼠标样式特效探索样例(一) 心血来潮,突然想在Qt里玩一把鼠标样式,想到在浏览网页时,经常看到漂亮的鼠标动画,于是今天摸索着乱写个粗糙的demo,来满足自己的好奇心. 效果图 方案要 ...
- C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- JPA入门样例(採用JPA的hibernate实现版本号)
(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了眼下Java持久化技术的长 ...
- RESTful设计原则和样例(开发前后台接口)
摘要 REST(表征性状态传输)设计风格;REST通常基于使用HTTP,URI协议和标准.使用URL标识资源,开发前后台接口.主要使用post,get方式 参考博文: http://www.cnblo ...
- CloudSim样例分析
自带八个样例描述: cloudsim-2.1.1\examples目录下提供了一些CloudSim样例程序,每个样例模拟的环境如下: (1)CloudSimExample1.Java:创建一个一台主机 ...
- Ajax框架,DWR介绍,应用,样例
使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...
- 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- VC6 鼠标钩子 最简单样例
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...
- SQL SERVER 变量的使用和样例
定义和使用局部变量:说明: 局部变量是用户可自定义的变量. 作用范围仅在程序内部. 局部变量的名称是用户自定义的,命名的局部变量名要符合SQL Server 2000标识符命名规则=>以@开 在 ...
随机推荐
- [开源初探]screenshot-to-code:将截图转化为代码
介绍说明 将截图转化为 HTML 代码的工具.该项目可以将屏幕截图转化为 HTML/JS/Tailwind CSS 代码,它使用 GPT-4 Vision 生成代码.DALL-E 3 生成相似的图片. ...
- #斯坦纳树,状压dp#洛谷 3264 [JLOI2015]管道连接
题目 分析 如果对于每一个频道单独跑斯坦纳树可能会存在两种频道共用一条道路而重复统计的情况, 考虑状压dp,设\(f[s]\)表示选择频道二进制状态为\(s\)的最小贡献,那么对于每个状态跑斯坦纳树然 ...
- 【Kotlin】函数
1 常规函数 1.1 无参函数 fun main() { myFun() } fun myFun() { println("myFun") // 打印: myFun } 1.2 有 ...
- 准备Python环境学习OpenCV的使用
安装venv模块,执行如下命令: sudo apt-get install python3-venv 创建venv环境,命名为images,执行如下命令: python3 -m venv images ...
- Python数据分析 numpy 笔记
B站课链接:[Python数据分析三剑客:NumPy.Pandas与Matplotlib] https://www.bilibili.com/video/BV1Yb4y1g7SV/?p=16& ...
- K8S 性能优化 - K8S APIServer 调优
前言 K8S 性能优化系列文章,本文为第二篇:Kubernetes API Server 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> 参数一览 ...
- Unity 音乐或者视频播放完毕之后执行方法
视频播放完毕后,执行某个方法 方法1 官方给的解释 private VideoPlayer video2; private void Awake() { video2.loopPointReached ...
- 树模型-label boosting-GBDT
GBDT GBDT是boosting系列算法的代表之一,其核心是 梯度+提升+决策树. GBDT回归问题 通俗的理解: 先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时 ...
- CentOS6.5安装与配置JDK-7
系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-i586.rpm 下载地址:http://www.oracle.com/technetwork/java/javas ...
- identity4 系列————用户数据持久化篇[六]
前言 前面的例子已经将各种情形下的例子已经介绍了一遍,那么后面就是用户数据持久化该如何处理了. 正文 例子位置: https://github.com/IdentityServer/IdentityS ...