redux-saga 中的批处理操作

use*_*355 2 batching reactjs redux redux-saga

我在https://react-redux.js.org/api/batch上读到,可以使用batch来确保在 React 之外调度的多个操作只会导致单个渲染更新”,就像这样(我在 React 事件中使用)处理程序即):

...
const submitData = event => {
    // ... some code before
    batch(() => {
        dispatch(first())
        dispatch(second())
    })
}
...
Run Code Online (Sandbox Code Playgroud)

但我的问题是如何正确batch操作,redux-saga以便在从 saga 分派多个操作时,结果是一次重新渲染而不是多次重新渲染?我试图将多个put放在all数组中,但不确定它实际上是批处理put

yield all([
    put(addFirst({first: 1})),
    put(addAnother({second: 2)),
]);
Run Code Online (Sandbox Code Playgroud)

上面的方法是因为我在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-batchstore enhancerhttps://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 ]);

  });
});
Run Code Online (Sandbox Code Playgroud)

因此产生 put([ action, action ]); ,有一个数组放入并分派多个动作?

mar*_*son 5

我是 Redux 维护者和 Redux Toolkit 的作者。

实际上,我刚刚写了一篇题为Redux Batching Techniques 的比较的博客文章,其中涵盖了 Redux 操作可用的各种形式的批处理。

正如我刚刚在该redux-batch问题中评论的那样:

unstable_batchedUpdates()React-Redux 本身的用法仅尝试从单个分派中最小化嵌套的重新渲染。这与该项目的目标没有重叠,该项目试图允许一次分派多个动作,同时只通知商店订阅者一次。

根据您最初的问题,我不确定您是否可以batch()在传奇中正确使用 React-Redux 的API,因为需要yield put(). 该batch()API(这是刚反应过来自己的unstable_batchedUpdates()API,再出口)依赖于跟踪是在单个事件循环滴答期间排队任何阵营状态更新,我怀疑使用发电机可能与这项工作。我必须看到实际的例子才能确定。

无论如何,根据博客文章,有多种批处理选项,它们以不同的方式工作。这完全是您要解决的实际用例的问题。