React 仅仅只是你的界限

React 起源于Facebook内部项目,是一个用来构建用户界面的javascript库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组件内部通过state来维护组件状态的变化,当组件的状态发生变化时,React通过虚拟DOM技术来增量并且高效的更新真实DOM。本文将对React的这些特点进行简单的介绍。

一个简单的React组件 —— HelloReact 



考虑到有的同学还不曾了解过React,我们先来写一个简单的React组件,让大家一睹为快!

// 创建一个HelloReact组件
var HelloReact = React.createClass({
    render:function(){
        return (
            <div>
                 Hello React!
            </div>
        )
    }
});

// 使用HelloReact组件
ReactDOM.render(
    <HelloReact />,
    document.querySelector(‘body‘)
)

这样就定义了一个React组件,当然要运行这段代码是有条件的,需要引入React库,还需要引入JSX语法转换库,这里不多说了,这些基础的东西还需要各位亲自实践才好!

React 核心技术 —— 虚拟DOM(Virtual DOM)



在前端开发的过程中,我们经常会做的一件事就是将变化的数据实时更新到UI上,这时就需要对DOM进行更新和重新渲染,而频繁的DOM操作通常是性能瓶颈产生的原因之一,有时候我们会遇到这样一种尴尬的情况:比如有一个列表数据,当用户执行刷新操作时,Ajax会重新从后台请求数据,即使新请求的数据和上次完全相同,DOM也会被全部更新一遍并进行重新渲染,这样就产生了不必要的性能开销。

React为此引入了虚拟DOM(Virtual DOM)机制:对于每一个组件,React会在内存中构建一个相对应的DOM树,基于React开发时所有的DOM构造都是通过虚拟DOM进行,每当组件的状态发生变化时,React都会重新构建整个DOM数据,然后将当前的整个DOM树和上一次的DOM树进行对比,得出DOM结构变化的部分(Patchs),然后将这些Patchs 再更新到真实DOM中。整个过程都是在内存中进行,因此是非常高效的。借用一张图可以清晰的表示虚拟DOM的工作机制:

React 的生命周期



React 把每个组件都当作一个状态机来维护和管理,因此每个组件都拥有一套完整的生命周期,大致可以分为三个过程:初始化、更新和销毁。生命周期的每一个过程都明确的反映了组件的状态变化。对于开发来说就能很容易的把握组件的每个状态,不同的状态时期做对应的事情,互不干扰。以下是和组件生命周期相关的几个方法:

getDefaultProps —— 组件创建时

getInitialState —— 组件实例化状态

componentWillMount —— 组件挂载前

componentDidMount —— 组件挂载后

componentWillReceiveProps —— 组件属性被改变时

shouldComponentUpdate —— 组件是否更新

componentWillUpdate —— 组件更新前

componentDidUpdate —— 组件更新后

componentWillUnmount —— 组件销毁前

初始化



对于外部系统来说,组件是一个独立存在的封闭系统,内部的逻辑被隐藏,只对外暴露传递数据的接口,而React为我们提供了两种方式来向组件传递数据,即 props 和 state。

props 是在调用ReactDOM.render() 时通过标签属性xxx传递,然后通过 this.props.xxx 来获取,getDefaultProps允许你为组件设置一个默认的props值,在没有传递props的情况下显示默认值。

// 创建HelloReact组件
var HelloReact = React.createClass({
    /**
     * 当设置props的默认值 当没有传递时显示默认值
     * @return {}
     */
    getDefaultProps:function(){
       return {
           data:"暂无数据"
       }
    },
    render:function(){
        return (
            <div>
               //显示data,当props发生变化时会自动更新
               {this.props.data}
            </div>
        )
    }
});//传递props属性data
ReactDOM.render(
   <HelloReact data={"Hello React!"} />,
   document.querySelector(‘body‘)
)

和 props 不同的是,state不能通过外部传递,因此在使用state之前,需要在getInitialState中为state设置一个默认值,然后才能通过this.state.xxx来访问,当组件被挂载完成时,触发componentDidMount方法,我们可以在这里通过Ajax请求服务器数据,然后再通过setState()把state的值设置为真实数据。

// 创建HelloReact组件
var HelloReact = React.createClass({
    /**
     * 设置组件的初始值
     * @returns {{data: Array, msg: string}}
     */
    getInitialState:function(){
        return {
            data:"数据加载中..." //初始值为[]
        }
    },
    /**
     * 挂载后首次加载数据
     */
    componentDidMount:function(){
        this.requestData();//请求数据
    },
    /**
     * 请求后台数据
     */
    requestData:function(){
        $.ajax({
            url:‘xxxx.ashx‘,
            data:{},
            success:function(data){
                this.setState({
                    data:data  //通过setState()更新服务器数据
                })
            }
        }.bind(this))
    },
    render:function(){
        return (
            <div>
               {this.state.data}
            </div>
        )
    }
});
ReactDOM.render(
    <HelloReact  />,
    document.querySelector(‘body‘)
)

更新



props属性是只读的,如果想要改变props的值,只能通过重新调用render()来传递新的props,但要注意的是,重新执行render()组件不会被重新挂载,而是通过虚拟DOM技术进行增量更新和渲染,这时还会触发componentWillReceiveProps方法,并将新的props作为参数传递,你可以在这里对新的props进行处理。

相比props,state天生就是用来反映组件状态的,因此它的值是可以被改变的,当state的值被改变时,通过setState就可以改变state的值,React同样也是采用虚拟DOM技术来计算需要被更新的部分,而不是牵一发动全身的更新和渲染。

当props和state的状态发生变化后,组件在即将更新之前还会触发一个叫shouldConponentUpdate的方法,如果shouldConponentUpdate返回的是true,不管props和state的值和上一次相比有没有变化,React都会老老实实的进行对比。此时,如果你确定以及肯定两次数据没有变化,那就让shouldConponentUpdate返回false,React就不会进行diff了,更不会重新渲染了。瞬间省去了diff的时间,是不是很机智的说。

销毁



当组件从DOM中被移除时,React会销毁之。在销毁之前,细心的React还触发componentWillUnmount来通知你,看你最后有没有什么话想对这个即将逝去的组件说,当然你没什么事就不用了。

什么时候用props,什么时候用state



我们已经知道可以通过props和state两种方式向组件传递数据,props是只读的不能被改变,而state是用来反映一个组件的状态,是可以改变的。因此,当组件所需要的数据在调用时是已经确定的,不频繁发生变化的,就可以使用props来传递,相反,当组件所需要的数据在调用时不能确定,需要等待异步回调时才能确定,比如ajax请求数据,input的onchange事件,这时就需要使用state来记录和改变这些值得变化。

React 给前端带来的反思



以上便是对React的一个简单认识,React到底有多好?  我们需要反思,在WebApp横行霸道的时代,各路优秀的JS库百花齐放,旨在解决移动端的性能问题和开发效率。对于一个前端开发人员来说,既要跟上时代的步伐,也不能被这些新事物迷失了方向,每当一个新的事物被推出来之前,一定有一个强大的力量在背后做足了品牌包装。因此,对于我们来说既不能盲目崇拜,也不能消极对待,取其精华,去其糟粕,在取与舍之间找到一个平衡,来开阔自己的眼界,因为React仅仅只是你的界限。

时间: 2024-10-04 18:44:05

React 仅仅只是你的界限的相关文章

React组件性能优化

转自:https://segmentfault.com/a/1190000006100489 React: 一个用于构建用户界面的JAVASCRIPT库. React仅仅专注于UI层:它使用虚拟DOM技术,以保证它UI的高速渲染:它使用单向数据流,因此它数据绑定更加简单:那么它内部是如何保持简单高效的UI渲染呢? React不直接操作DOM,它在内存中维护一个快速响应的DOM描述,render方法返回一个DOM的描述,React能够计算出两个DOM描述的差异,然后更新浏览器中的DOM. 就是说R

初探React,将我们的View标签化

前言 我之前喜欢玩一款游戏:全民飞机大战,而且有点痴迷其中,如果你想站在游戏的第一阶梯,便需要不断的练技术练装备,但是腾讯的游戏一般而言是有点恶心的,他会不断的出新飞机.新装备.新宠物,所以,很多时候你一个飞机以及装备还没满级,新的装备就又出来了,并且一定是更强! 于是很多人便直接抛弃当前的飞机与装备,追求更好的,这个时候如果是人民币玩家或者骨灰级大神玩家的话,基本可以很快站在世界的顶端,一者是装备好,一者是技术好,但是我不愿意投入太多钱,也不愿意投入过多精力,于是在一套极品装备满级后会积累资源

React.js 是什么?

在相当长的一段时间内,我很努力地去尝试理解 React 是什么以及它在应用架构上的健壮程度.这篇文章解答了我希望别人为我解答的疑惑. React 是什么? 和 Angular,Ember,Backbone 等等比起来 React 的表现如何?要如何处理数据?要如何连接服务器?JSX 到底是什么?“组件”又是如何定义的? 停. 立刻停下来. React 仅仅是 VIEW 层. React 通常和其他的 JavaScript 框架同时被提及,但是说“React 对比 Angular”却讲不通,因为它

ReactJS入门(一)—— 初步认识React

React刚开始红的时候,由于对其不甚了解,觉得JSX的写法略非主流,故一直没打算将其应用在项目上,随着身边大神们的科普,才后知后觉是个好东西. 好在哪里呢?个人拙见,有俩点: 1. 虚拟DOM -- 在DOM树的状态需要发生变化时,虚拟DOM机制会将同一Event loop前后的DOM树进行对比(自然通过一系列高效的算法),如果俩个DOM树存在不一样的地方,那么React仅仅会针对这些不一样的区域(DOM diff)来进行响应的DOM修改,从而实现最高效的DOM操作和渲染. 如下图,我们修改了

react.js 从零开始(一)

React 是什么? 网络上的解释很多...我这里把他定义为 通过javascript 的形式组件化 html的框架... React 仅仅是 VIEW 层. React 提供了模板语法以及一些函数钩子用于基本的 HTML 渲染.这就是 React 全部的输出——HTML.你把 HTML / JavaScript 合到一起,被称为“组件”,允许把它们自己内部的状态存到内存中(比如在一个选项卡中哪个被选中),不过最后你只是吐出 HTML. React 的安装? 首先是下载 reactjs的文件包.

vue、react、angular三大框架对比

前端当前最火的三大框架当属vue.react以及angular了. 但是在做项目的时候,我们怎么去选择呢?  这里做一个比较,希望大家可以有一个比较清晰的认识. vue与react vue和react是当前最火的两个前端框架,vue的发展很快,但是目前来说,react的生态系统会更强大,世界上使用这个框架的人也很多. 另外,react是facebook官方维护的, 而vue是尤雨溪本人维护的. 并且在其他周边库,如react的react-rouer和redux,是react社区在维护的. 而vu

ReactJS入门

ReactJS入门学习一 阅读目录 React是什么? React如何制作组件? 理解组件属性props 理解页面中如何渲染数据的 理解从服务器端获取数据及理解state的 回到顶部 React是什么? React仅仅是VIEW层,而我们经常看到Angular是一个完整的框架,而React不是,因此我们看到他们两个的侧重点不一样,所以也不能比较的,React提供了模板语法及一些函数钩子用于HTML的渲染,只用于View层. React的优点?       1. 虚拟DOM 在DOM树的状态发生改

2016年前端web开发趋势总结

如果你是名手机开发,你的老板希望你学习js,学习react_active,你会想为什么?我是名ios/android工程师,为什么学习大学老师讲过的js?Kidding me?真正的原因,是你正在处于"大前端时代". 既来之则安之.前端现状,且听我细细到来.2016年是前端框架成熟的一年,angular和react和vue三分天下.angular包含angular1和angular2,两个版本都是完整的MVVC框架,在手机端,基于angular的ionic2,一款IOS风格的webAP

前沿技术解密——VirtualDOM

作为React的核心技术之一Virtual DOM,一直披着神秘的面纱. 实际上,Virtual DOM包含: Javascript DOM模型树(VTree),类似文档节点树(DOM) DOM模型树转节点树方法(VTree -> DOM) 两个DOM模型树的差异算法(diff(VTree, VTree) -> PatchObject) 根据差异操作节点方法(patch(DOMNode, PatchObject) -> DOMNode) 接下来我们分别探讨这几个部分: VTree VTr