你可能有这样的切片:
import {createSlice, } from '@reduxjs/toolkit';
export const initialState = {
todos: [],
loading: false,
errorMessage: null,
};
const slice = createSlice({
name: 'todos',
initialState,
reducers: {
loadTodos(state) {
state.loading = true;
state.errorMessage = null;
},
loadTodosError(state, action) {
state.loading = false;
state.errorMessage = action.payload.message;
},
loadTodosSuccess(state, action) {
state.loading = false;
state.errorMessage = null;
state.todos = action.payload.data
},
},
});
export const {actions, reducer} = slice;
鉴于 redux 工具包带有一个名为“createAsyncThunk”的“特殊”函数,通常用于异步操作,您可以这样调用它:
import axios from 'axios';
import {createAsyncThunk} from '@reduxjs/toolkit';
export const loadTodos = createAsyncThunk(
'loadTodos',
async (_, thunkAPI) => {
const response = await axios.get('http://todos.com/api', 'delete');
thunkAPI.dispatch(actions.loadTodosSuccess(response.data));
return response;
});
那么你所要做的就是导入动作并像这样调度它们
import {useDispatch, useSelector} from 'react-redux';
import {loadTodos} from './slice';
const TodoList = () => {
const dispatch = useDispatch;
useEffect(() => {
dispatch(loadTodos());
}, [dispatch]);
const {isLoading, errorMessage} = useSelector(state => state.todos);
return (
<div>
{isLoading && <Spinner />}
{errorMessage && <span>Failed to load todos</span>}
{todos.map(todo => (
<div>{todo}</div>
))}
</div>
);
};