Redux Thunk 是 Redux 的一个中间件,它允许你在 action creators 中编写异步逻辑。当使用 Redux Thunk 时,action creators 可以返回一个函数,而不是一个普通的 action 对象。这个函数接收 dispatch
和 getState
作为参数,使得你可以在函数体内执行异步操作,并在操作完成后使用 dispatch
分派一个普通的 action。
Redux Thunk 的核心思想是将异步逻辑从组件中抽离出来,放到 action creators 中,使得组件只需要关心如何触发 action,而不需要知道这些 action 是如何处理异步操作的。
Redux Thunk 主要处理的是返回 Promise 的异步操作。
当你需要在 Redux 中处理异步操作时,如从服务器获取数据,Redux Thunk 是一个很好的选择。
// 安装 redux-thunk
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
// Reducer
const initialState = {
data: null,
loading: false,
error: null
};
function reducer(state = initialState, action) {
switch (action.type) {
case 'FETCH_DATA_REQUEST':
return { ...state, loading: true };
case 'FETCH_DATA_SUCCESS':
return { ...state, loading: false, data: action.payload };
case 'FETCH_DATA_FAILURE':
return { ...state, loading: false, error: action.payload };
default:
return state;
}
}
// Action Creator
function fetchData() {
return (dispatch) => {
dispatch({ type: 'FETCH_DATA_REQUEST' });
return fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data }))
.catch(error => dispatch({ type: 'FETCH_DATA_FAILURE', payload: error }));
};
}
// 创建 store
const store = createStore(reducer, applyMiddleware(thunk));
// 使用 dispatch 触发异步操作
store.dispatch(fetchData());
原因:
redux-thunk
并在创建 store 时应用了它。解决方法:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
const store = createStore(reducer, applyMiddleware(thunk));
function fetchData() {
return (dispatch) => {
dispatch({ type: 'FETCH_DATA_REQUEST' });
return fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data }))
.catch(error => dispatch({ type: 'FETCH_DATA_FAILURE', payload: error }));
};
}
通过以上步骤,你应该能够正确地使用 Redux Thunk 处理异步操作,并从商店返回 Promise。
领取专属 10元无门槛券
手把手带您无忧上云