项目作者: tomsonTang

项目描述 :
将 react-router 、redux、与 redux-saga-model 进行封装
高级语言: JavaScript
项目地址: git://github.com/tomsonTang/react-router-redux-saga-model.git


react-router-redux-saga-model

将 react-router 、redux、与 redux-saga-model 进行封装

npm i react-router-redux-saga-model

or

yarn add react-router-redux-saga-model

很多时候我们的 Provider 需要手动和 store 进行关联,同时还需要手动配置 history 与 redux 的同步,以及设置响应 history 的 Router。

这里将其透明化:

  1. import {BrowserRouterProvider} from 'react-router-redux-saga-model'
  2. ReactDOM.render(
  3. <BrowserRouterProvider>
  4. <div>
  5. <Link to="/about">关于</Link>
  6. <Link to="/">主页</Link>
  7. <Route exact path="/" component={Index}></Route>
  8. <Route path="/about" component={About}></Route>
  9. </div>
  10. </BrowserRouterProvider>,
  11. document.querySelector('#root')
  12. )
  1. /* 输出 */
  2. <Provider store={createStore()}>
  3. <ConnectedRouter history={createBrowserHistory()}>
  4. <div>
  5. <Link to="/about">关于</Link>
  6. <Link to="/">主页</Link>
  7. <Route exact path="/" component={Index}></Route>
  8. <Route path="/about" component={About}></Route>
  9. </div>
  10. </ConnectedRouter>
  11. </Provider>

基本 API

  • BrowserRouterProvider
  • HashRouterProvider
  • MemoryRouterProvider

高级 API

  • RouterType 对应 history 的 3 中 history 类型:

    RouterType.Browser
    RouterType.Hash
    RouterType.Memory

  • RouterProvider

    有时候我们有特殊需要需要设置 默认的 state,middleware,reducer(由于使用了 sagaModel,正常是不需要提供额外的 reducer)

    1. import {RouterProvider,RouterType} from 'react-router-redux-saga-model';
    2. const initialState = {};
    3. const initialReducer = {};
    4. const initialMiddleware = [];
    5. <RouterProvider type={RouterType.Browser} state={initialState} reducers={initialReducer} middleware={initialMiddleware}>
    6. <div>
    7. <Link to="/about">关于</Link>
    8. <Link to="/">主页</Link>
    9. <Route exact path="/" component={Index}></Route>
    10. <Route path="/about" component={About}></Route>
    11. </div>
    12. </RouterProvider>

与 sagaModel 配合使用

方式一

直接作为父组件使用

  1. import {BrowserRouterProvider} from 'react-router-redux-saga-model'
  2. import indexModel from './view/index/indexModel.js';
  3. const models = [indexModel];
  4. ReactDOM.render(
  5. <BrowserRouterProvider modles={models}>
  6. <div>
  7. <Link to="/about">关于</Link>
  8. <Link to="/">主页</Link>
  9. <Route exact path="/" component={Index}></Route>
  10. <Route path="/about" component={About}></Route>
  11. </div>
  12. </BrowserRouterProvider>,
  13. document.querySelector('#root')
  14. )

这时候所有的 sagaModels 都会被解析并处理。

方式二

通过传入一个回调,拿到 sagaModel 动态设置相关处理。

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import {Route} from 'react-router';
  4. import {Link} from 'react-router-dom';
  5. import {BrowserRouterProvider} from 'react-router-redux-saga-model'
  6. import About from './view/about/index.jsx';
  7. import Index from './view/index/index.jsx';
  8. import loading from './plugins/loading.js';
  9. import indexModel from './view/index/indexModel.js';
  10. const App = (sagaModel) =>{
  11. // sagaModel API
  12. sagaModel.register(IndexModel);
  13. return (
  14. <div>
  15. <Link to="/about">关于</Link>
  16. <Link to="/">主页</Link>
  17. <Route exact path="/" component={Index}></Route>
  18. <Route path="/about" component={About}></Route>
  19. </div>
  20. )
  21. };
  22. ReactDOM.render(
  23. <BrowserRouterProvider children={App} plugins={[loading]}/>,
  24. document.querySelector('#root')
  25. );

方式三

将子组件进行封装且传入一个 component 字段

  1. //index.js
  2. import React from 'react';
  3. import ReactDOM from 'react-dom';
  4. import {BrowserRouterProvider} from 'react-router-redux-saga-model'
  5. import App from './view/app/app.jsx';
  6. import loading from './plugins/loading.js';
  7. ReactDOM.render(
  8. <BrowserRouterProvider component={App} plugins={[loading]}/>,
  9. document.querySelector('#root')
  10. );
  1. //app.js
  2. import React, { Component } from 'react';
  3. import {Route} from 'react-router';
  4. import {Link} from 'react-router-dom';
  5. import About from '../about/index.jsx';
  6. import Index from '../index/index.jsx';
  7. import IndexModel from '../index/indexModel.js';
  8. export default class App extends Component {
  9. componentWillMount = () => {
  10. const {register,history,sagaModel} = this.props;
  11. //已做与sagaModel的绑定,故可以直接调用
  12. register(IndexModel);
  13. history.listen((location)=>{
  14. console.log('location change');
  15. });
  16. }
  17. componentWillUnmount() {
  18. const {dump,sagaModel} = this.props;
  19. //已做与sagaModel的绑定,故可以直接调用
  20. dump(IndexModel.namespace);
  21. }
  22. render() {
  23. return (
  24. <div>
  25. <Link to="/about">关于</Link>
  26. <Link to="/">主页</Link>
  27. <Route exact path="/" component={Index}></Route>
  28. <Route path="/about" component={About}></Route>
  29. </div>
  30. );
  31. }
  32. }

通过这种方式把相关 API 作为传入的组件的 props。

详细例子

react-router-redux-saga-mode-example

  1. npm install
  2. npm start