vue render function(render 函数)虚拟DOM

147 阅读1分钟

vue-render-function-虚拟DOM.PNG

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>lesson 31</title>
    <style>
    </style>
    <script src="https://cdn.jsdelivr.net/npm/vue@3.4.5/dist/vue.global.min.js"></script>
</head>

<body>
    <div id="root"></div>
</body>
<script>
    // 一、render function
    // 1.[描述]:想通过变量控制文字展示的标签是h1/h2/h3/h4....
    // 2.[问题]:如果使用template的话,需要写很多标签,每个标签上都需要增加判断
    // 3.[render function]:通过render函数解决这个问题
    // 4.[render function写法]:
    /** render() {
            const {h} = Vue
            return h('h'+this.level,{},this.$slots.default())
        } **/
    // 5.[render function和template的区别]
    // 1)template在底层被编译之后会生成render function
    // 2)render function中调用vue的h方法const {h} = Vue;返回的内容实际上是vue中的虚拟DOM:(return h('h'+this.level,{},this.$slots.default()))
    // 3)this.$slots.default()如果是非具名插槽就使用defalt默认的
    // 4)this.$slots.具名插槽的名字()
    // 二、虚拟DOM:用js的对象的形式表述这个标签
    // 1.vue将template编程render 函数,render函数在返回一个虚拟DOM
    // 1)好处:vue 的性能更快;2)让Vue有跨平台的能力
    //真实DOM<div>hello</div>
    //虚拟DOM
    // {
    //     tagName:'div',
    //     text:'hello world',
    //     attributes:{}
    // }
    // 2.{h}函数是返回一个虚拟DOM节点的一个函数
    // 1)h函数的第一个参数定义了虚拟DOM中的tagName
    // 2)h函数的第二个参数是个对象,对应的是虚拟DOM中的attributes,代表真实DOM元素上是否有相关属性,如type、name、title等
    // 3)h函数的第三个参数对应的是虚拟DOM中的文本,代表真实DOM元素上的文本内容
    // 4)h函数的第三个参数可以是数组
    // 三、总结
    // 1.template--生成-->render function --调用--> {h}h函数 --生成虚拟DOM(JS对象)-->真实DOM--展示到页面上--
    const app = Vue.createApp({
        data(){
            return{
                level:1,
            }
        },
        methods: {
            handelClick(){
                
            }
        },
        template:`
        <div>
            <div>
                <my-title :level="5">
                    hello world
                </my-title>
            </div>
        </div>
        `
    });
    app.component('my-title',{
        props:['level'],
        render() {
            const {h} = Vue;
            // return h('h'+this.level,{},this.$slots.default())
            return h('h'+this.level,{},[
            this.$slots.default(),
            h('h2',{},[
                '要渲染到页面的内容',
                h('h1',{},['可以无限嵌套'])
            ])
            ])
        },
        // template:`
        //     <h1><slot /></h1>
        //     <h2><slot /></h2>
        //     <h3><slot /></h3>
        // `
    })
    const vm = app.mount('#root')
</script>
</html>