react运行阶段

    1. 运行中可以使用的函数
      componentWillReceiveProps:父组件修改属性触发,可以修改新属性,修改状态。字面意思,组件将要接收属性,这个函数触发的时机就是组件的属性将要发生改变的时候,但是需要注意的是,他是在组件将要改变之前触发,比如说父组件修改了子组件的属性,那么在修改真正发生之前,会触发这个函数,也就说,给开发者一个机会去处理这个属性,开发者可以对比新属性和旧属性,并修改属性和状态,这样,我们就可以在属性真正的被传送到组件之前,对他进行处理,有可能对应的更改一些状态,有可能是修改属性本身。

      shouldComponentUpdate:返回false会阻止render调用。英文意思是组件是否需要更新,也就是react会询问开发者,组件是否需要更新,有的时候,状态发生变化,组件可能不需要更新,只是更新一些数据,不需要更新显示出来的内容,这个时候,就需要这个函数返回false,运行中后面的三个函数都是和render相关的,如果这个函数返回发false,就会直接中断这个流程,后面的三个函数,都不会执行。这里要注意,大部分时候,我们是不需要使用这个函数的,只有在你真正的找到项目的瓶颈之后,再根据需要去修改,因为对这个函数使用不当的话会导致很多无法预料的问题。

      componentWillUpdate:不能修改属性和状态。是在render之前执行

      render:只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和dom输出。

      componentDidUpdate:可以修改dom

    2. 运行中触发顺序。
      这个例子是input输入什么,页面内容就会变成hello什么,出事是hello World

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>测试</title>
      </head>
      <body>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
          <script type="text/jsx">
              var style={
                 color:"red",
                 border:"1px solid #f99",
                 width:"200px",
                 height:"50px"
              };
              var HelloWorld= React.createClass({
                  componentWillReceiveProps:function(){},
                  shouldComponentUpdate:function(){return true;},//得返回一个true,否则报错
                  componentWillUpdate:function(){},
                  render:function(){
                      return <p>Hello,{this.props.name ? this.props.name : "World"}</p>;
                  },
                  componentDidUpdate:function(){},
              });
              var HelloUniverse=React.createClass({
                  getInitialState:function(){
                      return {name:""};
                  },
                  handleChange:function(event){
                      //用来响应input的输入事件
                      this.setState({name:event.target.value});
                  },
                  render:function(){
                      return <div>
                      <HelloWorld name={this.state.name
                          //这里引用了HelloWorld的组件,所以HelloUniverse是他的子组件
                      }></HelloWorld>
                      <br />
                      <input type="text" onChange={this.handleChange} />
                      </div>
                  },
              });
              React.render(<div style={style}><HelloUniverse></HelloUniverse></div>,document.body)
              // 写为React.render(<div style={style}><HelloWord></HelloWorld></div>,document.body)看看效果
          </script>
      </body>
      </html>

      改一下代码,查看输出属性的顺序。

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>测试触发顺序,不输入不会触发五个函数,只会触发render</title>
      </head>
      <body>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
          <script type="text/jsx">
              var style={
                 color:"red",
                 border:"1px solid #f99",
                 width:"200px",
                 height:"50px"
              };
              var HelloWorld= React.createClass({
                  componentWillReceiveProps:function(){
                      console.log("componentWillReceiveProps,1");
                  },
                  shouldComponentUpdate:function(){
                      console.log("shouldComponentUpdate,2");
                      return true;
                  },//得返回一个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){
                      //用来响应input的输入事件
                      this.setState({name:event.target.value});
                  },
                  render:function(){
                      return <div>
                      <HelloWorld name={this.state.name
                          //这里引用了HelloWorld的组件,所以HelloUniverse是他的子组件
                      }></HelloWorld>
                      <br />
                      <input type="text" onChange={this.handleChange} />
                      </div>
                  },
              });
              React.render(<div style={style}><HelloUniverse></HelloUniverse></div>,document.body)
              // 写为React.render(<div style={style}><HelloWord></HelloWorld></div>,document.body)看看效果
          </script>
      </body>
      </html>

      没有输入内容的时候,只会触发render,

      每输入一次内容,就会触发一次。

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title></title>
      </head>
      <body>
          <script type="text/javascript" src="http://cdn.bootcss.com/jquery/2.0.3/jquery.min.js"></script>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
          <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
          <script type="text/jsx">
          $(document).ready(
            function(){
              var style={
                 color:"red",
                 border:"1px solid #f99",
                 width:"200px",
                 height:"50px"
              };
              var HelloWorld= React.createClass({
                  componentWillReceiveProps:function(newProps){
                      console.log("componentWillReceiveProps,1");
                      console.log(newProps);
                  },
                  shouldComponentUpdate:function(){
                      console.log("shouldComponentUpdate,2");
                      return true;
                  },//得返回一个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){
                      //用来响应input的输入事件
                      this.setState({name:event.target.value});
                  },
                  render:function(){
                      return <div>
                      <HelloWorld name={this.state.name
                          //这里引用了HelloWorld的组件,所以HelloUniverse是他的子组件
                      }></HelloWorld>
                      <br />
                      <input type="text" onChange={this.handleChange} />
                      </div>
                  },
              });
              React.render(<div style={style}><HelloUniverse></HelloUniverse></div>,document.body)
              // 写为React.render(<div style={style}><HelloWord></HelloWorld></div>,document.body)看看效果
          })
          </script>
      </body>
      </html>

      查看一下输出,这里输出了一个object

时间: 2024-12-25 17:58:25

react运行阶段的相关文章

React组件生命周期-正确执行运行阶段的函数

一. 二. 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 <script src="./jquery-2.1.4.min.js"><

React Native 系列(二)

前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让你们能够在看React Native语法的时候不那么费劲,有过前端开发经验的可以直接忽略. 什么是React React是一个JavaScript框架,用来开发web应用.Web应用开发中,比较流行的有三个框架: react angular vue 从名字上,就能看到react native是基于R

从零学React Native之08Image组件

开发过程中, 几乎每个项目都会用到图片. RN就是通过Image组件显示图片.既可以加载网络图片,也可以加载本地资源图片. Image组件必须在样式中声明图片的款和高.如果没有声明,则图片将不会被呈现在界面上. 网络图片加载 加载网络图片非常简单, 直接上代码: 修改index.ios.js或者inde.android.js import React, { Component } from 'react'; import { AppRegistry, StyleSheet, View, Imag

前端react 基础学习一

1.react介绍 本质:React 是一个用于构建用户界面的 JAVASCRIPT 库.不是一个MVC框架,而是一个前端界面开发工具,用于构建组件化UI的库.所以顶多算是MVC中的V(view). 特点:减少与DOM的交互.React可以与已知的库或框架很好地配合. 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中. React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单. 主要能做什么:1.轻松地创建用户交互界面,声明式

前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)持续更新 &#362414;

原文: http://blog.gqylpy.com/gqy/438 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

谈谈APP架构选型:React Native还是HBuilder

原文链接 导读:最近公司的一款新产品APP要进行研发,老大的意思想用H5来做混合APP以达到高效敏捷开发的目的.我自然就开始进行各种技术选型的调研,这里重点想说的是我最后挑选出的2款hybrid app开发技术方案:RN(react native),HBuilder.React Native是大名鼎鼎的Facebook的开源技术框架,而HBuilder是国内的H5工具开发公 司DCLOUD的产品.我自己先总结下吧:这两个技术框架在开发效率上基本上可以媲美WEB开发的速度,RN强调的是“Learn

React学习—组件

一.定义 组件就像JavaScript的函数.组件可以接收任意输入(称为"props"), 并返回 React 元素,用以描述屏幕显示内容. 二.组件的分类 1.函数式组件(无状态组件) 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到要state状态的操作.在大部分React代码中,大多数组件被写成无状态的组件,通过简单组合可以构建成其他的组件等:这种通过多个简单然后合并成一个大应用的设计模式被提倡. function Welcome(props) { re

如何写好react组件

react 组件方面: 总结 React 组件的三种写法 及最佳实践 [涨经验] React组件编写思路(一) 使用react-router实现单页面应用时设置页面间过渡的两种方式 [翻译]基于 Create React App路由4.0的异步组件加载(Code Splitting) React进阶--使用高阶组件(Higher-order Components)优化你的代码 Higher-order Components 高阶组件 redux方面: Redux-saga 中文文档 https:

react Native如何实现跨平台

react Native是通过虚拟DOM实现跨平台,运行时 将虚拟DOM转换为相应的web编码.android编号.ios编码进行运行的.   代码实现: 01.html: <!DOCTYPE html> <html lang="en"> <head>    <meta charset="UTF-8">    <script src="react.js"></script>