Redux 开发工具不适用于大型操作负载

toa*_*ies 5 javascript reactjs redux

更新:我已经从第一篇文章中缩小了问题的范围。请查看最新更新。问题似乎与操作负载的大小或复杂性有关,而不是因为操作是在异步调用之后调用的。

我正在开发一个 react/redux 应用程序,并且在使用 redux dev tools chrome 扩展中的时间旅行功能时遇到了问题。

当我在滑块监视器中重播应用程序时,不会重播对 webapi 操作的第一次异步调用。除了第一个之外的所有同步操作和异步网络调用都可以正常工作。它只是第一个不渲染的。我试过只使用 redux-thunk 来实现异步,但也尝试过使用 redux-saga(当前配置)。我在 webpack-dev-server 中运行应用程序

应用程序本身正在运行(所有代码都在打字稿中)

我尝试了各种配置更改,但似乎没有任何效果。任何想法将不胜感激。

这是我的 configureStore 文件

function configureStore() {

const sagaMiddleware = createSagaMiddleware()

const store = createStore(rootreducer, compose(
    applyMiddleware(invariant(), sagaMiddleware, thunk),
    window.devToolsExtension ? window.devToolsExtension() : (f:any) => f
));

if (window.devToolsExtension) window.devToolsExtension.updateStore(store);

sagaMiddleware.run(logsSaga)

return store; 
}

export default configureStore;
Run Code Online (Sandbox Code Playgroud)

我的传奇

function* fetchLogs(logSearchParams: any) {
 try {
      const data = yield call(getLogTableData, 
               logSearchParams.params);

  yield put({type: "ReceiveLogs", 
    data, logSearchParams:logSearchParams.params});
   } catch (e) {
      yield put({type: "LogsError", message: e.message});
   }
}
export function* logsSaga() {
  yield* takeEvery("RequestLogs", fetchLogs);
}
Run Code Online (Sandbox Code Playgroud)

和网络电话

return window.fetch('api/logs/gettable', {
        method: 'post',
        body: JSON.stringify(logSearchParams),
        headers: headers
    }).then(r => r.json());
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

编辑:我正在使用 Redux-React 和连接装饰器将 Redux 与组件连接起来。动作是从 actionCreator 调用的

export let searchClicked = () => {
     return (dispatch, getState) =>   {

    let params = getSearchParms(getState());

    return dispatch({type:'RequestLogs', params});
     }
};
Run Code Online (Sandbox Code Playgroud)

这使用 React-Redux mapDispatchToProps 连接到组件单击处理程序

另外两个组件通过 mapStateToProps 接收状态,例如

 function mapStateToProps(state) {

     return state.logs;
 }
Run Code Online (Sandbox Code Playgroud)

当我调试这个函数时,它应该是(并且是之后)

更新:我已经将问题追溯到“ReceiveLogs”的减速器,它由 Redux-Saga 调用。我为这个动作准备了三个减速器。如果我注释掉这一行

case "ReceiveLogs":
        return  {data:action.data.rows, selected:state.selected}
Run Code Online (Sandbox Code Playgroud)

然后其他依赖减速器执行此操作的组件正常工作,并且开发工具重放按预期工作。使用这条线,它失败了。问题似乎是“data:action.data.rows”。行是一个数组,如果我将其更改为返回一个空数组,则重放工作。

我想我今天会放弃。

更新:看来问题可能与作为 ReceiveLogs 负载的一部分发送的数组的大小有关。如果我通过切片来限制数组的大小,例如

返回 {data:action.data.rows.slice(0, 3), selected:state.selected}

那么它的工作原理。如果我包含数组的第 4 个成员,则它不起作用。数组的第 4 个成员明显大于其他成员,因为它包含相当大(且深)的对象。

动作负载和 redux-dev-tools 是否有某种大小限制???我会继续玩下去。

nhk*_*anh 2

查看 Redux Devtools内存和 CPU 过度使用问题排查:

发生这种情况是由于状态或操作中包含的一些巨大对象的序列化。解决办法是对它们进行消毒