redux中的选择器是什么?

dag*_*da1 43 reactjs redux redux-saga

我想按照这个代码redux-saga

export const getUser = (state, login) => state.entities.users[login]
export const getRepo = (state, fullName) => state.entities.repos[fullName]
Run Code Online (Sandbox Code Playgroud)

然后将其像传奇使用:

import { getUser } from '../reducers/selectors'

// load user unless it is cached
function* loadUser(login, requiredFields) {
  const user = yield select(getUser, login)
  if (!user || requiredFields.some(key => !user.hasOwnProperty(key))) {
    yield call(fetchUser, login)
  }
}
Run Code Online (Sandbox Code Playgroud)

这种getUser减速器(甚至是减速器)与我通常期望的减速器看起来非常不同.

任何人都可以解释选择器是什么,getUser减速器是如何以及它如何适应redux-saga?

hor*_*ryd 61

getUser 它不是一个reducer,它确实是一个选择器,也就是说,一个知道如何从商店中提取特定数据的函数.

选择器提供了一个额外的层,这样如果你改变了你的商店结构并且突然间你users不再在那里state.entities.users而是在state.users.objects.entities(或者其他),那么你只需要更新getUser选择器而不是你应用程序中你所做的每个地方引用旧位置.

这使得它们在重构Redux商店时特别方便.

  • 将其称为“选择器”是含糊不清的,难道他们找不到更好的自我记录名称吗?像存储访问封装器。 (2认同)
  • @shinzou 天啊,我很庆幸他们没有选择“商店访问封装器” (2认同)

Ori*_*ori 13

选择器是redux状态的getter.像getter一样,选择器封装了状态的结构,并且是可重用的.选择器还可以计算派生属性.

您可以编写选择器,例如您在redux-saga中看到的选择器.例如:

const getUsersNumber = ({ users }) => users.length;

const getUsersIds = ({ users }) => users.map(({ id }) => id);
Run Code Online (Sandbox Code Playgroud)

等等...

您还可以使用reselect,它是Redux的一个简单的"选择器"库,它可以记住选择器以提高它们的效率.