在使用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官方文档!