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

Posted

技术标签:

【中文标题】Redux 开发工具不适用于大型操作负载【英文标题】:Redux Dev Tools not working for large action payload 【发布时间】:2016-11-29 01:20:44 【问题描述】:

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

我正在开发一个 react/redux 应用程序,但在使用 redux 开发工具 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;

我的传奇

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);

和网络调用

return window.fetch('api/logs/gettable', 
        method: 'post',
        body: JSON.stringify(logSearchParams),
        headers: headers
    ).then(r => r.json());

感谢您的帮助

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

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

    let params = getSearchParms(getState());

    return dispatch(type:'RequestLogs', params);
     
;

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

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

 function mapStateToProps(state) 

     return state.logs;
 

当我调试这个函数时,它应该(以及之后)没有被调用

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

case "ReceiveLogs":
        return  data:action.data.rows, selected:state.selected

然后其他依赖 reducer 执行此操作的组件正常工作,并且开发工具重播按预期工作。有了这条线,它就失败了。问题似乎是“数据:action.data.rows”。 rows 是一个数组,如果我将其更改为返回一个空数组,那么重播就可以了。

我想我今天会放弃。

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

return data:action.data.rows.slice(0, 3), selected:state.selected

然后就可以了。如果我包含数组的第四个成员,它就不起作用。数组的第 4 个成员明显大于其他成员,因为它包含相当大(和深)的对象。

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

【问题讨论】:

我认为问题不在于您的中间件或 saga,而更多在于您触发操作和组件生命周期时的问题。你能把那部分也发一下吗? 谢谢,我已经更新了帖子 【参考方案1】:

查看 Redux Devtools Excessive use of memory and CPU 疑难解答:

这是由于状态或操作中包含的一些巨大对象的序列化而发生的。解决办法是sanitize them。

【讨论】:

以上是关于Redux 开发工具不适用于大型操作负载的主要内容,如果未能解决你的问题,请参考以下文章

React Native fetch 不适用于 redux?

在大型应用中使用 Redux 的五个技巧

Redux 动作工厂不适用于参数

酶 shallowWrapper.setState 不适用于 redux 连接的组件

React-redux 项目 - 链式依赖异步调用不适用于 redux-promise 中间件?

扩展运算符不适用于基于 Redux/ES6 的示例