Redux Toolkit是否需自定义action creator?不同slice的reducer可重名吗?
问题1:能不能省略自定义action creator,直接调用slice导出的action?
完全可以,你现在手写的这三个自定义action creator属于完全冗余的代码,createSlice 本身就会为每个reducer自动生成对应的action creator,功能和你手写的完全一致,唯一需要调整的是你reducer里的取值字段:
- 自动生成的action creator调用时传入的参数会挂载到
action.payload上,你现在代码里写的action.data、action.message要改成action.payload才能正常取值。
优化后的代码可以直接删了你手写的三个自定义action creator,thunk部分改成如下写法即可:
export const postSearchTrip = (data) => (dispatch) => { dispatch(sendRequest()); const call = { url: baseUrl + "trips/search", method: "POST", headers: { "Content-Type": "application/json", Authorization: "Bearer " + localStorage.getItem("token"), }, data: { search: data, }, }; return axios(call) .then((response) => { dispatch(sendSuccess(response.data)); }) .catch((error) => { dispatch(sendFailed(error.message)); alert(error); }); };
问题2:不同slice的reducer能不能使用相同命名?会不会冲突?
不会有任何问题,你可以所有请求类的slice都用sendRequest、sendSuccess、sendFailed这三个命名。
因为createSlice生成的action type会自动带上slice的name作为前缀,比如你当前slice的name是searchTrip,那它的sendRequest对应的action type是searchTrip/sendRequest,另一个名为getUser的slice里的sendRequest对应的type是getUser/sendRequest,二者是完全不同的唯一标识,不会出现互相触发的问题。
你甚至可以把这套请求通用的reducer逻辑抽成公共工厂函数,每次新建请求slice的时候直接调用生成,不用重复写相同的initialState和reducer代码,进一步减少重复代码。
进阶优化建议
如果想要进一步简化请求逻辑,可以直接用Redux Toolkit自带的createAsyncThunk,不需要自己手写thunk的loading、成功、失败调度逻辑;如果项目里接口比较多,更推荐用RTK Query,连slice代码都不需要手写,内置了缓存、去重、loading状态管理等能力,比自己封装slice效率高很多。
内容的提问来源于stack exchange,提问作者theNaukiMatic

