Render函数:使用原生js替代自定义指令修饰符slot

Posted linbudu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Render函数:使用原生js替代自定义指令修饰符slot相关的知识,希望对你有一定的参考价值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="Vue.2.6.10.js"></script>
</head>
<body>
    <div id="app1">
        <ele1 :show="show"></ele1>
        <button @click="show = !show">切换show的值</button>
    </div>

    <div id="app2">
        <ele2 :list=‘list‘></ele2>
    </div>

    <div id="app3">
        <ele3 :list=‘list‘></ele3>
        <button @click=‘handleClick‘>显示列表</button>
    </div>

    <div id="app4">
        <ele4></ele4>
    </div>

    <div id="app5">
        <ele5></ele5>
    </div>

    <div id="app6">
        <ele6>
            <p>有我在,备用内容不会出现</p>
        </ele6>
    </div>
</body>
<script>
    //在render函数中,不再需要也无法使用Vue的内置指令,如v-if、v-show,但均可通过原生js实现
    //数据变化--render函数生成新的虚拟dom--更新
    Vue.component(ele1,
        render(createElement) 
            if(this.show)
                return createElement(p,show的值为true);
            else
                return createElement(p,show的值为false);
            
        ,
        props:
            show:
                type:Boolean,
                default:false
            
        
    );

    var app1 = new Vue(
        el:"#app1",
        data:
            show:false
        
    );

    //使用for循环来实现v-for
    Vue.component(ele2,
        render:function(createElement)
            var nodes = [];
            for(var i = 0;i<this.list.length;i++)
                nodes.push(createElement(p,this.list[i]))
            
            return createElement(div,nodes);
        ,
        props:
            list:
                type:Array
            
        
    );
    var app2 = new Vue(
        el:"#app2",
        data:
            list:[
                book1,
                book2,
                book3
            ]
        
    );

    //使用if、else、数组map方法配合来渲染一个列表
    Vue.component(ele3,
        render:function(createElement)
            if(this.list.length)
                return createElement(ul,this.list.map(function(item)
                    return createElement(li,item);
                ));
            else
                return createElement(p,列表当前为空)
            
        ,
        props:
            list:
                type:Array,
                default:function()
                    return []
                
            
        
    );

    var app3 = new Vue(
       el:"#app3",
       data:
           list:[]
       ,
       methods: 
           handleClick:function()
               //点击后才会将项目添加到列表
                this.list = [
                book11,
                book22,
                book33
            ]
           
       ,
    );

    //实现v-model逻辑
    Vue.component(ele4,
        render:function(createElement)
            var _this = this;
            return createElement(div,[
                createElement(input,
                    domProps:
                        value:this.value
                    ,
                    on:
                        input:function(event)
                            _this.value = event.target.value;
                        
                    
                ),
                createElement(p,value: + this.value)
            ])
        ,
        data() 
            return 
                value:‘‘
            
        ,
    );

    var app4 = new Vue(
        el:#app4
    );

//所有的事件修饰符与按键修饰符同样需要自己实现
//.stop  event.stopPropogation()
//.prevent event.preventDefault()
//.self if(e.target !== e.currentTarget)
//.enter  .13 if(event.keyCode !== 13)
//.ctrl/.alt if(!e.ctrlKey/altKet)return
//.capture(!) .once(~)
//capture先执行父级事件再执行子级事件  self只执行子级事件 
//模拟聊天发生内容场景

Vue.component(ele5,
    render:function(createElement)
        var _this = this;
        //渲染聊天内容列表
        if(this.list.length)
            var listNode = createElement(ul,this.list.map(function(item)
                return createElement(li,item)
            ));
        else
            var listNode = createElement(p,暂无内容);
        
        return createElement(div,[
            listNode,
            createElement(input,
                attrs:
                    placeholder:回车发送
                ,
                style:
                    width:200px
                ,
                on:
                    keyup:function(e)
                        if(e.keyCode != 13) return;
                        _this.list.push(e.target.value);
                        e.target.value = ‘‘;//发送成功清空输入框
                    
                
            )
        ])
    ,
    data() 
        return 
            value:‘‘,
            list:[]
        
    ,
);

var app5 = new Vue(
    el:"#app5" 
);

Vue.component(ele6,
    render:function(createElement)
        console.log(this.$slots.default);
        if(this.$slots.default === undefined)
            return createElement(div,备用内容)
         else 
            return createElement(div,this.$slots.default);
        
    
);

var app6 = new Vue(
    el:#app6 
);
</script>
</html>

 

以上是关于Render函数:使用原生js替代自定义指令修饰符slot的主要内容,如果未能解决你的问题,请参考以下文章

vue基本使用

Vue 基础 - 自定义指令和 render 函数

Vue.js 的模板语法:插值v-bind事件处理

表单修饰符自定义指令计算属性侦听器过滤器生命周期

表单修饰符自定义指令计算属性侦听器过滤器生命周期

自定义指令-配置传参以及修饰符