react js 之生命周期
- react redux 结合是目前比较流行的前端开发框架,主要基于react 中的state 树为数据模型,借助redux 来控制 state 数据;下面直接从代码层面解析该框架中一个react 组件 成员函数的生命周期;
- 先给出一个redux 的数据流 模型图, 只关心react 生命周期的可以忽略;
- /**
- * Created by suyuan on 16/11/9.
- */
- import 'style/page/PostPage.scss'
- import {dispatch, changePostDataAction, getPostsData, updatePostsData} from 'action' // 定义了所有的action
- import Button from 'component/Button' // 组件
- import Post from 'component/Post' // 单片帖子组件
- // 定义自己的页面,或者组件 PostPage, 下面安装调用次序给出了每个成员函数的解释,
- class PostsPage extends React.Component { //继承后必须实现父类的方法 render
- //--------------Mounting(理解为第一次调用组件渲染)方法,目前有4个 constructor, componentWillMount, render, componentDidMount,
- // 1.1 构造
- // 在第一次构造组件时调用,继承父类,所以必须有第一句super(props),否则props不会传入父类,可能引起bug
- // 用途:一般用来初始化状态和绑定函数, 每个组件自己拥有一个state,不同的组件之间互相不影响;
- // 这里我们没有在构造函数中初始化 state,是因为用了redux 框架,真正的state 在外围的store中管理,传入的数据都在props中
- constructor(props) {
- super(props);
- }
- // 1.2 将要组装(翻译不准确)
- // 在render 之前调用,在这个方法中调用setState()不会重新渲染组建;
- // 一般不需要在该方法中做做操,用constrcutor的功能就可以了, 此方法中避免引入任何的副作用
- componentWillMount() {
- }
- // 1.3 渲染
- // 检查 props 或者state, 然后返回一个react对象,或者又其它组件组成的对象;也可以返回 null 或者false 表明不做渲染;
- // 该函数不可以有副作用,意思就是不能修改state,即不可以调用setState(),
- // 不可以和浏览器进行交互, 如果需要和浏览器交互,比如获取cookie 数据,应该在其它的函数中,比如componentWillMount 或者componentDidMount
- render(){
- return (<div className="post-parent">
- <h2>帖子</h2>
- {this.props.posts_data.map((item, index, items)=>{
- return (<Post index={index} title={item.title} uri={item.uri} image={item.image} type={item.type} onDataChange={(post)=>this.onChange(index,post)} />)
- })}
- <div className="btn">
- <Button type="secondary" onClick={this.onUpdate}>更新</Button>
- </div>
- </div>)
- }
- // 自定义的内部函数,当页面的数据被用户修改后,发送changeIconDataAction, 在reducer 中更新状态,这里不是本节重点,暂时略过
- onChange=(i, post)=>{
- dispatch(changePostDataAction(i, post));
- }
- // 自定义内部函数, 当需要保存修改过的信息时,调用
- onUpdate=()=>{
- dispatch(updatePostsData(this.props.posts_data));
- }
- // 1.4 完成组装后
- // 初始化后,渲染后才触发, react 中继承的方法有一个特点,Did是表示在动作完成后执行的函数, will是指在动作完成前执行的函数
- // 这个方法很有用, 一般进行网络请求获取数据在这里进行,里面的setState 会导致render 重新执行
- componentDidMount() {
- dispatch(getPostsData()); // 发出post 请求帖子数据, 这里的action 发出后会去做post网络请求, 一般由中间件完成post请求
- }
- //-----到这里整个页面自动的渲染工作就结束了,后面当对页面做一些数据修改的操作,会用到下面的成员函数
- //-----以下称为updating方法, 当改变了props 或者state 后,下面这些方法会被执行
- //2.1 接受props前
- // 每次接受新的props触发, 这里有个注意点,state发生变化后是不会触发函数调用的,该函数调用关心的是props,
- // 注意:在接受到新的props 后,如果你需要更新state, 可以在此处执行setState, 这里可以看作完成状态变化的工作
- // state 和props 可以做个理解,props 是父组件传给自己的参数,但是自己也可以维护一个state, 部分数据用props, 部分数据用state, 比如计算props里面的post 数量放在state中
- componentWillReceiveProps(nextProps) {
- }
- //2.2 是否需要重新渲染
- // 如果该返回false, render将不会被调用,表示组件不需要更新, 默认情况下每次state变化后返回true, 初始化渲染或者forceUpdate 的时候是不会调用该成员函数
- // 当返回false的时候,子组件的state变化还是会继续渲染; 但是本组件的 componentWillUpdate(),render(), and componentDidUpdate() 不会被调用
- shouComponentUpdate(nextProps, nextState){
- }
- // 2.3 将要重新渲染
- // 第一次初始渲染的时候不会调用,当接受到新的 props 或者state的时候,使用该方法来做更新组件前的准备工作
- // 注意,在这里不要调用this.setState(), 如果需要更新state,在 componentWillReceiveProps 中调用,我的理解是 此时的nextState 已经ok, 就不要再改变了
- componentWillUpdate(nextProps, nextState){
- }
- // 2.4 render() 重新执行1.3 的渲染函数
- // 2.5 组件更新后
- componentDidUpdate(){
- }
- // 2.* Unmounting 当改组件从DOM 中移除时,调用此方法
- componentWillUnmount(){
- }
- /* OtherApis 每个组件都提供了一些成员函数调用接口
- 1.setState(nextState, callback) 第一个参数是需要更新的状态,第二个参数是一个回调,表示状态更新完成后执行动作,一般不需要,直接用componentDidUpdate 代替回调函数作用即可
- 注意:setState 类似一个异步接口,不会立即修改state,这里不实现同步的原因应该是 setState 里面是一个批处理,以改善setState的性能
- setState 一定会重新render组件,所以要保证需要的时候才调用,或者通过控制shouldComponentUpdate() 返回bool值,避免无意义刷新
- 2.forceUpdate() 如果组件依赖与其它数据,此时希望强制重新渲染,调用后跳过shouldComponentUpdate(), 其它生命周期的函数正常调用
- */
- /* Class 成员属性
- 1.defaultProps 默认属性值,
- 2.displayName 一般不关心,react自动赋值
- 3.propTypes 需要属性类型
- */
- /* 对象实例 成员属性, 所有有意义的数据都在他们里面, 设计好每个组件的state和props 是成功的第一步
- 1.props
- 2.state
- */
- }
- // redux 会自动调用,通过下面的connect 绑定到组件上, 所有的reducer 操作后返回的newstate 都会进入这个mapStateToProps 函数,
- // 次函数把感兴趣的数据取出来, 以props的形式给绑定的组件
- const mapStateToProps=(state, props)=>{
- var posts_data = state['api'][APIS.HOME.GET_POSTS_DATA] || [
- {
- 'id': 1,
- 'title': '',
- 'type': 1,
- 'url': '',
- 'icon': ''
- },
- {
- 'id': 2,
- 'title': '',
- 'type': 1,
- 'url': '',
- 'icon': ''
- },
- {
- 'id': 3,
- 'title': '',
- 'type': 1,
- 'url': '',
- 'icon': ''
- },
- {
- 'id': 4,
- 'title': '',
- 'type': 1,
- 'url': '',
- 'icon': ''
- },
- ];
- // 注意使用切片操作,这样才能更新 render,不然内容地址不变,里面的内容变了也不会刷新, 感觉这是redux 的坑
- return Object.assign({}, {'post_data': posts_data.slice()});
- }
- // redux 框架中非常重要的 connect 函数, mapStateToProps映射函数绑定到组件, 组件接受store的影响, store 通过reducer 创建出来, reducer 接受 action 处理state
- export default connect(mapStateToProps)(PostsPage);
react js 之生命周期的更多相关文章
- React组件和生命周期简介
React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...
- React 之 组件生命周期
React 之 组件生命周期 理解1) 组件对象从创建到死亡它会经历特定的生命周期阶段2) React组件对象包含一系列的勾子函数(生命周期回调函数), 在生命周期特定时刻回调3) 我们在定义组件时, ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- 小程序基础知识点讲解-WXML + WXSS + JS,生命周期
小程序基础 小程序官方地址,小程序开发者工具,点击此处下载.在微信小程序中有一个配置文件project.config.json,此文件可以让开发者在不同设备中进行开发. 微信小程序共支持5种文件,wx ...
- 2. React组件的生命周期
2. React组件的生命周期 使用React开发时候用到最多的就是React的组件了,通过继承React.Component,加入constructor构造函数,实现Render方法即可.这当中Re ...
- Vue与React的异同 -生命周期
vue的生命周期 创建前 beforeCreate 创建 create 挂载前 beforeMount 挂载 mounted 更新前 beforeUpdate 更新 updated 销毁前 bef ...
- React 组件的生命周期方法
React 组件的生命周期方法 按渲染顺序: 1: componentWillMount() – 在渲染之前执行,在客户端和服务器端都会执行. 2: componentDidMount() – 仅在第 ...
- react第三单元(react组件的生命周期)
第三单元(react组件的生命周期) #课程目标 灵活掌握react组件的生命周期以及组件的活动过程. 能够灵活使用react的生命周期 #知识点 react的类组件的生命周期分为三个阶段 实例期 存 ...
- react学习二 生命周期
转自:https://www.cnblogs.com/gdsblog/p/7348375.html react 中compent getDefaultProps object getDefaultPr ...
随机推荐
- libZPlay 音频编码解码器库
libZPlay 音频编码解码器库 http://www.oschina.net/p/libzplay libZPlay 播放音乐并显示 FFT 图形 :http://www.oschina.net/ ...
- sysbench压力测试工具简介和使用(二)
sysbench压力测试工具使用: 2.1 测试数据库服务器的硬件配置信息如下: CPU: 24核心线程数,Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00G ...
- windows10降低IE版本
win10支持的最低IE版本为IE10,现在IE最新版本为IE11,而win10自带的浏览器是microsoft EDGE ,这给 以前的老系统带来很多不便,为了支持以前的老系统,只有降低IE浏览器 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- Java cookie和session介绍与区别
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...
- php-工厂模式(Factory Method)解析
关于工厂模式,首先要了解的就是多态这个概念:“多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为”,这句话是我在其他博客看到,他已经概括的很好了,我就直接抄袭了.哈哈 通常简单工 ...
- 初学android之简易的网易页面
WangYiActivity.java: public class WangYiActivity extends Activity implements OnClickListener{ public ...
- java下的字符流
输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表.获取对应的文字.比如, ...
- 普通图片预览及demo(非分块)
演示地址: http://codeman35.itongyin.com:19003/v2/image.html 功能:通过加载大图预览,这种方式无法和google art 比较.只能应用于简单的图片预 ...
- CSV表格读取
读取CSV表格需要CSV表格的编码格式为UTF-8 ,这个脚本中有些是为了方便使用封装的dll 不过都是一些简单的实现,自己实现也很容易,可做参考. /// <summary> /// 构 ...