Я прочитал в https://react-redux.js.org/api/batch, что можно использовать batch
", чтобы гарантировать, что многократные действия, отправленные за пределами React, приведут только к одному обновлению рендеринга ", как это ( который я использую в обработчике событий React, т. е.):
...
const submitData = event => {
// ... some code before
batch(() => {
dispatch(first())
dispatch(second())
})
}
...
Но мой вопрос заключается в том, как правильно batch
действия в redux-saga
, так что результатом является один повторный рендеринг вместо нескольких при отправке нескольких действия из саги? Я пытался поместить несколько put
в массив all
, но не уверен, что он на самом деле пакетирует put
:
yield all([
put(addFirst({first: 1})),
put(addAnother({second: 2)),
]);
Вышеуказанный подход заключается в том, что я прочитал документацию по https://github.com/manaflair/redux-batch , где автор написал " Поскольку этот пакет написан, улучшенная версия Saga-saga улучшена, и использование всех ([put (...), put (...)]), кажется, правильно объединяет два действия в одном событии подписки, что делает избыточным пакетную избыточность в этом сценарии. ", , но в https://github.com/manaflair/redux-batch/issues/21 другой человек написал, что пакетирование обрабатывается React unstable_batchedUpdates API
. Тем не менее redux-toolkit
(который я использую) имеет пример с redux-batch
в качестве store enhancer
(https://github.com/reduxjs/redux-toolkit/blob/master/docs/api/configureStore.md).
Так что, если кто-то знает правильный путь, пожалуйста, поделитесь своими знаниями! С наилучшими пожеланиями
РЕДАКТИРОВАТЬ: Я использую только batch
в обработчиках событий React для пакетирования нескольких действий. В redux-saga
я хочу использовать пакет redux-batch
.
Таким образом, правильный путь (если используется redux-batch, который, как представляется, redux-toolkit, как пример), должен:
import { reduxBatch } from '@manaflair/redux-batch';
import { put, takeEvery } from 'redux-saga/effects';
import createSagaMiddleware from 'redux-saga';
import { applyMiddleware, compose, createStore } from 'redux';
let sagaMiddleware = createSagaMiddleware();
let store = createStore(reducer, compose(reduxBatch, applyMiddleware(sagaMiddleware), reduxBatch));
sagaMiddleware.run(function* () {
yield takeEvery(`*`, function* (action) {
// Duplicate any event dispatched, and once again, store
// listeners will only be fired after both actions have
// been resolved/
yield put([ action, action ]);
});
});
Следовательно, до yield put ([action, action]); , есть массив в put и отправлять несколько действий?