我使用redux来获取一些数据,使用这个API "https://valorant-api.com/v1/agents"
。问题是我不能显示所有的代理,只有1个出现,我从redux得到警告说:
从selectId传递的实体返回undefined,您可能应该实现自己的selectId函数
我想我的valorantSlice
有错误。
我试着这样显示代理列表
(in这个API我想展示的细节太)
export const fetchValorants = createAsyncThunk(
"valorants/fetchValorants",
async () => {
const response = await axios
.get("https://valorant-api.com/v1/agents")
.then((response) => response.data.data)
.then((agents) => {
return Promise.all(
agents.map((agent: any) =>
axios.get(`https://valorant-api.com/v1/agents/${agent.uuid}`)
)
);
})
.then((agentDetails) => {
return agentDetails.map((response) => response.data.data);
});
return response;
}
);
这是我的那一片
const valorantAdapter = createEntityAdapter();
const initialState = valorantAdapter.getInitialState({
status: "idle",
error: "" as any,
});
export const fetchValorants = createAsyncThunk(
"valorants/fetchValorants",
async () => {
const response = await axios
.get("https://valorant-api.com/v1/agents")
.then((response) => response.data.data)
.then((agents) => {
return Promise.all(
agents.map((agent: any) =>
axios.get(`https://valorant-api.com/v1/agents/${agent.uuid}`)
)
);
})
.then((agentDetails) => {
return agentDetails.map((response) => response.data.data);
});
return response;
}
);
const valorantsSlice = createSlice({
name: "valorants",
initialState,
reducers: {},
extraReducers(builder) {
builder
.addCase(fetchValorants.pending, (state, action) => {
state.status = "loading";
})
.addCase(fetchValorants.fulfilled, (state, action) => {
state.status = "succeeded";
action.payload.forEach((agent) => {
valorantAdapter.addOne(state, agent);
});
})
.addCase(fetchValorants.rejected, (state, action) => {
state.status = "failed";
state.error = action.error.message;
});
},
});
export default valorantsSlice.reducer;
export const {
selectAll: selectAllValorants,
selectById: selectValorantByUuid,
selectIds: selectValorantUuids,
} = valorantAdapter.getSelectors((state: any) => state.valorants) as any;
我在nextjs 13中使用react-redux
redux devtools截图
1条答案
按热度按时间mwkjh3gx1#
实体键下的undefined让我认为Valorant API的响应不具有任何ID。(编辑:附加屏幕截图,理论似乎得到验证:)
默认情况下,RTK的entityAdapter将查找ID。
基于形实转换程序的代码,似乎有一个
uuid
。https://redux-toolkit.js.org/api/createEntityAdapter#selectid因此,您可以将
selectId
传递给createEntityAdapter
,它将针对uuid
键。