template和render()函数

1,104 阅读2分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

template:

可以传入字符串,vue通过给的字符串生成render函数进行虚拟dom的编译。

那从template到render都做了些什么呢? 1. 通过编译器把template编译成Ast(抽象语法树) 2. 优化AST,解析成可以用的html 3. 转换成render方法

Render():

当你在vue实例中,同时定义了template和render函数的时候,render函数的会更先被执行,render的优先级更。

render函数的使用:

说在前面: Vue 通过建立一个虚拟 DOM 来追踪自己要如何改变真实 DOM。请仔细看这行代码: return createElement('h1', this.blogTitle)

createElement 到底会返回什么呢?其实不是一个实际的 DOM 元素。它更准确的名字可能是 createNodeDescription,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息。我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为“VNode”。“虚拟 DOM”是我们对由 Vue 组件树建立起来的整个 VNode 树的称呼。

1.使用render的时候可以使用方法返回一个createELement(标签名,标签属性attribute,子虚拟节点)

2.使用 JavaScript 代替模板功能,对于我们直接用的v-if和v-for等指令,在render函数中就可以用if判断句和map函数进行代替。

3.约束:vnode必须是唯一的,如果你真的需要重复很多次的元素/组件,你可以使用工厂函数来实现。例如,下面这渲染函数用完全合法的方式渲染了 20 个相同的段落:

render: function (createElement) {
 return createElement('div', 
Array.apply(null, { length: 20 }).map(function () {
 return createElement('p', 'hi') }) ) 
}

4.JSX.当我们的render函数写的很多的时候,往往写起来很复杂,而且可读性也变差,所以使用Babel插件知识jsx写法,就可以用h()方法来直接进行模板语法编写。相当于代替了createElement

import AnchoredHeading from './AnchoredHeading.vue' 
new Vue({
 el: '#demo', 
render: function (h) { 
return ( <AnchoredHeading level={1}> <span>Hello</span> world! </AnchoredHeading> ) }
 })

为什么用render: 当template模板字符串又多又冗余的时候,可以使用render函数进行直接构建虚拟节点,vue对这些虚拟节点的构建成虚拟DOM