React:redux+router4搭建应用骨架
可能是短期内关于react的对后一篇笔记。假设读者对redux和router4有基本了解。
缘由:
现在网上很多关于react+redux的文章都是沿用传统的文件组织形式,即:
|--components |--reducers |--actionTypes |--actions |--else
这样的目录形式。这种形式的一个好处是:store中的状态一开始就是完整的,在按需加载的时候不需要特意更新root reducer和全局state树,只加载对应的视图即可。
但是,笔者在学习《深入浅出react+redux》的时候,作者提出的文件组织形式是以组件为单元组织app的文件结构,即:
|--ComponentA |--action |--reducer |--View |--index.js |--ComponentB |--action |--reducer |--...
此时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,所以项目的最基本骨架是:
|--Provider
|--App
|--Router
|--RouteA
|--RouteA child
|--RouteB
//...
在Router4中,我们往往用到的是Bundle组件来异步加载组件,我对它进行一些改写,以适应“按组件组织文件”的方式:
import React from 'react';
import PropTypes from 'prop-types';
import {
combineReducers
} from 'redux';
import store from './Store.js';
class Bundle extends React.Component {
constructor(props) {
super(props);
this.state = {
mod: null
};
this.page=null;
}
componentWillMount() {
// 加载初始状态
this.load(this.props);
} componentWillReceiveProps(nextProps) {
if (nextProps.load !== this.props.load) {
this.load(nextProps);
}
} load(props) {
// 重置状态
this.setState({
mod: null
});
// 传入组件的组件
props.load().then((mod) => {
//...
this.page=mod.Page;
let {Page,stateKey,reducer,initialState} = mod;
let state=store.getState(); store.reset(combineReducers({...store._reducers,[stateKey]:reducer}),{...state,[stateKey]:initialState}); this.setState({
// handle both es imports and cjs
mod: mod.Page.default ? mod.Page.default : mod
});
});
} render() {
// if state mode not undefined,The container will render children
return this.state.mod ? this.props.children(this.page) : '加载中,请稍候...';
}
} Bundle.propTypes = {
load: PropTypes.func,
children: PropTypes.func
}; 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搭建应用骨架的更多相关文章
- react+redux项目搭建及示例
React + Redux示例,实现商品增删改 目录结构 1.项目搭建 1.1 使用create-react-app react_redux创建项目 1.2 安装使用redux需要的依赖 npm in ...
- node.js+ react + redux 环境搭建
1.安装node.js 2. yarn init: 初始化,主要包含以下条目 name: 项目名 version: 版本号 description: 项目简要描述 entry point: 文件入口, ...
- 用react+redux+webpack搭建项目一些疑惑
--save-dev开发用 例如:webpack --save开发和发布用 例如:react
- react+redux+generation-modation脚手架搭建一个todolist
TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- webpack+react+redux+es6
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- React+Redux实现追书神器网页版
引言 由于现在做的react-native项目没有使用到redux等框架,写了一段时间想深入学习react,有个想法想做个demo练手下,那时候其实还没想好要做哪一个类型的,也看了些动漫的,小说阅读, ...
- 使用React全家桶搭建一个后台管理系统
引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果‘课后’适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术 ...
- react + redux 完整的项目,同时写一下个人感悟
先附上项目源码地址和原文章地址:https://github.com/bailicangd... 做React需要会什么? react的功能其实很单一,主要负责渲染的功能,现有的框架,比如angula ...
随机推荐
- 元素均匀排列自动换行&二维数组前端遍历
1.元素均匀排列并自动换行 display:flex; flex-wrap:wrap; 2.getFiled();取一行,取多行的话用getFiled(‘id’,true); 3.二维数组前端遍历: ...
- influxdb 安装
influxdb是一款开源的时序数据库,可以用作监控系统的数据存储或用来存储基于时序进行分析的业务系统的数据存储. influxdb的部署及使用均比较简单,但是集群(官方版集群已闭源)及高可用方案较少 ...
- [Inno Setup] 字符串列表,当要处理一长串文件时很有用
https://wiki.freepascal.org/TStringList-TStrings_Tutorial TStringList-TStrings Tutorial │ Deutsch (d ...
- Manjaro Linux 入门使用教程
Manjaro 初体验 Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验.优雅简单是它的追求,稳定实 ...
- C++多线程队列实现
C++多线程队列实现 C++多线程队列学习 介绍 在项目中,进行多线程队列实现是一个比较麻烦的事, 找到了一个实现比较好的多线程队列实现, 自己做了一点修改更加适应自己的项目, 记录下来, 有需要的自 ...
- 记一次Pinpoint监控工具部署过程
环境:Centos 7.4 X64IP:192.168.1.11 1.配置环境,先安装jdk 到Oracle官网下载安装JDK https://www.oracle.com/technetwork/j ...
- 15个 MySQL 基础面试题,DBA 们准备好了吗?
此前我们已经有发表过Linux 面试基础问答之一.二和三共3篇文章,获得读者的好评,同时我们得到反馈,有些读者希望这种交互式学习方法能够做得更加灵活.心动不如行动,我们这就为您奉上 15个 MySQL ...
- 「每天一道面试题」Java类的生命周期包括哪几个阶段?
一个Java类被加载到虚拟机中,它的生命周期才算开始,直到被从内存中卸载,它的生命周期才算结束.从开始到结束,它的整个生命周期包括加载.验证.准备.解析.初始化.使用和卸载7个阶段,其中验证.准备和解 ...
- Leetcode---Solutions&Notes
Leetcode已经成为面试必备技能之一,为了紧随潮流,也模仿大佬们刷刷题. 1.采用"龟系"做法,每道题尽量做到时间复杂度和空间复杂度的较优水平: 2.每道题的Solution先 ...
- ACM周记
放假一周了,虽然知识都学完了,但是使用和会用还是很难,不能在按着这个情形发展下去,这样的话肯定完成不了自己的任务,所以必须要改变自己的学习方法和学习态度,学习态度,一个星期也睡够放松够了,也玩够了,该 ...