可能是短期内关于react的对后一篇笔记。假设读者对redux和router4有基本了解。

缘由:

现在网上很多关于react+redux的文章都是沿用传统的文件组织形式,即:

  1. |--components
  2.  
  3. |--reducers
  4.  
  5. |--actionTypes
  6.  
  7. |--actions
  8.  
  9. |--else

这样的目录形式。这种形式的一个好处是:store中的状态一开始就是完整的,在按需加载的时候不需要特意更新root reducer和全局state树,只加载对应的视图即可。

但是,笔者在学习《深入浅出react+redux》的时候,作者提出的文件组织形式是以组件为单元组织app的文件结构,即:

  1. |--ComponentA
  2.  
  3. |--action
  4.  
  5. |--reducer
  6.  
  7. |--View
  8.  
  9. |--index.js
  10.  
  11. |--ComponentB
  12.  
  13. |--action
  14.  
  15. |--reducer
  16.  
  17. |--...

此时app的store和root reducer在一开始只有公共部分,按需加载某个组件后,再对redux store和root reducer进行更新扩充。

这种情况下,最关键的问题是:如何在每次按需加载后更新reducer和store。实践上分为两个阶段:

1.异步加载组件。组件的reducer、view、state字段作为对外暴露的接口。

2.加载完成后获取其reducer和state字段更新root reducer & redux store。

《深入浅出》中作者给的方法是:

1.用webpack的require.ensure分片组件,实现异步加载。

2.借助store enhancer拓展一个store.reset方法,将新组件的reducer和state字段传进去,完成更新。

然而现在要使用router4,怎么解决上面问题呢?

我目前的方案是:

1.异步加载使用Bundle组件(下面会给出其代码)。

2.刷新store和root reducer仍然使用《深入浅出》作者给出的reset方法。

----------------------------------------------------------分割-----------------------------------------------

我们现在已经会使用redux管理app状态。将state提取到全局store,并经由disptach方法派发action给root reducer 生成新的store state,而组件本身以观察者监听state变化。

router4遵循组件即路由的思想,url匹配时由Route标签渲染我们的组件。所以本质上<Route>也是视图。与Redux毫无冲突。

它们一个限制了我们app的数据流,一个控制我们视图的跳转。

由于react-redux提供的Provider组件必须放到应用的最顶层以实现全局访问store,所以项目的最基本骨架是:

  1. |--Provider
  2. |--App
  3. |--Router
  4. |--RouteA
  5. |--RouteA child
  6. |--RouteB
  7. //...

在Router4中,我们往往用到的是Bundle组件来异步加载组件,我对它进行一些改写,以适应“按组件组织文件”的方式:

  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. combineReducers
  5. } from 'redux';
  6. import store from './Store.js';
  7. class Bundle extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. mod: null
  12. };
  13. this.page=null;
  14. }
  15. componentWillMount() {
  16. // 加载初始状态
  17. this.load(this.props);
  18. }
  19.  
  20. componentWillReceiveProps(nextProps) {
  21. if (nextProps.load !== this.props.load) {
  22. this.load(nextProps);
  23. }
  24. }
  25.  
  26. load(props) {
  27. // 重置状态
  28. this.setState({
  29. mod: null
  30. });
  31. // 传入组件的组件
  32. props.load().then((mod) => {
  33. //...
  34. this.page=mod.Page;
  35. let {Page,stateKey,reducer,initialState} = mod;
  36. let state=store.getState();
  37.  
  38. store.reset(combineReducers({...store._reducers,[stateKey]:reducer}),{...state,[stateKey]:initialState});
  39.  
  40. this.setState({
  41. // handle both es imports and cjs
  42. mod: mod.Page.default ? mod.Page.default : mod
  43. });
  44. });
  45. }
  46.  
  47. render() {
  48. // if state mode not undefined,The container will render children
  49. return this.state.mod ? this.props.children(this.page) : '加载中,请稍候...';
  50. }
  51. }
  52.  
  53. Bundle.propTypes = {
  54. load: PropTypes.func,
  55. children: PropTypes.func
  56. };
  57.  
  58. export default Bundle;

一个最基本的项目用到的依赖:

react:

提供了React、Component 帮助我们搭建视图层。

redux:

combineReducers帮我们生成Root Reducer

createStore帮我们创建全局的store管理app状态。

applyMiddleware 让我们调用中间件,增强dispatch方法

compose帮我们组装store enhancer

react-redux:

Provider:让我们可以全局访问store

connect:生成容器组件和store通信

router4:

Router、Route、Link等实现项目页面路由

Bundle组件:

配合Router4实现按需加载(用到import语法)

工具明确了之后,我们开始构建应用。

0.创建项目目录:全局的store.js、index.js、enhancer文件夹、组件文件夹等

1.设计state树

2.创建各个组件,写它的actionType、actionCreator、reducer,View、stateKey,在组件文件夹下index.js中引入,并将actionCreator、reducer、stateKey等导出。

3.将公共部分的reducer引入root reducer文件中

4.实现store,引入enhancer/reset.js,让其具备reset方法,以便按需加载时刷新reducer和状态。

5.在index.js 和 App.js中搭建顶层结构,组织各个组件,设计各个页面的路由。

//...

测试。

build。

React:redux+router4搭建应用骨架的更多相关文章

  1. react+redux项目搭建及示例

    React + Redux示例,实现商品增删改 目录结构 1.项目搭建 1.1 使用create-react-app react_redux创建项目 1.2 安装使用redux需要的依赖 npm in ...

  2. node.js+ react + redux 环境搭建

    1.安装node.js 2. yarn init: 初始化,主要包含以下条目 name: 项目名 version: 版本号 description: 项目简要描述 entry point: 文件入口, ...

  3. 用react+redux+webpack搭建项目一些疑惑

    --save-dev开发用 例如:webpack --save开发和发布用 例如:react

  4. react+redux+generation-modation脚手架搭建一个todolist

    TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...

  5. webpack+react+redux+es6开发模式

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  6. webpack+react+redux+es6

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  7. React+Redux实现追书神器网页版

    引言 由于现在做的react-native项目没有使用到redux等框架,写了一段时间想深入学习react,有个想法想做个demo练手下,那时候其实还没想好要做哪一个类型的,也看了些动漫的,小说阅读, ...

  8. 使用React全家桶搭建一个后台管理系统

    引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果‘课后’适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术 ...

  9. react + redux 完整的项目,同时写一下个人感悟

    先附上项目源码地址和原文章地址:https://github.com/bailicangd... 做React需要会什么? react的功能其实很单一,主要负责渲染的功能,现有的框架,比如angula ...

随机推荐

  1. python学习19类5之多态与鸭子模型

    '''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...

  2. SNMP History and OID/MIB Tour

    https://www.pei.com/snmp-history-oid-mib/ Description: This document describes a bit of history and ...

  3. How to check if directory exist using C++ and winAPI

    如果看文件夹是否存在,必须看返回值是不是 INVALID_FILE_ATTRIBUTES #include <windows.h> #include <string> bool ...

  4. Scala的Higher-Kinded类型

    Scala的Higher-Kinded类型 Higher-Kinded从字面意思上看是更高级的分类,也就是更高一级的抽象.我们先看个例子. 如果我们要在scala中实现一个对Seq[Int]的sum方 ...

  5. Android 5.0系统默认颜色

    伴随着 Android5.0 的发布也更新了support-v7-appcompat 到 V21,其中增加了 ToolBar.recyclerview.cardview 等控件. Android5.0 ...

  6. SQL计算算数表达式的函数自定义(加减乘除)

    一.整体思路:循环遍历表达式字符串,设置一个index从第一个字符开始检测当前数字是否可以和后面的数字进行运算,如果可以运算,将两个数挑出来运算,然后用运算的结果替换原来表达式中的这两个数和符号,计算 ...

  7. Eureka重点原理解析

    前言 带着问题学习,事半功倍.本文将对如下几个问题进行总结说明: 1.EurekaServer端服务注册的流程和设计模式 2.Eureka服务续约的bug 3.EurekaClient的启动流程 4. ...

  8. Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法

    2019独角兽企业重金招聘Python工程师标准>>> Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法 博客分类: java 搜索引擎 ...

  9. Process Synchronization-Example 2

    问题描述 理发店有一位理发师,一把理发椅和N把供等候的顾客坐的椅子. 如果没有顾客,理发师在理发椅上睡觉: 当有一个顾客到来时,他必须先唤醒理发师: 如果顾客来时理发师正在理发,如果有空椅子,坐下等待 ...

  10. ubuntu16 安装redis

    ubuntu16 安装redis并开机自启 1.redis-3.2.5.tar.gz解压到/usr/local下 tar -xvf redis-3.2.5.tar.gz 2.进入源码包/usr/loc ...