react-router-redux 简单例子

本文通过一个简单的例子展示了如何在React应用中结合react-router-redux进行状态管理和路由配置。在reducer、store和router的配置后,当进入特定页面如test时,store会更新并包含对应页面的状态。
摘要由CSDN通过智能技术生成

reducer与按需加载组件的时候,一并加载对应的state,具体流程就不多说了,看代码!

reducer

import { combineReducers } from 'redux'
import { routerReducer } from 'react-router-redux'

export const makeRootReducer = asyncReducers => {
  return combineReducers({
    routing: routerReducer,
    ...asyncReducers
  })
}

export const injectReducer = (store, {key, reducer}) => {
  if(!store.asyncReducers[key]) {
    store.asyncReducers[key] = reducer;
    store.replaceReducer(makeRootReducer(store.asyncReducers));
  }
}

store

import { applyMiddleware, compose, createStore, combineReducers } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunkMiddleware from 'redux-thunk'
import reducer, { makeRootReducer } from './reducer'

export default (initialState = {}, history) => {

    const middleware = [thunkMiddleware, routerMiddleware(history)];
    const enhancers = [];
    const store = createStore(
        makeRootReducer(),
        initialState,
        compose(
            applyMiddleware(...middleware),
            ...enhancers
        )
    );
    return store;
}

router

import React, { Component } from 'react'
import { Router, Route, Redirect } from 'react-router'
const moduleRoute  = require.context('../view', true, /router$/) //获取view视图下,所有router文件
const router = store => {
    return <Router>
                <Route path="/">
                    {
                        moduleRoute.keys().map(key => {
                            return moduleRoute(key).default(store)
                        })
                    }
                    <Redirect from='*' to='/'  />
                </Route>
            </Router>
}

export default router

入口文件app.js

import ReactDOM from 'react-dom'
import { Router, hashHistory } from 'react-router'
import React from 'react'
import { Provider } from 'react-redux'
import { syncHistoryWithStore } from 'react-router-redux'
import createStore from '...上面的store'
import router from '...上面的router'

const store = createStore({}, hashHistory);
store.asyncReducers = {};
const history = syncHistoryWithStore(hashHistory, store);
ReactDOM.render((
    <Provider store={store}>
        <Router history={history}>
          { router(store) }
        </Router>
    </Provider>
), document.getElementById("root"))

在view层级下创建一个test文件夹来编辑一下流程
这里写图片描述

test/ index.jsx 中简单编辑下

import React, { Component } from 'react'
import { connect } from 'react-redux'

class Test extends Component {
    render() {
        const { value } = this.props;
        return <h1>{ value }</h1>
    }
}

const mapStateToProps = state => {
    return { ...state.test }
}

const mapDispathToProps = dispatch => {
    return {

    }
}

export default connect(mapStateToProps, mapDispathToProps)(Test);

reducer

const initState = { value: 'value' }
export default (state = initState, action) => {
    return state;
}

router

import { Route } from 'react-router'
import { injectReducer } from '...最上面定义的reducer'
export default store => {
    return <Route
        path='test' 
        getComponent={
            (nextState, cb) => {
                import('../'/* webpackChunkName: 'Test' */)
                .then(module => {
                    injectRoducer(store, {key: test, reducer: require('../redux/reducer')});
                    cb(null, module.default);
                })
            }
        }/>
}

执行,在未加载该页面之前,store.state = { routing… };
进入test页面的时候, store.state = { routing…, test: { value: ‘value’ } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值