react简单入门--常用hook中useMemo的使用(详细版)

前言:

作用:
首先useMemo它使用来做缓存用的,只有当一个依赖项改变的时候才会发生变化,否则拿缓存的值,就不用在每次渲染的时候再做计算

场景:
既然是用作缓存来用,那场景就可能有:

  1. 比如说当你登陆之后,你的个人信息一般是不会变的,当你退出登陆,重新输入另外一个人的账号密码之后,这个时候个人信息可能就变了,那这样我就可以把账号密码`两个作为依赖项,当他们变了,那就更新个人信息,否则拿缓存的值,从而达到优化的目的
  2. 也许有时候,你可能需要从A页面跳转到B页面,并携带一些参数,那就会从路由下手,类似于:http://localhost:3000/home/:id/:name或者http://localhost:3000//home?id=123&name=zhangsan,然后B页面基于这些参数做一些查询操作,那路由不变,其实这些查询出来的数据应该是不变的(当然其中包含增删改操作除外),那就可以把这些路由参数当作依赖项,只有依赖项变了,该页面的数据才会变

使用

直接上代码:

App根组件:

在这里插入图片描述
Home组件:
在这里插入图片描述
效果图:
在这里插入图片描述

效果上:

根据上面的效果图,可看出有价值可能就是控制台打印出的顺序,发现useMemo是在useEffect前面的,如果你之前对useEffct有了解的话,可能知道它可看成class组件里面的componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数的组合。 而useMemo则可以看作是componentWillUpdate函数,顺序大致如下:
在这里插入图片描述

代码上:

useMemo(参数1,参数2)

  • 参数1:是一个创建依赖项函数,该函数的返回值就是你想要缓存的数据,但形式上感觉挺想useEffect的,所以我才拿出来做对比,当然实际上两者却存在着很多差异
  • 参数2:这个是个数组,存放着被依赖的项,意思就是说只有当这个数组里面的变量发生了变化,才会调用参数1的函数,这里同样跟useEffect很像,都是依赖项变了,才会调用前面的参数1的函数

最后再来看下动态图:请添加图片描述

最后发现:
我们useMemo是加了count依赖项的,而useEffect是没有加的,所以说只有点了count+1,才会分别执行useMemouseEffect的参数1的函数,而当点了value+1useMemo不会调用参数1,而useEffect会调用参数1

至此useMemo基本用法就是这样,以及和useEffect的对比,当然还有与useMemo相对应的还有个useCallback,它是缓存函数的,感兴趣可以了解一下

<think>嗯,用户想知道在Ant Design或者React使用Antd组件时怎么用useMemo。首先,我得回忆一下useMemo的作用。它主要是用来做性能优化的,缓存计算结果,避免重复渲染。React的文档里提过,当依赖项变化时才会重新计算值,这样可以避免不必要的计算。 那用户可能是在使用Antd组件时遇到了性能问题,比如表格渲染慢,表单卡顿之类的。需要结合useMemo来优化。Antd组件本身可能有一些性能优化的措施,但用户可能在使用过程中因为数据量大或者组件嵌套深导致需要手动优化。 接下来,我应该考虑常见的应用场景。比如,处理表格的数据时,如果数据需要复杂的转换,用useMemo缓存处理后的数据。或者当传递一些配置对象给Antd组件时,避免每次渲染都生成新对象,导致子组件不必要的重渲染。 然后,用户可能需要具体的代码示例。比如在Table组件中使用useMemo来缓存dataSource或者columns,或者在Form组件中缓存表单项的配置。还要注意依赖项的正确设置,否则可能导致缓存不更新。 另外,可能需要注意Antd的一些特定用法,比如Table的rowSelection或者自定义渲染函数,这些地方使用useMemo可以有效优化。同时,要提醒用户不要滥用useMemo,只有在确实有性能问题的时候使用,否则反而增加复杂度。 可能还需要结合Antd的最佳实践,比如使用他们的hooks或者组件自身的优化选项,再配合useMemo来达到更好的效果。比如在表单联动时,缓存某些状态的计算结果,避免每次输入都触发重新渲染。 最后,用户可能还想知道在Antd的特定组件中如何正确应用useMemo,比如Modal、Select等,这些组件在处理大量数据或复杂交互时如何优化。需要给出具体的例子,说明在哪些情况下使用useMemo是有帮助的,以及如何正确编写代码。 总之,回答需要分步骤,先介绍useMemo的作用,再结合Antd组件的常见使用场景,给出具体的代码示例,最后总结注意事项和最佳实践。同时,确保引用相关的参考资料,比如Antd的文档或者React的优化建议,来增强回答的可信度。</think>在 Ant Design(Antd)组件中使用 `useMemo` 的实践方法如下: --- ### 一、`useMemo` 的核心作用 `useMemo` 是 React 提供的性能优化钩子,**用于缓存计算结果**,避免组件重复渲染时不必要的计算。其语法为: $$ \text{const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);} $$ 当依赖项 `[a, b]` 未变化时,直接返回缓存值[^2]。 --- ### 二、Antd 组件中的典型应用场景 #### 1. 缓存表格数据处理 当使用 `Table` 组件时,若需对 `dataSource` 进行复杂处理(如过滤、排序),可用 `useMemo` 优化: ```typescript import { Table } from 'antd'; const processedData = useMemo(() => { return rawData.filter(item => item.status === 'active') .map(item => ({ ...item, score: item.score * 2 })); }, [rawData]); // 仅当 rawData 变化时重新计算 <Table dataSource={processedData} />; ``` #### 2. 避免配置对象重复生成 对 `columns` 定义、`Form` 表单配置等静态/半静态数据: ```typescript const columns = useMemo(() => [ { title: 'Name', dataIndex: 'name' }, { title: 'Age', render: (text) => <Tooltip title={text}>{text}</Tooltip> } ], []); // 空依赖表示仅初始化时生成 ``` #### 3. 优化表单联动逻辑 在 `Form` 组件中处理动态依赖项时: ```typescript const form = Form.useFormInstance(); const userName = Form.useWatch('username', form); const relatedInfo = useMemo(() => { return fetchRelatedData(userName); }, [userName]); // 仅用户名变化时触发查询 ``` --- ### 三、与 Antd 组件深度结合 #### 1. 表格行选择优化 当 `rowSelection` 涉及复杂逻辑时: ```typescript const rowSelection = useMemo(() => ({ selectedRowKeys, onChange: (keys) => setSelectedRowKeys(keys), getCheckboxProps: record => ({ disabled: record.disabled }) }), [selectedRowKeys]); ``` #### 2. 下拉菜单动态选项 对 `Select` 组件的 `options` 进行缓存: ```typescript <Select options={useMemo(() => userList.map(u => ({ label: u.name, value: u.id })), [userList])} /> ``` --- ### 四、注意事项 1. **依赖项准确性**:错误的依赖数组会导致缓存失效或数据不更新 2. **避免过度优化**:简单计算无需使用 `useMemo` 3. **结合 Antd 内置优化**:如 `Table` 的 `shouldUpdate` 属性[^3] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值