Render函数(基础一)

一、概念:

Vue当状态更新的时候并非直接更新dom,而是通过diff比较,更新需要更新的虚拟dom,用以提高效率。
Render函数就是用来创建虚拟dom的。
Render函数通过createElement参数(此参数也是一个function),来创建Virtual Dom(虚拟节点),
我感觉当可以用参数来判断显示或者要生成某个元素的时候,用render比较方便。

二、createElement参数

  createElement参数是一个方法,有三个参数:
  1、html标签|组件|函数
  2、数据对象(元素的属性、事件等)
  3、子节点

三、例子

(1)、用Render创建锚点

Vue.component('anchor',{
        props:{
            level:{
                type:Number,
                default:1
            },
            title:{
                type: String,
                default: '特性'
            }
        },
        render:function (createElement) {
            return createElement(         //返回新建的元素
                'h'+this.level,           //父元素第一个参数:h1 标签
                [                         //父元素第二个参数:子元素数组(用[]包含)
                    createElement(        //调用createElement方法创建子元素
                        'a',{             //子元素的第一个参数 a标签
                            domProps:{    //子元素的第二个参数 dom属性对象
                                href:"#"+this.title
                            }
                        },
                        '特性'            //子元素的第三个对象,这个子元素的子元素
                    )
                ]
            )
        }
    });

注意点:如果父节点有多个字节点,那么父元素的子节点要用[]包含进来.

(2)、创建多个元素

这里有疑问,书上说虚拟dom不能重复,但是我实验了一下,我retrue多个子节点,可以显示出来多个,奇怪!!!

var Child={
    render:function (createElement) {
        return createElement('p','text');
    }
}

Vue.component('ele',{
    render:function(createElement) {
        var childEle=createElement(Child);
        return createElement(
            'div',[
                childEle,
                childEle,
                childEle,
                childEle
            ]
        );
    }
});

var app=new Vue({
    el:"#app"
})

(3)、用map的方式生成多个子节点

var Child={
    render:function (createElement) {
        return createElement('p','text')
    }
}

Vue.component('ele',{
    render:function (createElement) {
        return createElement('div',
            Array.apply(null,{length:5}).map(function () {
               return  createElement(Child);
            })
        );
    }
})

var app=new Vue({
    el:"#app"
})

理解:
Array.apply(null,{length:5})是创建包含5个非空元素的数组对象,map是映射数组对象,
按照function 里面的逻辑处理数据后,返回一个全新的数组,当前这个就是返回创建5个了Child的子元素数组

(4)、用render的方式生成列表,render不能使用v-if\v-for等指令,所以这些逻辑需要自己写js实现

   <div id="app">
        <button @click="handlerClick">显示列表</button>
        <ele :list="list"></ele>
   </div>
   Vue.component('ele',{
        props:{
            list:{
                type:Array
            }
        },
        render:function (createElement) {
            if (this.list.length){
                return createElement('ul',this.list.map(function (item) {
                    return createElement('li',item)
                }))
            }else{
              return createElement('p','此列表为空')
            }
        }
    })

    var app=new Vue({
        el:"#app",
        data:{
            list:[]
        },
        methods:{
            handlerClick:function () {
                this.list=[
                    '1','2','3'
                ]
            }
        }
    })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值