Redux-loop和Connected-React-Router是否兼容?

时间:2018-09-22 15:34:35

标签: javascript reactjs redux connected-react-router redux-loop

我使用以下博文中的示例代码制作了一个简单的react应用,此处仅作为引用而已。否则,我对javascript生态系统并不陌生,并试图将几种不熟悉的工具组合在一起(以便学习它们)。

https://medium.com/@notrab/getting-started-with-create-react-app-redux-react-router-redux-thunk-d6a19259f71f

相关地,我的public bool Equals(TestClass other) { if (other is null) return false; else return data == other.data; } 如下所示:

public bool Equals(TestClass other) => !(other is null) && data == other.data;

这似乎正常,并且我页面上的 var jsonData = System.IO.File.ReadAllText(jsonFile); // De-serialize to object or create new list var employeeList = JsonConvert.DeserializeObject<List<Student>>(jsonData) ?? new List<Student>(); // Add any new employees employeeList.Add(new Student() { Rollnumber = 1, StudentName = "Paja1", Subject = new Subject { Id = 1, Name = "Sub1" } }); employeeList.Add(new Student() { Rollnumber = 1, StudentName = "Pera1", Subject = new Subject { Id = 1, Name = "Sub1" } }); // Update json data string jsonData = JsonConvert.SerializeObject(employeeList,Formatting.Indented); System.IO.File.WriteAllText(jsonFile, jsonData); / store.js触发器也可以正常工作。请注意,来自import { createStore, applyMiddleware, compose, } from 'redux'; import { connectRouter, routerMiddleware, } from 'connected-react-router'; import thunk from 'redux-thunk'; import { install, } from 'redux-loop'; import createHistory from 'history/createBrowserHistory'; import rootReducer from './modules'; export const history = createHistory(); const initialState = {}; const middleWare = [thunk, routerMiddleware(history),]; const composedEnhancers = compose( applyMiddleware(...middleWare), install() ); const store = createStore( connectRouter(history)(rootReducer), initialState, composedEnhancers ); export default store; 的{​​{1}}被称为增强器(?)的一部分,这很好。我的reducer中没有任何Link调用,我只是插入了Route命令作为增强器,希望可以添加一些。

这是我的主要install代码:

redux-loop

同样,这很好。但是,如果我在减速器中的任何位置插入loop,它将消失。根据文档,这是因为我们需要使用install中的reducer。精细。如果我将顶部的导入替换为import { combineReducers, } from 'redux'; import counter from './counter'; import todo from './todo'; export default combineReducers({ counter, todo, }); (根本不更改我的化简器,还没有非标准的收益),那么我在库代码中会得到一些完全荒谬的错误:

loop

它持续了很多页,但是问题似乎出在combineReducers中;我认为这是因为redux-loop中的import { combineReducers, } from 'redux-loop';将主减速器的响应类型更改为与ConnectedRouter.js:58 Uncaught TypeError: Cannot read property 'pathname' of undefined at ConnectedRouter.js:58 at Object.dispatch (redux.js:221) at dispatch (install.js:66) at middleware.js:25 at index.js:11 at Object.onLocationChanged (ConnectedRouter.js:154) at handleLocationChange (ConnectedRouter.js:85) at new ConnectedRouter (ConnectedRouter.js:94) at constructClassInstance (react-dom.development.js:11769) at updateClassComponent (react-dom.development.js:13491) at beginWork (react-dom.development.js:14090) at performUnitOfWork (react-dom.development.js:16416) at workLoop (react-dom.development.js:16454) at renderRoot (react-dom.development.js:16533) at performWorkOnRoot (react-dom.development.js:17387) at performWork (react-dom.development.js:17295) at performSyncWork (react-dom.development.js:17267) at requestWork (react-dom.development.js:17155) at scheduleWork (react-dom.development.js:16949) at scheduleRootUpdate (react-dom.development.js:17637) at updateContainerAtExpirationTime (react-dom.development.js:17664) at updateContainer (react-dom.development.js:17691) at ReactRoot../node_modules/react-dom/cjs/react-dom.development.js.ReactRoot.render (react-dom.de... 调用中的ConnectedRouter不兼容。

这是对的问题吗?这个可以解决吗?这两个库可以一起使用吗?

2 个答案:

答案 0 :(得分:1)

有一个open issue可以解决这个问题,但是在此之前,还需要进行修改。我用类似这样的名称调用CombineReducers(我使用的是不可变的js。但是,如果不是这样,将其转换为简单代码即可)

import { connectRouter } from 'connected-react-router/immutable';
import { Map } from 'immutable';

//....

const routerReducer = connectRouter(history)(() => fromJS({}));
return combineReducers(
  {
    foo: fooReducer,
    blah: blahReducer,
    router: (state, action) => {
      const routerStateWrapper = Map({router: state});
      const result = routerReducer(routerStateWrapper, action);
      return result.get('router');
    }
  }
)

答案 1 :(得分:1)