Vue-render 函数

本文详细介绍了Vue中template编译成render函数的过程,以及render函数的使用方法。通过示例展示了如何动态创建组件、设置属性和嵌套元素,并解释了render函数在解析模板和优化性能方面的作用。此外,还探讨了如何利用render函数动态修改组件的节点渲染,包括传入UI元素名称或自定义组件。
摘要由CSDN通过智能技术生成

vue文件中的template内部的html 在编译的时候发生了什么?

比如

<template>
<div>
    <h1>我是首页</h1>
</div>
</template>

template里面使用的模板是HTML语法组件,其实在vue中都会被编译为render函数,因为vue中采用的是虚拟的dom进行页面组件,优点是优化页面的加载重绘性能

render函数基本使用

例:创建Render.vue组件,注意如果要使用render函数编译模板,一定不要有<template></template>

Render.vue

<script>
export default {
    render(createElement) {
        return createElement('h1', {}, '你好')
    }
}
</script>

<style scoped>

</style>

app.vue

<template>
<div>
    <Render></Render>
</div>
</template>
<script>
import Render from './views/Render'
export default {
    components: {
        Render
    }
}
</script>
<style  scoped></style>

render函数的参数

1、动态参数

例:通过render函数动态的修改当前组件的节点渲染

componentsType.vue

<script>
export default {
    props: {
        tag: {
            type: String,
            required: true
        },
        data: {
            type: String
        }
    },
    render(createElement) {
        return createElement(this.tag, {}, this.data)
    }
}
</script>

props有两个值,第一个值为tag,指的是传入的节点名称

第二个值data,就是要渲染的节点内容

App.vue

<componentsType :tag="'p'" :data="'我是一个通过render函数插入的p节点'"></componentsType>

这样做有一个好处,就是如果我们的节点是一个ui元素名称,或者是自定义组件,都会被识别

比如我们引入的是element-ui

<componentsType :tag="'el-button'" :data="'我是button'"></componentsType>

2、组件做为参数进行渲染

创建组件 sonCom'.vue

render.vue

<script>
import sonCom from './sonCom'
export default {
    props: {
        tag: {
            type: String,
            required: true
        },
        data: {
            type: String
        }
    },
    render(createElement) {
        return createElement(sonCom, {}, this.data)
    }
}
</script>

createdElement函数一共有三个参数,第一个参数我们已经知道如何使用,第二个参数其实就是对当前的节点(组件)的属性描述

3、第二个参数

render(createElement) {
        return createElement(this.tag, {
            class: 'color-red'
        }, this.data)
   }

设置class、style、value.......等等

4、第三个参数

最重要的是第三个参数,第三个参数如果不是数组,则表示渲染内容,否则,如果设置了数组,内部必须是createElement函数,代表的是当前的元素再进行嵌套

render(createElement) {
    return createElement(this.tag, {
        // class: 'color-red',
        // Dom.prototype
        domProps: {
            className: 'color-red',
        }
    }, [createElement('p', [createElement('span', '我是p元素内部的span元素')]), createElement('p', '我是p元素')])
}

真正createElement方法的核心其实就是第三个参数,因为这个参数最大的魔力就是能够嵌套,由于之前我们能够通过第二个参数设置当前元素的相关属性,所以如果一旦第三个参数实现了嵌套元素的功能,此时我们就可以实现通过js设置HTML模板

render函数解析模板

render函数还有一个最大的功能就是解析模板

render(createElement) {
        return (
            <div>
                <h2>四大名著</h2>
                <ul>
                    <li>西游记</li>
                    <li>红楼梦</li>
                    <li>水浒传</li>
                    <li>三国演义</li>
                </ul>
            </div>
        )
   }

页面中同样进行了识别和解析

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值