正式学习React( 三)

最基本的jsx语法什么的,我就不介绍了,唯一觉得有用点的,就是声明周期了。

下面的内容是转来的,自己也可以网上去搜,我觉得别人归纳的挺不错的,不过写法可能不是es6的,不影响学习。

在组件的整个生命周期中,随着该组件的props或者state发生改变,它的DOM表现也将有相应的变化。组件本质上是状态机;对于特定的输入,它总会返回一致的输出。

???????React为每个组件提供的生命周期分三个阶段: 

一、实例化:

  • getDefaultProps:组件初次实例化创建(不管是否成功)才会被调用,后续应用不会再出现。设置组件属性的默认值
  • getInitialState:初始化组件的状态。返回值将会作为 this.state 的初始值
  • componentWillMount:准备加载组件。render之前最后一次修改状态的机会
  • render: 只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出。渲染并返回一个虚拟DOM,React随后会把它和真实的DOM对比来判断是否有必要做出修改 
    • 只能通过this.props和this.state访问数据
    • 可以返回null、false或者任何React组件
    • 只能出现一个顶级组件(不能返回一组元素)
    • 必须纯净,意味着不能改变组件的状态或者修改DOM的输出
  • componentDidMount:在组件第一次绘制之后,会调用 componentDidMount(),通知组件已经加载完成。这个函数调用的时候,其虚拟 DOM 已经构建完成,你可以在这个函数内通过this.getDOMNode()方法访问到它,可以修改DOM,也可以获取到子组件。从这个函数开始,就可以和 JS 其他框架交互了,例如设置计时 setTimeout 或者 setInterval,或者发起网络请求。这个函数也是只被调用一次。这个函数之后,就进入了稳定运行状态,等待事件触发。 
    【注意】当React运行在服务端时,componentDidMount方法不会被调用
//下面代码在hello组件加载以后,通过 componentDidMount 方法设置一个定时器,
//每隔100毫秒,就重新设置组件的透明度,从而引发重新渲染。
var Hello = React.createClass({
  getInitialState: function () {
    return {
      opacity: 1.0
    };
  },

  componentDidMount: function () {
    this.timer = setInterval(function () {
      var opacity = this.state.opacity;
      opacity -= .05;
      if (opacity < 0.1) {
        opacity = 1.0;
      }
      this.setState({
        opacity: opacity
      });
    }.bind(this), 100);
  },

  render: function () {
    return (
      <div style={{opacity: this.state.opacity}}>
        Hello {this.props.name}
      </div>
    );
  }
});

ReactDOM.render(
  <Hello name="world"/>,
  document.body
);

二、存在期:

随着应用状态的改变,以及组件逐渐受到影响,以下方法将会依次被调用

  • componentWillRecieveProps((object nextProps)): 已加载组件收到新的参数时调用。父组件修改属性触发,可以修改属性、修改状态。输入参数 nextProps 是即将被设置的属性,旧的属性还是可以通过 this.props 来获取;可以根据属性的变化,通过调用 this.setState() 来更新你的组件状态,这里调用更新状态是安全的,并不会触发额外的 render() 调用
  • shouldComponentUpdate(object nextProps, object nextState): 组件判断是否重新渲染时调用。输入参数 nextProps 和上面的 componentWillReceiveProps 函数一样,nextState 表示组件即将更新的状态值。这个函数的返回值决定是否需要更新组件,如果 true 表示需要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。默认情况下,这个函数永远返回 true 用来保证数据变化的时候 UI 能够同步更新。在大型项目中,你可以自己重载这个函数,通过检查变化前后属性和状态,来决定 UI 是否需要更新,能有效提高应用性能。
  • componentWillUpdate(object nextProps, object nextState): 如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(...) 返回为 true,就会开始准更新组件,并调用 componentWillUpdate()。输入参数与 shouldComponentUpdate 一样,在这个回调中,可以做一些在更新界面之前要做的事情。需要特别注意的是,在这个函数里面,你就不能使用 this.setState 来修改状态,不能修改属性和状态。这个函数调用之后,就会把 nextProps 和 nextState 分别设置到 this.props 和 this.state 中。紧接着这个函数,就会调用 render() 来更新界面了。
  • render:渲染并返回一个虚拟DOM。只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出
  • componentDidUpdate(object prevProps, object prevState): 真实DOM已经完成更新。因为到这里已经完成了属性和状态的更新了,此函数的输入参数变成了 prevProps 和 prevState。可以修改DOM
var HelloWorld = React.createClass({
     componentWillReceiveProps: function () {
         console.log("componentWillReceiveProps 1");
     },
     shouldComponentUpdate: function () {
         console.log("shouldComponentUpdate 2");
         return true;
     },
     componentWillUpdate: function () {
         console.log("componentWillUpdate 3")
     },
     render: function () {
         console.log("render 4");
         return <p>Hello, {this.props.name ? this.props.name : "World"}</p>;
     },
     componentDidUpdate: function() {
         console.log("componentDidUpdate 5");
     },
 });
 var HelloUniverse = React.createClass({
     getInitialState: function () {
         return {name: ‘‘};
     },
     handleChange: function (event) {
         this.setState({name: event.target.value});
     },
     render: function () {
         return <div>
         <HelloWorld name={this.state.name}></HelloWorld>
         <br/>
         <input type="text" onChange={this.handleChange} />
         </div>
     },
 });
 React.render(<div><HelloUniverse></HelloUniverse></div>, document.body);

三、销毁&清理期:

最后,当该组件被使用完成后,componentWillUnmount方法将会被调用,在这个函数中,可以做一些组件相关的清理操作,例如取消计时器、网络请求等。

var HelloWorld = React.createClass({
     render: function () {
         console.log("render 4");
         return <p>Hello, {this.props.name ? this.props.name : "World"}</p>;
     },
     componentWillUnmount: function() {
         console.log("BOOOOOOOOOOOOOOOOOM!");
     },
 });
 var HelloUniverse = React.createClass({
     getInitialState: function () {
         return {name: ‘‘};
     },
     handleChange: function (event) {
         if (event.target.value == "123") { //输入值为123时销毁组件
             React.unmountComponentAtNode(document.getElementsByTagName("body")[0]);
             return; //销毁掉之后return退出
         }
         this.setState({name: event.target.value});
     },
     render: function () {
         return <div>
         <HelloWorld name={this.state.name}></HelloWorld>
         <br/>
         <input type="text" onChange={this.handleChange} />
         </div>
     },
 });
 React.render(<div><HelloUniverse></HelloUniverse></div>, document.body);

????????????生命周期的回调函数总结

时间: 2024-09-30 18:31:33

正式学习React( 三)的相关文章

正式学习 react(三)

有了基础的webpack基础,我们要对react的基本语法进行学习. 我这个教程全部用es6 实现.可能会忽略一些最基本的语法讲解,这些你在官网上或者其他别的地方都比我讲的全. 今天我要讲一下react用的较多的bind函数. 源码分析一波: 1 Function.prototype.bind = function() { 2 var __method = this; 3 var args = Array.prototype.slice.call(arguments); 4 var object

正式学习 React(三)番外篇 reactjs性能优化之shouldComponentUpdate

性能优化 每当开发者选择将React用在真实项目中时都会先问一个问题:使用react是否会让项目速度更快,更灵活,更容易维护.此外每次状态数据发生改变时都会进行重新渲染界面的处理做法会不会造成性能瓶颈?而在react内部则是通过使用一些精妙的技巧来最小化每次造成ui更新的昂贵的dom操作从而保证性能的. 避免直接作用于DOM react实现了一层虚拟dom,它用来映射浏览器的原生dom树.通过这一层虚拟的dom,可以让react避免直接操作dom,因为直接操作浏览器dom的速度要远低于操作Jav

正式学习react(二)

今天把上一篇还没学习完的 webpack部分学习完: 之前有说过关于css的webpack使用.我们讲了 ExtractTextPlugin 来单独管理css 讲了module.loaders下关于 css的写法: module: { loaders: [ // Extract CSS during build { test: /\.css$/, loader: ExtractTextPlugin.extract('style', 'css'), include: paths } ]}, 还讲了

正式学习React(五) react-redux源码分析

磨刀不误砍柴工,咱先把react-redux里的工具函数分析一下: 源码点这里  shallowEqual.js 1 export default function shallowEqual(objA, objB) { 2 if (objA === objB) { 3 return true 4 } 5 6 const keysA = Object.keys(objA) 7 const keysB = Object.keys(objB) 8 9 if (keysA.length !== keys

正式学习 react(一)

先安装点东西吧: atom,iis,nodejs环境. iis安装方法:点击

正式学习React(四) ----Redux源码分析

今天看了下Redux的源码,竟然出奇的简单,好吧.简单翻译做下笔记: 喜欢的同学自己可以去github上看:点这里 createStore.js 1 import isPlainObject from 'lodash/isPlainObject' 2 import $$observable from 'symbol-observable' 3 4 /** 5 * These are private action types reserved by Redux. 6 * For any unkno

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

VSTO学习笔记(三) 开发Office 2010 64位COM加载项

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

linux学习第三周总结

linux学习第三周总结 学习linux的第三周,也是惊喜最多的一周,让我看到学linux并不是很枯燥,相反非常有趣,可玩性很多,但越深入越觉得可学习的地方有很多,也有非常多的不足,所以革命尚未成功,同志更需努力 同样来简单终结一下本周的重点,内容比较多,说要简单提一下,不做详解 一.shell脚本编程基础 内容:1. 编程基础 2. 脚本基本格式3. 变量4.运算5.条件测试6.条件判断if 7.条件判断case 8.配置用户环境 shell脚本:包含一些命令或声明,并符合一定格式的文本文件