redux 中的 createSelector 用法

redux 的 createSelector 用法

createSelector 是 Redux Toolkit 中的一个函数,它来源于 Reselect 库,并被 Redux Toolkit 重新导出以方便使用。这个函数的主要作用是创建可记忆(memoized)的选择器,允许我们从 Redux store 中选择部分状态数据,并将其作为参数传递给一个转换函数,以避免在相同的输入下重复计算。以下是 createSelector 的详细用法:

基本用法

createSelector 接受一个或多个输入选择器函数(input-selectors)和一个转换函数(transform function)作为参数。

const resultSelector = createSelector(
  inputSelector1,    // 第一个输入选择器函数
  inputSelector2,    // 第二个输入选择器函数(可选,根据需要添加)
  ...inputSelectors, // 更多输入选择器函数(可选)
  (resultOfInputSelector1, resultOfInputSelector2, ...results) => {
    // 转换函数,接收所有输入选择器函数的返回值作为参数
    // 并返回一个新的结果
  }
);

参数说明

  • 输入选择器函数(input-selectors):这些函数接收整个 Redux state 作为参数,并返回 state 中的一个片段。它们可以是任何能够选择状态片段的函数。
  • 转换函数:这是一个普通的 JavaScript 函数,它接收所有输入选择器函数的返回值作为参数,并返回一个新的值。这个新值通常是对输入数据的某种转换或计算的结果。

特点

  • 可记忆性createSelector 创建的选择器是可记忆的,意味着如果输入选择器函数的返回值没有变化,那么转换函数将不会重新执行,而是直接返回上次计算的结果。这有助于避免不必要的计算和渲染,提高应用性能。
  • 灵活性createSelector 支持嵌套选择器和参数选择器,使得选择和组合 Redux store 中的状态更加灵活。

示例

假设我们有一个 Redux store,它包含用户信息和商品列表。我们可以使用 createSelector 来创建一个选择器,该选择器返回用户的姓名和购买的商品数量。

import { createSelector } from '@reduxjs/toolkit';

// 假设这是从 Redux store 中选择用户姓名的选择器
const selectUserName = state => state.user.name;

// 假设这是从 Redux store 中选择商品列表的选择器
const selectProducts = state => state.products;

// 使用 createSelector 创建一个新的选择器
const selectUserNameAndProductCount = createSelector(
  selectUserName,
  selectProducts,
  (userName, products) => ({
    userName,
    productCount: products.length,
  })
);

// 在 React 组件中使用这个选择器
import { useSelector } from 'react-redux';

function MyComponent() {
  const { userName, productCount } = useSelector(selectUserNameAndProductCount);
  // ... 使用 userName 和 productCount 渲染组件
}

在这个示例中,selectUserNameAndProductCount 是一个选择器,它结合了 selectUserNameselectProducts 两个输入选择器,并通过转换函数生成了一个新的对象,该对象包含了用户的姓名和购买的商品数量。由于 createSelector 的可记忆性,这个选择器将只在 state.user.namestate.products 发生变化时重新计算。