Web 前端开发 让前端飞

深入React技术栈:初入React世界

2017-03-24  本文已影响0人  FeRookie

React简介

在每次数据改变后,react有一个diff算法,可以重写计算virtual dom(也就是JavaScript对象树),和上一次的virtual dom进行对比,然后对发生变化的部分进行批量更改。注意:对比DOM也是需要花费性能的。

JSX语法

React为了方便view层组件化,承载了构建HTML结构化页面的职责。react主要是通过创建和更新虚拟元素来管理整个virtual DOM的。

虚拟元素,可以理解为真实元素的对应。其构建和更新都是在内存中完成。在react中创建的虚拟元素可以分为两类:

  1. DOM元素 --- 对应元素DOM元素
  2. 组件元素 --- 对应自定义元素

我们使用JavaScript来描述页面中的DOM元素,这些元素可以简单的被描述为纯粹的JSON对象,如下:

   <button type="button" class="btn btn-default">
       <em>Confirm</em>
   </button>

其中包括了元素的类型和属性,如果转为JSON对象:

{
        type: 'button',
        props: {
            className: 'btn btn-default',
            children: {
                type: 'em',
                props: {
                    children: 'Confirm'
                }
            }
        }
    }
这样我们就可以在JavaScript中创建virtual DOM元素了。
const Button = ({color, text}) => {
        return {
            type: button,
            props: {
                className: `btn btn-${color}`,
                children: {
                    type: 'em',
                    props:{
                        children: text
                    }
                }
            }
        }
    }

我们可以换一种思维考虑,以上的Button方法其实也可以作为元素存在,方法名对应了元素类型,参数对应了DOM元素属性,所以这样构建的元素就是自定义类型元素或者是组件元素。
这也是react的核心思想之一,因为有公共的表达方法,我们可以让层层嵌套的元素封装成组件,然后用递归渲染的方式进行构建DOM树。

如下看更深层次的嵌套:

const DangerButton = (text) => ({
        type: Button,
        props: {
            color: 'red',
            children: text
        }
    })
    
    const DeletAccount = () => ({
        type: 'div',
        props: {
            children: [
                {
                    type: 'p',
                    props: {children: 'are you sure?'}
                },
                {
                    type: DangerButton,
                    props: {children: 'Confirm'}
                },
                {
                    type: Button,
                    props: {
                        color: 'red',
                        children: text
                    }
                }
            ]
        }
    })

以上我们可以看到实现的一个提示语和两个按钮的功能模块,可以见得这样的写法是很难以接受的,那么我们需要HTML的写法来提供支持,所以产生了JSX语法。

const DeletAccount = () => (
        <div>
            <p>are you sure?</p>
            <DangerButton>Confirm</DangerButton>
            <Button color='blue'>Cancle</Button>
        </div>
    )
上一篇下一篇

猜你喜欢

热点阅读