3

redux-toolkit 网站上的所有示例都显示了selectIdsor 或selectAll. 使用它们中的任何一个都很简单。我有一个redux-slice我要出口的地方

export const {
  selectById: selectUserById,
  selectIds: selectUserIds,
  selectEntities: selectUserEntities,
  selectAll: selectAllUsers,
  selectTotal: selectTotalUsers
} = usersAdapter.getSelectors(state => state.users)

然后我在我的组件中导入选择器并使用 like

const valueIAmInterestedIn = useSelector(selectUserIds)

我对与selectUserById.

4

2 回答 2

13

根据文档,by id 选择器具有以下签名:selectById: (state: V, id: EntityId) => T | undefined.

因此,您可以通过以下方式在组件中调用它:

const Component = ({ id }) => {
  const item = useSelector((state) =>
    selectUserById(state, id)
  );
};

如果您在服务器上对实体进行排序/过滤,这种“规范化”的实现可能不起作用,因为状态看起来更像:

{
  data: {
    entityType: {
      //query is key and value is status and result
      //  of the api request
      'sort=name&page=1': {
        loading: false,
        requested: true,
        error: false,
        stale: false,
        ids: [1, 2],
      },
      'sort=name:desc&page=1': {
        //would have loading, requested ....
        ids: [2, 1],
      },
      data: {
        //all the data (fetched so far)
        '1': { id: 1 },
        '2': { id: 2 },
      },
    },
  },
};

我没有与“助手”合作过,因此必须对其进行研究,因为它可能有助于服务器端过滤和排序。

我也怀疑它会记住选择器:

const List = ({ items }) => (
  <ul>
    {items.map(({ id }) => (
      <Item key={id} id={id} />
    ))}
  </ul>
);
const Item = React.memo(function Item({ id }) {
  //selectUserById is called with different id during
  // a render and nothing will be memoized
  const item = useSelector((state) =>
    selectUserById(state, id)
  );
});

我创建了一个简短的文档,介绍如何使用通过重新选择创建的选择器。

于 2020-06-12T08:27:20.273 回答
1

选择器可以在selectById下面创建:

export const getLanguageById = (entityId: number) => {
  return createSelector(selectLanguageState, (state) =>
    selectById(state, entityId)
  );
};

这可以在您的组件中使用,如下所示:

const language = useSelector(languageSelectors.getLanguageById(18));

我想它更直接,更容易阅读/理解。

谢谢,马尼什

于 2021-08-09T17:17:07.027 回答