Vue2.6x渲染函数学习笔记

163 阅读1分钟

最近在看vue官方的视频教程(尤大大手写mini版vue3的视频,发现渲染函数掌握不到位,所以再学了一遍)

1.render选项参数createElement函数

let getChildrenContent = (vNode)=>{
    vNode.map(node=>{
        return node.children?
        getChildrenContent(node):
        node.text
    })
}
Vue.component('a-head',{
render(createElement){
    function getHeadId() {
        return getChildrenContent(this.$slots.default)
    }
    let headId = getHeadId()
    return createElement(
            //第一个参数可以是节点名称(‘div’)|| 选项对象 || resolve 了上述任何一种的一个 async 函数。必填项。
            ‘h’+this.level,
            //第二个参数是数据对象(可选),包含了元素节点上可以定义的一些属性,比如'v-on','class'之类
            {
                on: {
                    click: alert(headId)
                }
            },
            //第三个参数是子级虚拟节点(可选),字符串或者数组
            [
                createElement('a', {
                    attrs: {
                        name: headId,
                        src: #+headId
                    }
                }, this.$slots.default)
            ]
        )
    },
    prop: {
        level: { 
            type: String,
            required: true
        }
    }
})

2.作用域插槽如何在render中实现

Vue.component('my-name', {
    render(h){
        return h('div', this.$scopeSlots.default({
           user: this.user
        }))
    },
    props: {
        user: {
            type: String,
            required: true
        }
    }
})

3.如果在render中访问render中子组件作用域插槽比如获取下面child组件中默认作用域插槽绑定的text

Vue.component('father', {
    render(h) {
        return h('child',
        {
            scopedSlots: {
                default: (props) => h('span', props.text)
            }
        })
    }
})

4.实现v-model

可以利用数据对象中的domProps获取value, 再加上input事件,进行数据双向绑定