首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用从selectById生成的createEntityAdapter选择器

如何使用从selectById生成的createEntityAdapter选择器
EN

Stack Overflow用户
提问于 2020-06-12 00:50:46
回答 2查看 7.1K关注 0票数 4

redux工具包网站上的所有示例都显示了selectIdsselectAll的使用情况。使用这两种方法都很简单。我有一个redux-slice从我出口的地方

代码语言:javascript
复制
export const {
  selectById: selectUserById,
  selectIds: selectUserIds,
  selectEntities: selectUserEntities,
  selectAll: selectAllUsers,
  selectTotal: selectTotalUsers
} = usersAdapter.getSelectors(state => state.users)

然后在组件中导入选择器,并使用以下命令

代码语言:javascript
复制
const valueIAmInterestedIn = useSelector(selectUserIds)

我对与selectUserById的使用有关的代码感兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-12 08:27:20

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

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

代码语言:javascript
复制
const Component = ({ id }) => {
  const item = useSelector((state) =>
    selectUserById(state, id)
  );
};

如果对服务器上的实体进行排序/筛选,“正常化”的这种实现可能无法工作,因为状态看起来更像:

代码语言:javascript
复制
{
  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 },
      },
    },
  },
};

我没有与“助手”一起工作,所以必须研究它,因为它可能会为服务器端过滤和排序提供便利。

我也怀疑它是否会让选择者回忆录:

代码语言:javascript
复制
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)
  );
});

我已经创建了一个简短的文档,说明如何使用通过重新选择创建的选择器

票数 14
EN

Stack Overflow用户

发布于 2021-08-09 17:17:07

可以在selectById之上创建选择器,如下所示:

代码语言:javascript
复制
export const getLanguageById = (entityId: number) => {
  return createSelector(selectLanguageState, (state) =>
    selectById(state, entityId)
  );
};

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

代码语言:javascript
复制
const language = useSelector(languageSelectors.getLanguageById(18));

我想它更直截了当,更容易阅读/理解。

谢谢你,曼尼什

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62335811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档