当前位置: 首页 > news >正文

React useMemo和redux createSelector的区别

目录

一、createSelector

二、useMemo

三、主要区别

四、使用建议

使用 createSelector 的情况:

使用 useMemo 的情况:

五、组合使用

六、总结

七、createSelector使用案例


createSelector 和 useMemo 都是用于性能优化的记忆化(memoization)工具,但它们在用途、使用场景和实现机制上有重要区别:

一、createSelector

(Redux Toolkit/Reselect)

官网文档:https://redux.js.org/usage/deriving-data-selectors#createselector-overview

主要用于 Redux store state 的派生数据计算:

import { createSelector } from '@reduxjs/toolkit'const selectUsers = state => state.users
const selectFilters = state => state.filters// 创建记忆化的selector
export const selectFilteredUsers = createSelector([selectUsers, selectFilters],(users, filters) => {// 只有当 users 或 filters 改变时才重新计算return users.filter(user => user.name.includes(filters.search) && user.active === filters.activeOnly)}
)// 在组件中使用
const filteredUsers = useSelector(selectFilteredUsers)

二、useMemo

(React Hook)

主要用于 组件内部 的昂贵计算:

import { useMemo } from 'react'function UserList({ users, filters }) {const filteredUsers = useMemo(() => {// 只有当 users 或 filters 改变时才重新计算return users.filter(user => user.name.includes(filters.search) && user.active === filters.activeOnly)}, [users, filters])return <div>{/* 渲染 filteredUsers */}</div>
}

三、主要区别

特性createSelectoruseMemo
使用场景Redux state 派生数据组件内部计算
依赖来源Redux store state组件 props/state
记忆化范围全局(整个应用)组件实例级别
重新计算时机输入selector结果变化时依赖数组变化时
缓存策略默认浅比较,可自定义引用比较(Object.is)
测试易于单独测试需要组件测试

四、使用建议

使用 createSelector 的情况:
  • 从 Redux store 派生复杂数据

  • 多个组件需要相同的派生数据

  • 数据转换逻辑复杂或计算昂贵

// 推荐:复杂的Redux数据转换
export const selectUserStats = createSelector([selectUsers],(users) => ({total: users.length,active: users.filter(u => u.active).length,inactive: users.filter(u => !u.active).length})
)
使用 useMemo 的情况:
  • 组件内部的昂贵计算

  • 基于 props 或本地 state 的派生数据

  • 优化子组件重渲染

// 推荐:组件内部计算
function Chart({ data, config }) {const processedData = useMemo(() => {return data.map(item => ({...item,value: item.value * config.multiplier}))}, [data, config])return <LineChart data={processedData} />
}

五、组合使用

两者可以结合使用以获得最佳性能:

// Redux selector - 第一层记忆化
export const selectProcessedData = createSelector([selectRawData],(rawData) => rawData.map(processRawData)
)// 组件内 - 第二层记忆化
function DataVisualization() {const processedData = useSelector(selectProcessedData)const [sortOrder, setSortOrder] = useState('asc')const sortedData = useMemo(() => {return [...processedData].sort((a, b) => sortOrder === 'asc' ? a.value - b.value : b.value - a.value)}, [processedData, sortOrder])return <DataTable data={sortedData} />
}

六、总结

createSelector 用于 Redux 状态管理的记忆化,而 useMemo 用于 React 组件内部的记忆化。根据数据来源和使用场景选择合适的工具。

七、createSelector使用案例

import { createSelector } from 'reselect'`输入选择器:从状态中提取原始数据`
const selectUser = (state) => state.user       【state.user 是 Redux Store 中的一个 slice】
const selectPosts = (state) => state.posts     【state.posts 是 Redux Store 中的一个 slice】`Reselect 的 createSelector 会按顺序将 输入选择器的返回值,作为参数传递给转换函数。因此,转换函数中的user  对应 selectUser的返回值(即state.user)posts 对应 selectPosts的返回值(即state.posts)`
const selectUserData = createSelector([selectUser, selectPosts],    `【输入选择器数组】`(user, posts) => ({           `【转换函数】`username: user.name,postCount: posts.length,})
)

组件中使用:

import { useSelector } from 'react-redux'
import { selectUserData } from './selectors'const Component = () => {const { username, postCount } = useSelector(selectUserData)return (<div><h3>{username}</h3><p>Posts: {postCount}</p></div>)
}

到此!

http://www.dtcms.com/a/594419.html

相关文章:

  • 唐山网站建设阿里巴巴1688登录入口
  • C++使用TaggedPointer的方式实现高效编译时多态
  • 性能测试、负载测试、压力测试关联和区别
  • 石狮网站建设公司哪家好云南建设工程信息网站
  • 易思网站管理系统深圳网站建设专家
  • (Arxiv-2025)KALEIDO:开源的多主体参考视频生成模型
  • 天津的网站建设公司哪家好土巴兔装修平台电话
  • 【02】深入理解Harris角点检测:从原理推导到实战实现
  • 防城港建设局网站类似游侠客网站建设
  • wordpress 仿站教程东圃手机网站建设电话
  • 3网站建设k大原画培训班官网
  • Spark的persist和cache
  • 28V直流电源简要技术方案
  • 门户网站建设管理总则wordpress linux 下载
  • Web开发核心概念集合
  • 建设施工合同百度权重优化软件
  • Day58 | Java IO模块概览
  • 新闻联播(2025年11月10日总第二期)
  • 学校后勤网站建设方案wordpress 优惠卷
  • 合肥义城建设集团有限公司网站四川省住房城乡建设厅网站
  • 青岛网站制作seo建设网站需要服务器
  • 企业级 ERP 安全隐患全景:接口未鉴权、默认配置与远程执行的系统性剖析
  • 做视频的素材网站阿里云 域名申请
  • 自己建设网站容易吗哪个网站做图片外链
  • 分布式专题——50 电商项目仿京东商品搜索服务实战
  • 第三方应用软件提权之symantic pcanywhere提权
  • 科普:LLM领域中的“样本(sample)”、“指令(instruction)”和“提示词(prompt)”
  • 宁波网站运营优化系统推广营销方案
  • 【WIP】大模型运维中GPU机器介绍
  • 在家没事做建什么网站好joomla 网站建设教程