关于react的一些总结
之前为了学习redux买了一本《深入浅出react和redux》,只看了redux部分。最近重新一遍,还是很有收获,这里结合阅读文档时的一些理解,记下一些初学者可能不太注意的东西。
原则:
1.react原本的目标是为设计视图组件,UI=render(data);一个react组件有两个数据源可以驱动渲染,一个是记录内部状态变化的state,一个是外部传入的props。由于props中的变量可能在外部的某个地方被引用,因而props中的数据是绝对不能修改的。
生命周期:
2.react组件的生命周期有三个过程:Mount、Update、Unmount,每个过程都会触发钩子函数:
Mount----
constructor:创建一个组件类的实例,一般用来设置state和绑定成员函数的this;无状态的组件不需要constructor
getInitialState:调用React.createClass时才调用,调用React.createClass已被官方弃用。
getDefaultProps:调用React.createClass时才调用,调用React.createClass已被官方弃用。
componentWillMount:渲染前触发(一般不需要)
render:渲染组件
componentDidMount:渲染完成后触发,比如在这里执行ajax;只能在浏览器中调用
Update----
componentWillReceiveProps:组件传入的props改变或父组件重新渲染时触发
shouldComponentUpdate(nextProps,nextState):返回布尔值决定该次更新是否继续
子该函数中,this.state是setState之前的值。通过this.state,next.state,this.props,next.props对比,决定是否渲染,可以提高组件性能
componentWillUpdate:
render:
componentDidUpdate:可在服务器端或客户端调用。
Unupdate-----
componentWillUnmount:唯一一个卸载过程触发的函数,作者提醒,在mount时通过非react方式创建的dom容易造成内存泄漏,需要在这里手动清除。
数据流:
react中的数据流是自上而下的,父组件可以将props、state、自定义的一些js对象、方法、字符串传给子组件,作为子组件的props,逐级下传。
当几个组件需要共享某个状态变量的时候,react文档提到一个概念“lifting state up”:意思是将这个共享的状态变量放到最近的一个共同父组件中,由这个父组件以props的方式传给子组件。
状态管理:
当我们的应用逐渐变大复杂的时候,往往会发现组件状态管理变得麻烦,对状态进行集中管理是一个好的方案。
1.redux由flux改进而来,使用redux,全局只有一个store保存整个应用的state,这个state是由一个root reducer函数返回的。
2.每当某个组件对应的state需要更新时,调用store.dispatch(action)方法,让root reducer函数根据action.type计算出新的全局state。而action只是一个携带信息的纯js对象。
3.root reducer 内部可以根据action.type调用子reducer函数,该子函数用于计算对应于某个组件的state。
4.单纯使用redux时,在组建生命周期中其实只需要用到store的4个方法:.dispatch() .subscribe() .unSubscribe() .getState() 。
5.redux把组件分两类:无状态的展示组件和有状态的容器组件。用connect()()方法将容器方法(跟踪state,触发state改变)和展示组件封装并生成容器组件。
6.使用redux时,由于app的架构发生了改变,文件结构变成了四个部分:
actionType.JS //定义action类型
actionCreateor.js //返回一个触发reducer的action
reducer //计算新的state,其中state参数不可修改
store //该文件返回一个全局store
component //存放组件和connect方法生成的组件
6.扩展redux功能时可以使用中间件,中间件一般是增强store方法的功能,并在action到达reducer之前对其进行处理,比如异步action
7.为了便捷开发,可以引入“react-redux”,提供了Provider组件让我们全局访问store,connect函数生成容器组件
路由:
就用react-router
v2~3版本是静态路由,直接配置url和组件的对应关系。
v4开始动态路由,将路由组件当作react组件来使用,跟app的组件耦合比较深,打包比较麻烦。
关于react的一些总结的更多相关文章
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
- 十分钟介绍mobx与react
原文地址:https://mobxjs.github.io/mobx/getting-started.html 写在前面:本人英语水平有限,主要是写给自己看的,若有哪位同学看到了有问题的地方,请为我指 ...
- RxJS + Redux + React = Amazing!(译一)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...
- React 入门教程
React 起源于Facebook内部项目,是一个用来构建用户界面的 javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组件内 ...
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- 2017-1-5 天气雨 React 学习笔记
官方example 中basic-click-counter <script type="text/babel"> var Counter = React.create ...
- RxJS + Redux + React = Amazing!(译二)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- React的使用与JSX的转换
前置技能:Chrome浏览器 一.拿糖:React的使用 React v0.14 RC 发布,主要更新项目: 两个包: React 和 React DOM DOM node refs 无状态的功能 ...
- Vue.js 2.0 和 React、Augular等其他框架的全方位对比
引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...
随机推荐
- Tidyverse|数据列的分分合合,爱恨情仇
Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...
- 13206抢票代码 py
抢票代码 https://github.com/Bingshuli/12306Python 谷歌驱动 http://chromedriver.storage.googleapis.com/index. ...
- 学习笔记-CTF密码相关
RSA共模攻击 RSA基本原理 ① 选择两个大的质数p和q,N=pq: ② 根据欧拉函数,求得r=(p-1)(q-1): ③ 选一个小于r的整数e,求得e关于模r的模反元素d: ④ 将p和q的 ...
- Python 删除含有只读文件(夹)的文件夹
def rm_read_only(fn, tmp, info): if os.path.isfile(tmp): os.chmod(tmp, stat.S_IWRITE) os.remove(tmp) ...
- Python 如何实现 单实例
出处:https://stackoverflow.com/questions/380870/make-sure-only-a-single-instance-of-a-program-is-runni ...
- Python 如何写 Ubuntu syslog
address='/dev/log' 是关键 import logging from logging.handlers import SysLogHandler logger = logging.ge ...
- 源码安装nginx 方法二
yum 仓库不能用大写字母 [root@oldboy conf.d]# gzip * 压缩当前目录下的所有文件 gzip ./* gzip . gzip./ # 关闭防火墙和selinux [root ...
- Django中修改DATABASES后,执行python manage.py ****报错!UnicodeEncodeError
Django中修改DATABASES后,执行python manage.py ****报错!UnicodeEncodeError: 'latin-1' codec can't encode chara ...
- 企业云桌面-03-安装第1个企业 CA-013-CA01
作者:学 无 止 境 QQ交流群:454544014 注意: <企业云桌面>系列博文是<企业云桌面规划.部署与运维实践指南>的基础部分,因为书中内容涉及非常多,非常全面,所以基 ...
- Math.Round和四舍五入
Math.Round方法并不是像想象中的四舍五入, 可以从下面的输出结果看出来: Math.Round(3.44, 1); //Returns 3.4. Math.Round(3.45, 1); // ...