redux - 是否可以通过在 useSelector 中传递一组键来从 redux 存储中选择多个实体?
问题描述
供您参考,我有以下代码:
const companyPagesAdapter = createEntityAdapter<CompanyPage>(
{
selectId: model => model.pageNumber,
sortComparer: (a, b) => a.pageNumber>b.pageNumber? 1 : a.pageNumber<b.pageNumber? -1 : 0
}
);
type CompanyPage = {
companyIds: number[],
pageNumber: number,
isDirty: boolean
}
所以我在 companyPagesSlice 切片中的状态如下所示:
{
ids: number[],
entities: {
[key: number]: CompanyPage;
}
}
然后在我的组件中,我为这样的页面提取公司 ID:
const companyIds = useSelector(state => state.companyPages.entities[pageNumber].companyIds);
我的 companySlice 切片状态如下所示:
{
ids: number[],
entities: {
[key: number]: ICompany;
}
}
ICompany 在哪里:
type ICompany = {
id: number;
name: string;
status: Status;
country: string;
city: string;
address: string;
zipCode: number;
}
是否有任何可能的方法通过传递一个 id 数组或其他任何东西来使用 useSelector 钩子从 redux 存储中选择多个实体?
我试图以这种方式解决它:
const companies = companyIds?.map(item => {
const company = useSelector(state => selectCompanyById(state.companies, item));
if (!company)
return;
return company;
})
但不幸的是,它违反了反应钩子的规则:你不能在循环中调用钩子。
解决方案
以下是另一种方式:
const companies = useSelector(state => {
return companyIds?.map(item => {
if (state.companies.entities[item])
return state.companies.entities[item];
return;
});
});
推荐阅读
- javascript - 在 :D\ 上安装 Reactjs 中止,但在 :C\ 上没有安装,为什么?
- validation - 如何更改 Golang (Gin) 中不同端点所需标签的绑定?
- node.js - 仅在将 Inkscape 作为子进程调用时出现“无效动词”错误
- java - 致命异常:主进程 PID:20793 java.util.ConcurrentModificationException
- xcode - 显示文档窗口崩溃 XCode 12
- reactjs - 如何清理 useEffect 中的 Redux“useDispatch”操作?
- haskell - 为列表的每个可能的单项更改创建一个列表列表
- c++ - 标记可能导致构造返回对象的异常的函数“noexcept”
- go - 是否可以为 VS Code 工作区设置每个目录的扩展设置?
- apache2 - 如何为两个 dotnet core 3.1 项目配置 apache virtualhost?