React简单介绍


Posted in Javascript onMay 24, 2017

React 背景知识

React 是一个用于构建用户界面的 JavaScript 库,主要用于构建 UI,而不是一个 MVC 框架,但可以使用 React 作为 MVC 架构的 View 层轻易的在已有项目中使用,它是一个用于构建用户界面的 JavaScript 库,起源于 Facebook 的内部项目,用来架设 Instagram 的网站,于 2013 年 5 月开源。React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

以前没有 ajax 技术的时候,web 页面从服务端整体渲染出 html 输出到浏览器端进行渲染,同样的,用户的一个改变页面的操作也会刷新整个页面来完成。直到有了 ajax 出现,实现页面局部刷新,带来的高效和分离让 web 开发者们惊叹不已。但随之而来的问题是,复杂的用户交互及展现需要通过大量的 DOM 操作来完成,这让页面的性能以及开发的效率又出现了新的瓶颈。

时至今日,谈到前端性能优化,减少 DOM 元素、减少 reflow 和 repaint、编码过程中尽量减少 DOM 的查询等手段是大家耳熟能详的。而页面任何UI的变化都是通过整体刷新来完成的。幸运的是,React 通过自己实现的 DOM Diff 算法,计算出虚拟页面当前版本和新版本之间的差异,最小化重绘,避免不必要的 DOM 操作,解决了这两个公认的前端性能瓶颈,实现高效 DOM 渲染。

我们知道,频繁的操作 DOM 所带来的性能消耗是很大的,而 React 之所以快,是因为它不直接操作 DOM,而是引进虚拟 DOM 的实现来解决这个问题

对于页面的更新,React 通过自己实现的 DOM Diff 算法来进行差异对比、差异更新,反映到页面上就是只重绘了更新的部分,从而提高渲染效率。

备注:以下性能阐述参考自尤雨溪。

对于 React 的性能方面,想??录妇洌?/p>

1. React 从来没有说过 “React 比原生操作 DOM 快”。React 的基本思维模式是每次有变动就整个重新渲染整个应用。如果没有 Virtual DOM,简单来讲就是直接重置 innerHTML。

2. 在比较性能的时候,要分清楚初始渲染、小量数据更新、大量数据更新这些不同的场合。

3. 不要天真地以为 Virtual DOM 就是快,diff 不是免费的,Virtual DOM 真正的价值从来都不是性能,而是它

1) 为函数式的 UI 编程方式打开了大门;

2) 可以渲染到 DOM 以外的其他场景,如 backend、native。

组件化

在业务开发中,遇到公共的模板部分,我们不得不将模板和规定的数据格式耦合在一起来实现组件。而在 React 中,我们可以使用 JSX 语法来封装组件,将组件的结构、数据逻辑甚至样式都聚合在一起,更加简单、明了、直观的定义组件。

有了组件化的实现,我们可以很直观的将一个复杂的页面分割成若干个独立组件,再将这些独立组件组合完成一个复杂的页面。这样既减少了逻辑复杂度,又实现了代码的重用。

React 基础

模板

<!DOCTYPE html>

<html>
  <head>

    <script src=“js/react.js”></script>
    <script src=“js/react-dom.js”></script>
    <script src=“js/browser.min.js”></script>

  </head>

  <body>
    
<div id=“example”></div>

    <script type=“text/babel”>  
  /*  
  * ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,
  * 并插入指定的 DOM 节点。
  * 
  */
    ReactDOM.render(

      <h1>Hello, 博看文思!</h1>,
      document.getElementById(‘example')

    );

    </script>
  </body>

</html>

JSX

上一节的代码, HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写

JSX的好处:

1.使用JSX语法来封装组件有什么好处:

1)熟悉的代码

2)更加语义化

3)更加抽象且直观

2.几个注意点:

1)render的方法中return的顶级元素只能是一个;

2)如果要定义样式的时候,不能这样去写

// 不要出现类似的错误,style=“opacity:{this.state.opacity};”

3)使用 className 和 htmlFor 来替代对应的class 和 for

提示:关于组件化的话题,感兴趣的话可以继续关注Vuejs、Web components等对组件的写法。/**随着更为复杂的多端环境的出现,组件标准化还有着更大的想象空间,React的组件定义不是终点,也不一定是标准,但会在组件化的道路上留下深刻de影响。**/

JSX 基本语法:

var names = [‘Alice', ‘Emily', ‘Kate'];


  ReactDOM.render(

    <div>

    {
      names.map(function (name,key) {

      return <div key={key}>Hello, {name}!</div>

    })
    
}

    </div>,
        document.getElementById(‘example')

  );

上面代码体现了 JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;遇到代码块(以 { 开头),就用 JavaScript 规则解析。

JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员。

var arr = [

    <h1>Hello world!</h1>,
    <h2>React is awesome</h2>,

];

ReactDOM.render(

    <div>{arr}</div>,
   document.getElementById(‘example')

);

组件

1.概念

React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类

2.代码示例

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello {this.props.name}</h1>;
  }
});
ReactDOM.render(
  <HelloMessage name=“John” />,
  document.getElementById(‘example')
);
var HelloMessage = React.createClass({
  render: function() {
    return <h1 className=“green”>Hello {this.props.name}</h1>;
 }
});
ReactDOM.render(
<HelloMessage name=“John” />,
  document.getElementById(‘example')
);

this.props.children

this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。它表示组件的所有子节点

var NotesList = React.createClass({
  render: function() {
    return (
    <ol>
    {
      /*
      * 因为this.props.children的返回值会根据子节点的数量返回undefined,object,array.
      * 所以react提供了一个react.Children的方法专门处理this.props.children
      * */
      React.Children.map(this.props.children, function (child) {
        return <li>{child}</li>;
      })
    }
    </ol>
    );
  }
});
ReactDOM.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
    document.getElementById(“example”)
);

 PropTypes

组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。组件类的PropTypes属性,就是用来验证组件实例的属性是否符合要求。

var MyTitle = React.createClass({
  propTypes: {
    /*
    * 声明title属性是必须的,并且数据类型要为字符串,相当于是规范化的接口文档
    * */
    title: React.PropTypes.string.isRequired,
  },
  render: function() {
    return <h1> {this.props.title} </h1>;
  }
});
var data = “123”;
ReactDOM.render(
  <MyTitle title={data} />,
    document.getElementById(“example”)
);

   错误示范:

var data = 123;
ReactDOM.render(
 <MyTitle title={data} />,
 document.body
);

getDefaultProps

getDefaultProps 方法可以用来设置组件属性的默认值

var MyTitle = React.createClass({
    getDefaultProps: function () {
      return {
        title:”hello world”
      }
    },
    render: function() {
      return <h1> {this.props.title} </h1>;
    }
  });
//  var data = “123”;
  ReactDOM.render(
    <MyTitle />,
      document.getElementById(“example”)
  );

  获取真实的 DOM 节点

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。

var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
    <div>
    <input type=“text” ref=“myTextInput” />
    <input type=“button” value=“Focus the text input” onClick={this.handleClick} />
    </div>
    );
  }
});
ReactDOM.render(
<MyComponent />,
    document.getElementById(‘example')
);

  this.state

 

组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI。React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面

var LikeButton = React.createClass({
  getInitialState: function() {
    /*
    * 设置状态的初始值
    * */
    return {liked: false};
  },
  handleClick: function() {
    /*
    * 更改状态
    * */
    this.setState({liked: !this.state.liked});
  },
  render: function() {
    var text = this.state.liked ? ‘喜欢' : ‘不喜欢';
    return (
    <p onClick={this.handleClick}>
    你 {text} 他. 点击切换.
    </p>
    );
  }
});
ReactDOM.render(
<LikeButton />,
    document.getElementById(‘example')
);

由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。

var Input = React.createClass({
  getInitialState: function() {
    return {value: ‘Hello!'};
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function () {
    var value = this.state.value;
    return (
    <div>
    <input type=“text” value={value} onChange={this.handleChange} />
    <p>{value}</p>
    </div>
    );
  }
});
ReactDOM.render(<Input/>, document.body);

组件 API

组件的7个方法:

设置状态:setState;

替换状态:replaceState;

设置属性setProps;

替换属性replaceProps;

强制更新:forceUpdate;

获取DOM节点:getDOMNode;

判断组件挂载状态:isMounted。

组件生命周期

初始化

getDefaultProps:设置默认性的值

getInitialState:设置初始的状态

componentWillMount:(组件即将被装载)

render(渲染)

componentDidMount:组件已经被装载,只会在第一个组件被调用的时候出发

运行中

componentWillReceiveProps

在组件将要接收到属性的时候,接收属性前

shouldComponentUpdate

在接收到新的 props 或者 state,将要渲染之前调用。该方法在初始化渲染的时候不会调用

componentWillUpdate 

   render 触发之前,更新

render

 渲染

componentWillUnmount

  在组件从 DOM 中移除的时候立刻被调用

销毁

componentWillUnmount

在组件从 DOM 中移除的时候被立刻调用

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
);

因为 React 组件样式是一个对象第一重大括号表示这是 JavaScript 语法,第二重大括号表示样式对象

Ajax

上面代码没有使用 jQuery 完成 Ajax 请求,这是为了便于说明。React 本身没有任何依赖,完全可以不用jQuery,而使用其他库。

var Input = React.createClass({
  getInitialState: function () {
    return {users:[]}
  },
  componentDidMount:function(){
    var _this = this;
    $.get(“http://localhost:8080/users?act=get”,function (data){
      console.log(data);
      _this.setState({
        users:data
      });
    });
  },
  render: function () {
    var users = this.state.users;
    console.log(users);
    return <table>
    {
      users.map(function (user,key){
      return <tr key={key}><td>{user.firstName}</td><td>{user.lastName}</td></tr>
    })
    }
    </table>
  }
});
ReactDOM.render(<Input/>,document.getElementById(“test”));

以上所述是小编给大家介绍的React的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
jQuery学习笔记之jQuery的事件
Dec 22 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
Apr 17 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
Jul 29 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
解决vue数组中对象属性变化页面不渲染问题
Aug 09 Javascript
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 #Javascript
微信小程序本地缓存数据增删改查实例详解
May 24 #Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 #Javascript
jquery Form轻松实现文件上传
May 24 #jQuery
微信小程序封装http访问网络库实例代码
May 24 #Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 #Javascript
微信小程序 生命周期函数详解
May 24 #Javascript
You might like
php修改时间格式的代码
2011/05/29 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
学习ExtJS Window常用方法
2009/10/07 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python类的专用方法实例分析
2015/01/09 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
毕业生求职自荐信怎么写
2014/01/08 职场文书
启动仪式策划方案
2014/06/14 职场文书
党委班子对照检查材料
2014/08/19 职场文书
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
MySQL 数据库范式化设计理论
2022/04/22 MySQL
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers