Пакетные действия в редукс-саге - PullRequest
0 голосов
/ 22 января 2020

Я прочитал в 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 и отправлять несколько действий?

1 Ответ

1 голос
/ 22 января 2020

Я поддерживаю Redux и являюсь автором Redux Toolkit.

Я только что написал сообщение в блоге под названием Сравнение методов пакетной обработки Redux , в котором рассматриваются различные доступные формы пакетирования. с действиями Redux.

Как я только что прокомментировал в этой redux-batch проблеме:

Использование unstable_batchedUpdates() в самом React-Redux только пытается минимизировать вложенные повторные рендеры. из одной отправки. Это не пересекается с целью этого проекта, который пытается разрешить отправку нескольких действий одновременно, одновременно уведомляя подписчиков магазина только один раз.

По вашему первоначальному вопросу, я не уверен, что вы может правильно использовать batch() API React-Redux в sagas, из-за необходимости yield put(). API batch() (который является просто собственным API React unstable_batchedUpdates(), реэкспортируется) основан на отслеживании любых обновлений состояния React, которые ставятся в очередь в течение одного события l oop, и я подозреваю, что использование генераторов может не работать с этим. Чтобы быть уверенным, мне нужно было видеть примеры в действии.

В любом случае, согласно сообщению в блоге, есть несколько вариантов пакетирования, которые работают по-разному. Все дело в том, какой именно вариант использования вы пытаетесь решить.

...