reactjs - 在 Slice 中为 redux 添加功能
问题描述
请帮助我如何在 ordersSlice 中引入像 getOrdersByCustomer 这样的新功能。我在下面提供了 ordersSlice 的完整代码。请告诉我什么是 extraReducers 以及它是如何工作的。
import { createSlice, createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit';
import axios from 'axios';
export const getOrders = createAsyncThunk('eCommerceApp/orders/getOrders', async () => {
const response = await axios.get('/api/e-commerce-app/orders');
const data = await response.data;
return data;
});
export const removeOrders = createAsyncThunk(
'eCommerceApp/orders/removeOrders',
async (orderIds, { dispatch, getState }) => {
await axios.post('/api/e-commerce-app/remove-orders', { orderIds });
return orderIds;
}
);
const ordersAdapter = createEntityAdapter({});
export const { selectAll: selectOrders, selectById: selectOrderById } = ordersAdapter.getSelectors(
state => state.eCommerceApp.orders
);
const ordersSlice = createSlice({
name: 'eCommerceApp/orders',
initialState: ordersAdapter.getInitialState({
searchText: ''
}),
reducers: {
setOrdersSearchText: {
reducer: (state, action) => {
state.searchText = action.payload;
},
prepare: event => ({ payload: event.target.value || '' })
}
},
extraReducers: {
[getOrders.fulfilled]: ordersAdapter.setAll,
[removeOrders.fulfilled]: (state, action) => ordersAdapter.removeMany(state, action.payload)
}
});
export const { setOrdersSearchText } = ordersSlice.actions;
export default ordersSlice.reducer;
此外
您还可以告诉我,我将如何处理我的自定义函数 getOrdersByCustomer 的以下代码。
export const { selectAll: selectOrders, selectById: selectOrderById } = ordersAdapter.getSelectors(
state => state.eCommerceApp.orders
);
因为,在我的组件中,我使用过
const orders = useSelector(selectOrders);
解决方案
您可以像已有的那样引入新的(异步)函数(我使用 customerId 作为 url 的一部分 -> 您可以通过后端中的参数访问它):
export const getOrdersByCustomer = createAsyncThunk('eCommerceApp/orders/getOrdersByCustomer', async (customerId) => {
const response = await axios.get(`/api/e-commerce-app/orders/${customerId}`);
const data = await response.data;
return data;
});
然后你可以在你的 extraReducer 中处理响应:
extraReducers: {
[getOrders.fulfilled]: ordersAdapter.setAll,
[removeOrders.fulfilled]: (state, action) => ordersAdapter.removeMany(state, action.payload),
[getOrdersByCustomer.fulfilled]: (state, action) =>
// set your state to action.payload
}
extraReducers 处理异步 thunk 之类的操作。该createAsyncThunk
函数返回 3 种可能的状态(以及其他状态):挂起、拒绝或已完成。在您的情况下,您只处理fulfilled
响应。您还可以使用其他两个选项设置您的状态(在您的情况下[getOrdersByCustomer.pending]
或[getOrdersByCustomer.rejected]
推荐阅读
- java - 使用 OrmLite 运行程序时尝试解决 ClassNotFound 错误
- netflix-eureka - 通过将不需要的 jar 添加到类路径中,将 Spring Cloud Config 添加到启动应用程序会导致 java.lang.NoSuchMethodError
- svg - 支持
FabricJS 中的标记 - azure - 使用 DockerCompose 将映像推送到 DockerHub 的 Azure DevOps 管道
- android - 尝试使用Android Starage Access Network API浏览文件夹没有成功
- python - 全局变量如何在 Python 并行编程中工作?
- c++ - 'go' 未在此范围内声明(C++)
- parallel-processing - 在 mpi 程序中调用 mpi 程序
- python - 如何将数据框分成两部分,所有标签都在分类列中
- excel - 基于单个单元格将整行复制到新的 Excel 工作表(位于 MS Teams 中)选项卡