在使用vue2时,如果想要渲染模板到页面,可以使用template模板渲染输出。
在vue3,可以选择使用render方法进行编程式的渲染。虽然vue2也有render,但用法已改变,如下:
// 2.0 渲染函数export default {render(h){return h('div')}}// 3.x语法export default {render() {return h('div')}}
以上的函数,都会创建一个div标签的虚拟DOM节点。
虚拟DOM
虚拟DOM指的是,允许Vue在更新浏览器之前在内存中创建渲染组件。作用是:对已有的DOM进行比较,并修改部分更新实际DOM。
因此,在render返回的虚拟DOM节点中,在Vue生态里称为VNode,该接口是允许Vue在浏览器DOM中写入这些对象的接口。它们包含使用Vue所需的所有信息。
h函数
那么如何创建虚拟DOM呢?就需要用到h函数了,如果说render是渲染虚拟DOM,那么h就是创建虚拟DOM!使用方法为:h(标签名, {属性}, 内容),如果是嵌套标签的写法,那就是h(标签名, {属性}, [继续嵌套h(省略)])。
实际上,h函数是createVNode()是一样的,但在vue3里createVNod函数比h函数多做了性能渲染,渲染速度更快。
如下使用例子:
import {createApp} from 'vue';import {defineComponent, h, createVNode} from 'vue';import HelloWorld from "./components/HelloWorld.vue";const img = require('./assets/logo.png');const App = defineComponent({render(){return h("div", {id: "app"},[h("img",{src: img}),h(HelloWorld, {msg: "HelloWorld"}),createVNode("h1", {class: "hello"}, "HelloWorld")])}})createApp(App).mount("#app");
渲染结果如图:
使用编程式方式来代替Vue模板功能
平常,在使用Vue2的使用,很喜欢使用v-if、v-for、v-on等一些Vue模板功能,那么如何使用render和h来代替这些呢?
其实直接使用JS差不多,如代替v-if写法 :
//在模板是这样使用<ul v-if="items.length"><li v-for="item in items">{{item.name}}</li></ul><p v-else>No items found</p>
//使用编程式的写法props:['items'],render(){if(this.items.length){return h('ul',{},[return h('li', item.name)])}else {return h('p', 'No items found')}}
更多写法参考Vue官方文档!
