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-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 ]);
});
});
Run Code Online (Sandbox Code Playgroud)
因此产生 put([ action, action ]); ,有一个数组放入并分派多个动作?
我是 Redux 维护者和 Redux Toolkit 的作者。
实际上,我刚刚写了一篇题为Redux Batching Techniques 的比较的博客文章,其中涵盖了 Redux 操作可用的各种形式的批处理。
正如我刚刚在该redux-batch问题中评论的那样:
unstable_batchedUpdates()React-Redux 本身的用法仅尝试从单个分派中最小化嵌套的重新渲染。这与该项目的目标没有重叠,该项目试图允许一次分派多个动作,同时只通知商店订阅者一次。
根据您最初的问题,我不确定您是否可以batch()在传奇中正确使用 React-Redux 的API,因为需要yield put(). 该batch()API(这是刚反应过来自己的unstable_batchedUpdates()API,再出口)依赖于跟踪是在单个事件循环滴答期间排队任何阵营状态更新,我怀疑使用发电机可能与这项工作。我必须看到实际的例子才能确定。
无论如何,根据博客文章,有多种批处理选项,它们以不同的方式工作。这完全是您要解决的实际用例的问题。
| 归档时间: |
|
| 查看次数: |
3724 次 |
| 最近记录: |