首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我是否应该使用useselector/useDispatch而不是mapStateToProps

在React和Redux的应用程序中,useSelectoruseDispatch是React-Redux库提供的Hooks API,而mapStateToPropsmapDispatchToProps是传统的Redux连接(connect)函数使用的属性映射器。以下是关于这些API的基础概念、优势、类型、应用场景以及遇到的问题和解决方案的详细解释:

基础概念

  • useSelector: 这是一个React Hook,允许组件从Redux store中选择一部分state,并订阅这些数据的变化。
  • useDispatch: 这也是一个React Hook,返回Redux store的dispatch方法,使得组件能够分发actions。
  • mapStateToProps: 这是一个函数,用于将Redux store中的state映射到React组件的props上。
  • mapDispatchToProps: 这个函数用于将dispatch方法映射到组件的props上,使得组件能够分发actions。

优势

  • useSelector/useDispatch:
    • 简洁性: 使用Hooks API可以减少样板代码,使得组件更加简洁。
    • 性能优化: useSelector提供了内置的记忆化(memoization),只有当选择器函数返回的值发生变化时,组件才会重新渲染。
    • 易于集成: Hooks API与React的其他Hooks无缝集成,便于在函数组件中使用。
  • mapStateToProps/mapDispatchToProps:
    • 兼容性: 适用于类组件和函数组件。
    • 灵活性: 可以选择性地映射state和dispatch到props,适用于复杂的组件。

类型

  • useSelector: (state, [equalityFn]) => stateFragment
  • useDispatch: () => dispatch
  • mapStateToProps: (state, [ownProps]) => stateProps
  • mapDispatchToProps: dispatch => dispatchPropsObject

应用场景

  • useSelector/useDispatch:
    • 适用于函数组件。
    • 当需要优化性能,避免不必要的渲染时。
    • 当需要与React的其他Hooks一起使用时。
  • mapStateToProps/mapDispatchToProps:
    • 适用于类组件。
    • 当需要与现有的类组件代码库集成时。
    • 当需要对映射逻辑进行复杂控制时。

遇到的问题和解决方案

问题:为什么我的组件在使用useSelector后仍然频繁重新渲染?

原因: 这可能是因为选择器函数没有正确地记忆化,或者选择的state片段在每次store更新时都发生了变化。

解决方案: 确保选择器函数是纯函数,并且只返回必要的state片段。可以使用reselect库创建记忆化的选择器。

代码语言:txt
复制
import { createSelector } from 'reselect';

const selectData = state => state.data;
const selectFilteredData = createSelector(
  [selectData],
  (data) => data.filter(item => item.isActive)
);

const MyComponent = () => {
  const filteredData = useSelector(selectFilteredData);
  // ...
};

问题:我如何在使用useDispatch时分发异步action?

解决方案: 可以使用Redux Thunk或Redux Saga等中间件来处理异步逻辑。

代码语言:txt
复制
import { useDispatch } from 'react-redux';
import { fetchData } from './actions';

const MyComponent = () => {
  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(fetchData());
  }, [dispatch]);

  // ...
};

结论

如果你正在使用函数组件,并且希望代码更加简洁和现代化,那么useSelectoruseDispatch是更好的选择。它们提供了更好的性能优化和与React Hooks的无缝集成。然而,如果你的项目中仍然有大量的类组件,或者你需要对映射逻辑进行复杂的控制,那么mapStateToPropsmapDispatchToProps可能更适合你的需求。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【小狮子前端】「Redux」概念理解+实战上手(内含大量实例)

,可能导致性能问题,除非用大量的useCallback()来包裹 - 如果代码依赖于mapStateToProps中的ownProps,那么你可能会使用redux hooks编写更多代码,不能直接拿到这个属性...可以将任何现有的自定义hooks与redux集成,不是将通过hooks创建的state,作为参数传递给其他hooks。...光看简介还不是很清楚,一个个来说: useSelector 看它的介绍,就很像mapStateToProps,但是 不提供ownProps API,最好用useCallback或useMemo来获取 和...基本思想前面介绍的差不多来,这里就不败代码,为了更直观还是用sandbox虽然不是很快: SandBox ------ useSelectoruseDispatch实战TodoList Hooks下的...对于一些场景的需求hooks没法解决: 需要保存或者加载状态 跨组件共享状态 需要与其他组件共享业务逻辑或数据处理过程 配合hooks新的redux带来的不一样的改变:通过使用useSelectoruseDispatch

1.4K00

dvajs中@connect在hook下使用

在类组件中使用 @connect 是非常直观的,但在函数式组件(hook)中,由于函数组件的渲染逻辑是由函数本身直接定义的,不是通过继承 React.Component,因此我们不能直接使用 @connect...在函数式组件中,我们可以使用 useSelectoruseDispatch 这两个 hooks 来分别获取 state 和 dispatch action。...} from 'antd'; const mapStateToProps = (state) => { return { home: state.home, }; }; const...如果你想要使用 hooks 的方式,可以这样写: import React from 'react'; import { useSelector, useDispatch } from 'dva'; import...useSelector 来获取 state 中的 home 数据,使用 useDispatch 来获取 dispatch 函数,然后在事件处理函数中调用 dispatch 来更新 state。

12510
  • 为什么应该使用指针不是对象本身

    问题 之前一直使用 Java,现在开始转向 C++。...发现使用 C++ 的人经常用指针表示对象,比如像下面这样: Object *myObject = new Object; 不是, Object myObject; 或者在调用成员函数的时候,都会这样...: myObject->testFunc(); 不是, myObject.testFunc(); 有点想不明白为什么这么做?...什么时候该使用 new? 你需要延长对象生命周期。 意思是说你想一直使用某个地址位置的变量,不是它的副本,对于后者,我们更应该使用 Object myObject; 的语法。 你需要很多内存。...当你确实要用动态内存分配的话,我们应该用智能指针或者其它的 RAII 技术来管理这部分资源。 什么时候该使用指针? 不过,除了动态分配内存之外,原始指针还有其它用途。

    1.4K10

    Redux with Hooks

    主要用到的API: import { useSelector, useDispatch } from 'react-redux' // selector函数的用法和mapStateToProps相似,...其返回值会作为useSelector的返回值,但与mapStateToProps不同的是,前者可以返回任何类型的值(不止是一个对象),此外没有第二个参数ownProps(因为可以在组件内通过闭包拿到)...: Function) const dispatch = useDispatch() 使用: ... import { useSelector, useDispatch } from "react-redux...,然后把需要使用dispatch的逻辑定义在组件内部,最大差异是把提取state的地方从mapStateToProps变成useSelector。...两者的用法相近,但如果你想后者像前者一样返回一个对象的话要特别注意: 由于useSelector内部默认是使用===来判断前后两次selector函数的计算结果是否相同的(如果不相同就会触发组件re-render

    3.3K60

    Taro 小程序开发大型实战(四):使用 Hooks 版的 Redux 实现应用状态管理(上篇)

    回到我们的页面逻辑,我们在底部有两个 Tab 栏,一个为 "首页",一个为 "的",在 ”首页“ 里面主要是展示一列文章和允许添加文章等,在 ”的“ 里面主要是允许用户进行登录并展示登录信息,所以整体上我们的逻辑有两类...这里使用常量不是直接硬编码字符串的目的是为了代码的可维护性。...useSelector Hooks useSelector 允许你使用 selector 函数从一个 Redux Store 中获取数据。...但 useSelector 还是和 mapStateToProps 有一些不同: •不像 mapStateToProps 只返回对象一样,Selector 可能会返回任何值。...•接着我们使用 useSelector 中取到我们需要的 nickName 属性,用于进行双取反转换成布尔值 isLogged,表示是否登录。

    2.2K21

    ReactReactNative 状态管理: redux-toolkit 如何使用

    有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。...ToolkitTodoApp 是下一步要创建的 UI 组件 最后一步,业务组件中通过 useSelectoruseDispatch 获取数据和分发行为: import {useState} from..."react"; import { useDispatch, useSelector } from "react-redux"; import { State, TODO } from ".....//这里的名称,决定了获取数据时,需要访问的对象名称 reducer: { todo: todoReducer } }); state.todo.todos; 一开始使用...另外,使用 useDispatch 分发行为时也需要注意:传递的参数是 createSlice 后导出的 action,参数类型需要和 这个 action 的 payload 类型一样。

    1.7K40

    聊聊两个状态管理库 Redux & Recoil

    简单整理了一些目前主流的: Redux React Context & useReducer Mobx Recoil react-sweet-state hox 这几个都是接触过的,Npm 上的现状和趋势对比..., mapDispatchToProps)(Tasks); 当然也可以不用connect, react-redux 提供了 useDispatch, useSelector 两个hook, 也很方便。...import { useDispatch, useSelector } from 'react-redux'; const Tasks = () => { const dispatch = useDispatch...相对于整个应用程序中的其他原子和选择器,该字符串应该是唯一的. get:作为对象传递的函数{ get },其中get是从其他案atom或selector检索值的函数。...redux, 我们的习惯是, 把容器组件连接到store上, 至于子组件,哪怕往下传一层,也没什么所谓。 想,Recoil 这么设计,可能是十分注重性能问题,优化超大应用的性能表现。

    3.5K10

    为什么推荐大家使用 Nginx 不是 Apache?

    无论是 Nginx 还是 Apache 都是 Web 服务器应用,通俗点说我们的网站都是需要 Web 服务器应用来展现给客户的,服务器是供 Web 服务器应用正常稳定的运行的基础。...目前比较主流的 Web 服务器应用也就是 Nginx 和 Apache 了,今天就给大家阐述一下为什么一直都推荐大家使用 Nginx 不是 Apache? ?...有关 Nginx 和 Apache 的介绍就不做赘述了,大家自行百度、谷歌一下就可以了解了,废话不多说了,直奔主题: 1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接...Nginx 采用 C 进行编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好很多。 ?...这里要注意一点,epoll(freebsd 上是 kqueue)网络 IO 模型是 Nginx 处理性能高的根本理由,但并不是所有的情况下都是 epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件

    2.4K20

    什么时候应该使用螺纹铣削不是丝锥加工螺纹?

    4.如果使用丝锥,当然可以使用电火花打断折断的部分,但过程将非常复杂,如果对零件造成损坏,则会有损失。...如果使用螺纹铣刀,首先,由于力小,因此不容易折断;即使断裂,由于加工孔的直径大于刀具的直径,因此可以容易地取出折断部分。就产品产量而言,螺纹铣削比丝锥高得多。 5.形成粘性切屑不容易。...处理起来稍微容易一些,如果是小洞就很麻烦,比如: 在加工普通螺纹时,考虑到单件成本,螺纹铣削不是经济高效的。普通螺纹分类为一般硬度小于50HRC,直径小于38 mm的螺纹,尽管这并不是明显的分界线。...应用 CNC螺纹铣削 1.高硬度材料加工(硬度> 50HRC),适合螺纹铣削,因为铣削断屑,局部接触刀具小,刀片由硬质合金制成,磨损小,使用寿命长;一般的高速钢丝锥根本无法加工,例如使用整体硬质合金丝锥

    23130

    Redux原理分析以及使用详解(TS && JS)

    毕竟react- thunk对于一个项目本身而言,毫无侵入,使用极其简单,只需引入这个中间件就行了。react- saga则要求较高,难度较大,现在也并没有掌握和实践这种异步流的管理方式。...可使用 process.env.NODE_ENV === 'production' 判断不同环境,或者使用 window.location.host 获取url地址来进行判断是否开启这个插件。...首先我们在组件当中使用redux,就需要使用react- redux中的connect将该组件与store连接起来,connect又可以接受两个参数,分别是mapStateToProps和mapDispatchToProps...TS的用法(取值以及触发action) import { useDispatch, useSelector } from 'react-redux' ​ const ManageTable: React.FC... = () => { const dispatch = useDispatch() const userNameRedux = useSelector((state: any)

    4.3K30

    Taro 小程序开发大型实战(九):使用 Authing 打造拥有微信登录的企业级用户系统

    ,这里图雀酱选择了微信登录,然后在弹出的扫码界面,使用微信扫码二维码登录。登录之后,会弹出一个界面让你绑定手机号,读者这里可以自行选择是否绑定。...当然上面的手机号瞎输入的,读者请自行输入自己的手机号尝试,接着应该可以在手机上收到验证码短信: ? Boom?!可以看到简单几行代码,我们就搞定了手机验证码的发送。...清理其他登出逻辑 因为目前我们的登陆不是之前的使用 nickName 和 avatar ,而是使用手机号+验证码,所以我们一登录之后默认的 nickName 为空,而我们之前的判断用户是否登录的组件逻辑都是判断...小结 在这一节中,我们呼应使用 Authing 登录的逻辑,对应修改了登出逻辑,并且使用 userId 替换 nickName 作为是否登录的判断标准。...安装 SDK 我们的微信小程序后台使用了云函数,云函数是一个个的 Node.js 函数, Authing 为我们提供了 Node.js 的 SDK npm 包,我们马上来安装它,在 functions

    2.1K30

    为什么在 Linux 上使用 exa 不是 ls?

    我们生活在一个繁忙的世界里,当我们需要查找文件和数据时,使用 ls 命令可以节省时间和精力。但如果不经过大量调整,默认的 ls 输出并不十分舒心。...这个工具是用 Rust 编写的,该语言以并行性和安全性闻名。...它使用颜色来区分文件类型和元数据。它能识别符号链接、扩展属性和 Git。而且它体积小、速度快,只有一个二进制文件。 跟踪文件 你可以使用 exa 来跟踪某个 Git 仓库中新增的文件。...image.png 相信 `exa 是最简单、最容易适应的工具之一。它帮助我跟踪了很多 Git 和 Maven 文件。...它的颜色编码让更容易在多个子目录中进行搜索,它还能帮助我了解当前的 xattrs。

    2K40
    领券