==================== TLDR ==================== ======
@ markerikson (см. Принятый ответ) любезно указал на текущее решение и будущее решение.
RTK делает поддержка thunks в редукторах с использованием промежуточного программного обеспечения thunk (см. ответ).
В выпуске 1.3.0 ( в настоящее время альфа в феврале 2020 ) есть вспомогательный метод createAsyncThunk()
createAsyncThunk , который обеспечит некоторую полезную функциональность (т.е. запускает 3 «расширенных» редуктора, зависящих от состояния обещания).
ReduxJS / Toolkit NPM релизы
======================== Исходное сообщение февраль 2020 ========= =================
Я довольно новичок в Redux и столкнулся с Redux Toolkit (RTK) и хочу реализовать дополнительные функции, которые он обеспечивает ( или в этом случае, может быть, нет?) (февраль 2020)
Мое приложение отправляет срезы редукторов, созданные с помощью createSlice({})
(см. cre ateSlice api docs )
Пока это работает блестяще. Я могу легко использовать встроенные dispatch(action)
и useSelector(selector)
для отправки действий и получения / реагирования на изменения состояния в моих компонентах.
Я хотел бы использовать вызов asyn c от ax ios для извлечения данных из API и обновления хранилища, поскольку запрос A) запущен B) завершен.
I видел redux-thunk и кажется, что он предназначен исключительно для этой цели ... но новый RTK не кажется, поддерживает его в пределах createSlice()
после общего поиска в Google.
Вышеуказанное текущее состояние реализации thunk со слайсами?
Я видел в документах, что вы можете добавить extraReducers для среза, но не уверен, что это означает, что я мог бы создать больше традиционных редукторов, которые используют thunk и имеют срез, реализующих их?
В целом, это так вводит в заблуждение, как показывают документы RTK, вы можете использовать thunk ... но, похоже, не упоминаете, что он недоступен через API новых ломтиков.
Пример из Промежуточное ПО Redux Tool Kit
const store = configureStore({
reducer: rootReducer,
middleware: [thunk, logger]
})
Мой код для фрагмента, показывающего, где вызов asyn c будет сбой и некоторые другие примеры редукторов, которые работают.
import { getAxiosInstance } from '../../conf/index';
export const slice = createSlice({
name: 'bundles',
initialState: {
bundles: [],
selectedBundle: null,
page: {
page: 0,
totalElements: 0,
size: 20,
totalPages: 0
},
myAsyncResponse: null
},
reducers: {
//Update the state with the new bundles and the Spring Page object.
recievedBundlesFromAPI: (state, bundles) => {
console.log('Getting bundles...');
const springPage = bundles.payload.pageable;
state.bundles = bundles.payload.content;
state.page = {
page: springPage.pageNumber,
size: springPage.pageSize,
totalElements: bundles.payload.totalElements,
totalPages: bundles.payload.totalPages
};
},
//The Bundle selected by the user.
setSelectedBundle: (state, bundle) => {
console.log(`Selected ${bundle} `);
state.selectedBundle = bundle;
},
//I WANT TO USE / DO AN ASYNC FUNCTION HERE...THIS FAILS.
myAsyncInSlice: (state) => {
getAxiosInstance()
.get('/')
.then((ok) => {
state.myAsyncResponse = ok.data;
})
.catch((err) => {
state.myAsyncResponse = 'ERROR';
});
}
}
});
export const selectBundles = (state) => state.bundles.bundles;
export const selectedBundle = (state) => state.bundles.selectBundle;
export const selectPage = (state) => state.bundles.page;
export const { recievedBundlesFromAPI, setSelectedBundle, myAsyncInSlice } = slice.actions;
export default slice.reducer;
Настройка моего магазина (настройка магазина).
import { configureStore } from '@reduxjs/toolkit';
import thunk from 'redux-thunk';
import bundlesReducer from '../slices/bundles-slice';
import servicesReducer from '../slices/services-slice';
import menuReducer from '../slices/menu-slice';
import mySliceReducer from '../slices/my-slice';
const store = configureStore({
reducer: {
bundles: bundlesReducer,
services: servicesReducer,
menu: menuReducer,
redirect: mySliceReducer
}
});
export default store;
Любая помощь или дальнейшие указания будут с благодарностью.