我正在学习RTK Query,但真的很困惑。如果有人能指点我正确的方向,我会非常高兴。我的问题是如何像使用createAsyncThunk
并设置extraReducers
时那样操纵应用程序存储的状态。
export const asyncApiCall = createAsyncThunk("api/get_data", async (data) => {
const config = {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
};
const res = await axios.get( "http://apiserver/path_to_api",data,config );
return res['data']
} )
export const mySlice = createSlice({
name:"mySliceName",
initialState:{
data: [],
loadInProgress: false,
loadError: null,
extraData: {
// something derived based on data received from the api
}
},
extraReducers: {
[asyncApiCall .pending]: (state) => {
state.loadInProgress = true;
},
[asyncApiCall .fulfilled]: (state,action) => {
state.loadInProgress = false;
state.data = action.payload;
state.extraData = someUtilFunc(state.data)
},
[asyncApiCall.rejected]: (state) => {
state.loadInProgress = false;
state.loadError= true;
},
}
})
现在我正在使用RTK Query替换它。我的理解是,RTK Query会自动生成用于公开从API接收到的数据的钩子,以及所有查询相关的信息,例如是否处于挂起状态,是否发生了错误等。
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
export const apiSlice = createApi({
reducerPath: 'api',
baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
endpoints: builder => ({
getData: builder.query({
query: () => '/get_data'
}),
setData: builder.mutation({
query: info => ({
url: '/set_data',
method: 'POST',
body: info
})
})
})
})
export const { useSendDataMutation, useGetDataQuery } = apiSlice
如果我想存储一些可能会受到api调用影响的附加数据,我应该创建另一个切片来与apiSlice交互,还是可以将所有内容合并到现有代码中?对于这个问题的可能幼稚,我感到很抱歉。