第59节——redux-toolkit中的createSelector

一、概念

在 Redux Toolkit 中,createSelector 是一个函数,它允许我们从 Redux store 中选择部分状态数据,并将其作为参数传递给一个 memoized 函数,以避免在相同的输入下重复计算。此外,Redux Toolkit 中的 createSelector 还支持嵌套选择器和参数选择器,使得选择和组合 Redux store 中的状态更加灵活

二、参数说明

import { createSelector } from '@reduxjs/toolkit'

export const nameAndAge = createSelector(
  /**
   * 第一部分参数是一个或者多个输入选择器函数
   * 用户选择redux store中的一部分状态,并将其
   * 作为计算函数的参数
   * 这些输入选择器函数可以是任何具有选择状态的功能
   */
  // 所有的state,导出user模块给以下一位选手
  (state) => state.user,
  (user) => {
    /**
     * 只有当前模块的数据
     * 发生改变的时候
     * 才会触发这一系列的方法
     */
    console.log("触发了吗")
    return {
      name: user.name,
      age: user.age
    }
  }
)

三、简单例子

1、在slice目录下创建student

import { createSlice } from '@reduxjs/toolkit'


const studentSlice = createSlice({
  name: "student",
  initialState: {
    num: 1
  },
  reducers: {
    numAdd (state) {
      state.num += 1
    }
  }
})

export default studentSlice.reducer

export const { numAdd } = studentSlice.actions

2、创建selectors目录,在里面添加user.js文件

import { createSelector } from '@reduxjs/toolkit'

export const nameAndAge = createSelector(
  /**
   * 第一部分参数是一个或者多个输入选择器函数
   * 用户选择redux store中的一部分状态,并将其
   * 作为计算函数的参数
   * 这些输入选择器函数可以是任何具有选择状态的功能
   */
  // 所有的state,导出user模块给以下一位选手
  (state) => state.user,
  (user) => {
    /**
     * 只有当前模块的数据
     * 发生改变的时候
     * 才会触发这一系列的方法
     */
    console.log("触发了吗")
    return {
      name: user.name,
      age: user.age
    }
  }
)

3、页面中使用

import { nameAndAge } from "./store/selectors/user";
import { numAdd } from "./store/slices/student";
import { useSelector, useDispatch } from "react-redux";
import { useEffect } from "react";

export default function LearnReduxToolkit5() {
  /**
   * 如果要使用selector里面的数据
   * 那么必须要通过useSelector
   * 然后把对应的方法传入就可以拿到
   * 返回值
   */
  const user = useSelector(nameAndAge);

  const dispatch = useDispatch();
  useEffect(() => {
    console.log("触发了吗")
  }, [user])

  const student = useSelector((state) => state.student);

  console.log(student);
  return (
    <div>
      <div>{student.num}</div>
      <button onClick={() => dispatch(numAdd())}>+1</button>
    </div>
  );
}

四、使用场景

createSelector函数主要用于优化React应用程序中的性能,特别是在具有大量数据的情况下。它的主要用途是创建输出选择器函数,该函数将redux store中的多个状态组合并到单个值中,并将该值缓存以提高性能

1、过滤和排序数据

通过createSelector函数,可以根据多个条件从Redux store中选择数据,并使用JavaScript函数对其进行过滤、排序等处理。

2、转换数据格式

通过createSelector函数,可以将Redux store中的原始数据转换为更易于处理的格式,如图表数据,饼状图数据等。

3、避免不必要的渲染

使用createSelector函数可以避免不必要的渲染。当createSelector函数的输入参数未更改时,将从缓存中返回结果。只有当输入参数更改时,createSelector函数才会重新计算其输出,并在React组件中触发渲染。

4、避免重复计算

在Redux store中包含大量数据时,使用createSelector函数可以避免不必要的计算。例如,可以通过创建一个选择器函数,该函数选择一个对象数组并返回其长度来避免在每次计算数组长度时进行重复的大量计算

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装redux-toolkit,你可以按照以下步骤进行操作: 1. 在你的项目打开终端或命令行界面。 2. 运行以下命令来安装redux-toolkit: ``` npm install @reduxjs/toolkit ``` 或者如果你使用的是yarn,可以运行以下命令: ``` yarn add @reduxjs/toolkit ``` 3. 安装完成后,你可以在你的代码引入redux-toolkit的configureStore函数,例如: ```javascript import { configureStore } from '@reduxjs/toolkit'; ``` 4. 接下来,你可以使用configureStore函数来创建和配置你的Redux store。你可以在reducer参数传入你的reducer函数,或者使用combineReducers函数来合并多个reducer。例如: ```javascript import { configureStore, combineReducers } from '@reduxjs/toolkit'; // 导入你的reducer函数 import counterReducer from './reducers/counterReducer'; import todosReducer from './reducers/todosReducer'; // 合并多个reducer const rootReducer = combineReducers({ counter: counterReducer, todos: todosReducer, }); // 创建Redux store const store = configureStore({ reducer: rootReducer, }); ``` 5. 现在你已经成功安装了redux-toolkit并创建了Redux store,你可以在你的React组件使用Provider组件来将store传递给你的应用程序。例如: ```javascript import React from 'react'; import { Provider } from 'react-redux'; import store from './store'; import App from './App'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` 这样,你就可以在你的React组件使用Redux store了。 #### 引用[.reference_title] - *1* *3* [redux toolkit 傻瓜教学](https://blog.csdn.net/wangyangnuli/article/details/122520675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Redux流程分析 传统流程和redux-toolkit的使用](https://blog.csdn.net/qq_23539691/article/details/119720636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值