Vue推荐在绝大多数情况下使用模板来创建HTML。然而在一些场景中,真的需要JavaScript的完全编程的能力,这就是渲染函数,它比模板更接近编译器。本文将详细介绍Vue渲染函数
下面是一个例子,如果要实现类似下面的效果,其中,H标签可替换
& lt; h2> & lt; name=" hello world " href=" https://www.yisu.com/zixun/# hello world”rel=巴獠縩ofollow”rel=巴獠縩ofollow”比; 你好世界! & lt;/a> & lt;/h2>
在HTML层,像下面这样定义来组件接口:
& lt; anchored-heading:水平=" 1 "在Hello world ! & lt;/anchored-heading>
当开始写一个通过水平支撑动态生成标题标签的组件,可能很快想到这样实现:
& lt;脚本type=" text/x-template " id=癮nchored-heading-template”比; & lt; h2 v="===1”比; & lt; slot> & lt;/slot> & lt;/h2> & lt; h3 v-else-if="===2”在 & lt; slot> & lt;/slot> & lt;/h3> & lt; h4 v-else-if="===3”比; & lt; slot> & lt;/slot> & lt;/h4> & lt; h5 v-else-if="===4”比; & lt; slot> & lt;/slot> & lt;/h5> & lt;仅有v-else-if="===5”比; & lt; slot> & lt;/slot> & lt;/h6> & lt; h7 v-else-if="===6”比; & lt; slot> & lt;/slot> & lt;/h7> & lt;/script>
JS代码如下
Vue.component (anchored-heading, { 模板:“# anchored-heading-template”, 道具:{ 水平:{ 类型:数字, 要求:真正的 } } })
在这种场景中使用模板并不是最好的选择:首先代码冗长,为了在不同级别的标题中插入锚点元素,需要重复地使用& lt; slot> & lt;/slot>
虽然模板在大多数组件中都非常好用,但是在这里它就不是很简洁的了。那么,来尝试使用渲染函数重写上面的例子:
& lt; div id=袄印北? & lt; anchored-heading:水平=" 2 "祝辞& lt;一个name=" Hello world " href=" https://www.yisu.com/zixun/" Hello world rel=巴獠縩ofollow”rel=巴獠縩ofollow”在Hello world ! & lt;/a> & lt;/anchored-heading> & lt;/div> & lt;脚本src=" https://www.yisu.com/zixun/vue.js "祝辞& lt;/script> & lt; script> Vue.component (anchored-heading, { 呈现:函数(createElement) { 返回createElement ( “h”+。水平,//标记名称标签名称 slots.default美元。//子组件中的阵列 ) }, 道具:{ 水平:{ 类型:数字, 要求:真正的 } } }) 新Vue ({ 埃尔:“#例子” }) & lt;/script>
这样的代码精简很多,但是需要非常熟悉Vue的实例属性。在这个例子中,需要知道当不使用槽属性向组件中传递内容时,比如anchored-heading中的Hello world !,这些子元素被存储在组件实例中美元的slots.default中
在深入渲染函数之前,了解一些浏览器的工作原理是很重要的。以下面这段HTML为例:
& lt; div> & lt; h2>我title 一些文本内容 & lt; !——TODO:添加口号——比; & lt;/div>
当浏览器读到这些代码时,它会建立一个DOM节”点“树来保持追踪,如同会画一张家谱树来追踪家庭成员的发展一样. html的DOM节点树如下图所示:
每个元素都是一个节点。每段文字也是一个节点。甚至注释也都是节点。一个节点就是页面的一个部分。就像家谱树一样,每个节点都可以有子节点(也就是说每个部分可以包含其它的一些部分)
高效的更新所有这些节点会是比较困难的,不过所幸不必再手动完成这个工作了。只需要告诉Vue希望页面上的HTML是什么,这可以是在一个模板里:
& lt; h2> {{blogTitle}} & lt;/h2>
或者一个渲染函数里:
呈现:函数(createElement) { 返回createElement (h2, this.blogTitle) }
在这两种情况下,Vue都会自动保持页面的更新,即便blogTitle发生了改变。
【虚拟DOM】
Vue通过建立一个虚拟DOM对真实DOM发生的变化保持追踪