美文网首页
Vue 学习笔记 render函数

Vue 学习笔记 render函数

作者: hzl的学习小记 | 来源:发表于2019-07-19 10:07 被阅读0次

    Vue 学习笔记 九 、render函数

    9.1 render函数初步了解

    template下只允许有一个子节点

    <div id="app">
                <child :level="level">
                    klk
                </child>
    
            </div>
            
                        
    <!--        <template id="hdom">
                <div>
                <h1 v-if="level==1">
                    <slot></slot>
                </h1>               
                <h2 v-if="level==2">
                    <slot></slot>
                </h2>               
                <h3 v-if="level==3">
                    <slot></slot>
                </h3>
                </div>
            </template> -->
            <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
            <script>
    //使用vue组件定义
    //          Vue.component('child', {
    //              props:['level'],
    //              template: '#hdom'
    //          })
    
    //使用render定义
    Vue.component('child', {
        render: function(createElement){
            return createElement('h'+this.level,
             this.$slots.default);
        },
        props:['level']
    })
    
                var app = new Vue({
                    el: '#app',
                    data: {level:3}
                })
            </script>
    

    9.2 render函数的第一个参数

    在render函数的方法中,参数必须是createElement,createElement的类型是function,render函数的第一个参数可以是 String | Object | Function

            <script>
    Vue.component('child', {
                // ----第一个参数必选
                //String--html标签
                //Object---一个含有数据选项的对象
                //Function---方法返回含有数据选项的对象
                render: function (createElement) {
                    alert(typeof createElement)
                                    //return createElement('div')
                    // return createElement('h1')
                    // return createElement({
                    // template:'<div>锄禾日当午</div>'
                    // })
                    var domFun = function () {
                        return {
                            template: '<div>锄禾日当午</div>'
                        }
                    }
                    return createElement(domFun());
                }
            });
    
                var app = new Vue({
                    el: '#app',
                    data: {level:3}
                })
            </script>
    

    9.3 render函数的第二个参数

            <div id="app">
    
    <child></child>
            </div>
    
            <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
            <script>
                Vue.component('child', {
                    // ----第二个参数可选,第二个参数是数据对象----只能是Object
                    render: function(createElement) {
                        return createElement({
                            template: '<div>我是龙的传人</div>'
                        }, {
                            'class': {
                                foo: true,
                                baz: false
                            },
                            style: {
                                color: 'red',
                                fontSize: '16px'
                            },
                            //正常的html特性
                            attrs: {
                                id: 'foo',
                                src: 'http://baidu.com'
                            },
                            //用来写原生的Dom属性
                            domProps: {
                                // innerHTML: '<span style="color:blue;font-size: 18px">我是蓝色</span>'
                            }
                        })
                    }
                });
    
                var app = new Vue({
                    el: '#app',
                    data: {
                        level: 3
                    }
                })
            </script>
    
    

    9.3 render函数的第三个参数

    第三个参数也是可选===String | Array—作为我们构建函数的子节点来使用的

    Vue.component('child', {
                // ----第三个参数是可选的,可以是 String | Array---代表子节点
                render: function (createElement) {
                    return createElement('div', [
                        createElement('h1', '我是h1标题'),
                        createElement('h6', '我是h6标题')
                    ])
                }
            });
    

    9.4 this.$slots在render函数中的应用

    createElement(‘header’,header), 返回的就是VNODE
    var header = this.$slots.header; //–这返回的内容就是含有=VNODE的数组

                Vue.component('child', {
                    render: function(createElement) {
                        var header = this.$slots.header;
                        var main = this.$slots.default;
                        var footer = this.$slots.footer;
                        return createElement('div', [
                            createElement('header', header),
                            createElement('main', main),
                            createElement('footer', footer)
                        ]);
                    }
                });
    

    9.5 在render函数中使用props传递数据

                Vue.component('my-component', {
                    props: ['show'],
                    render: function(createElement) {
                        var imgsrc;
                        if (this.show) {
                            imgsrc = 'img/001.jpg'
                        } else {
                            imgsrc = 'img/002.jpg'
                        }
                        return createElement('img', {
                            attrs: {
                                src: imgsrc
                            },
                            style: {
                                width: '600px',
                                height: '400px'
                            }
                        });
                        }
                    
                })
                var app = new Vue({
                    el: '#app',
                    data: {
                        show: false
                    },
                    methods: {
                        switchShow() {
                            this.show = !this.show;
                        }
                    }
                })
    

    9.6 v-­model在render函数中的使用

            <div id="app">
                        <my-component :name="name" v-model="name"></my-component>
                <br> {{name}}
            </div>
    
            <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
            <script>
                Vue.component('my-component', {
                    props: ['name'],
                    render: function(createElement) {
                        var self = this; //指的就是当前的VUE实例
                        return createElement('input', {
                                domProps: {
                                    value: self.name
                                },
                            on: {
                                input: function(event) {
                                    //此处的this指的是什么?指的就是window
    //                              var a = this;
    //                              console.log(a)
                                    console.log(self)
                                    self.$emit('input', event.target.value)
                                }
                            }
                        })
                    }       
                })
                
                var app=new Vue({
                    el:'#app',
                    data:{
                        name:'',
                    }
                })
    

    9.7 作用域插槽在render函数中的使用

                Vue.component('my-component', {
                    render:function(creatElement){
                        return creatElement('div',this.$scopedSlots.default({
                            text:'传递的信息',
                            msg:'scopetext'
                        }))
                    }
                })
                
    

    9.8 函数化组件的应用

    使用context的转变

    // this.text----context.props.text
    //this.$slots.default-----context.children
    

    functional: true,表示该组件无状态无实例

    Demo

            <div id="app">
                <my-component value="hhh">
                </my-component>
            </div>
    
            <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
            <script>
                Vue.component('my-component', {
                    functional: true, //当前vue实例无状态,无实例(没有this的概念)
                    render: function(creatElement, context) {
                        return creatElement('button', {
                            on: {
                                click: function() {
                                    console.log(context)
                                    console.log(context.parent)
                                    console.log(context.props.value)
                                }
                            }
                        }, '点击学习context')
                    },
                    props: ['value']
                })
    
                var app = new Vue({
                    el: '#app',
                    data: {
                        msg: '父组件的msg'
                    }
                })
            </script>
    
    

    相关文章

      网友评论

          本文标题:Vue 学习笔记 render函数

          本文链接:https://www.haomeiwen.com/subject/cyfjlctx.html