Я прочитал на 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 где автор написал: "Поскольку этот пакет был написан, redux-saga улучшилась, и использование all ([put (...), put (...)]], кажется, правильно объединяет два действия в одно событие подписки, что делает избыточность пакета redux-batch в этом сценарии. ", но в 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 и отправлять несколько действий?