我想我在 Redux 和 RTK 查询工具方面遗漏了一些东西。我也在为此使用 RTK Query OpenAPI codegen。
现在我有一个看起来像这样的 API ->
export const api = generatedApi.enhanceEndpoints({
endpoints: {
getMaterials: {
transformResponse: response => normalize(response),
},
},
})
这让我在我的组件中恢复了标准化数据:
const Materials = () => {
const { data, isLoading, error } = useGetMaterialsQuery()
/*
Cool this gives me data back like:
{
[id]: {
id,
prop1: 'blah',
prop2: 'blah2'
}
}
*/
console.log(data)
// but now I want to structure this data differently using selector
const newDataStructure = useSelector(addSomeMetaDataAndStructureDifferentlySelector)
return <MyComponent structuredData={newDataStructure} />
}
但是当我查看该选择器中的状态时,它看起来像:
在选择器中我真的想使用类似 ->
const addSomeMetaDataAndStructureDifferentlySelector = state =>
// create new data structure from state.materials.byId that I will pass to `MyComponent`
我的商店现在看起来像这样->
import { configureStore } from '@reduxjs/toolkit'
import { setupListeners } from '@reduxjs/toolkit/query'
import { api } from 'gen/rtk-openapi'
// import materialsReducer from 'state/materials/materialsSlice'
const store = configureStore({
reducer: {
[api.reducerPath]: api.reducer,
},
middleware: getDefaultMiddleware =>
getDefaultMiddleware().concat(api.middleware),
})
setupListeners(store.dispatch)
export default store
那么我是否需要data
直接将 from传递useGetMaterialsQuery
给函数并对其进行转换?
或者我可以以某种方式创建一个新的 reducer 切片,以某种方式正确初始化数据,以便我可以state.materials.byId
在选择器中访问?
还是我从根本上在这里遗漏了什么?