一、如何提问
1. 组件渲染和更新过程
二、涉及到的知识点
1.前置知识—with语法
a.将代码块中作用域设置为特定对象(修改作用域会导致性能问题)
b.代码块中自由变量会当作当前对象的属性,如果查不到该属性,则会报错
2.vue template complier 将模板编译成render函数
(1)模板具有的功能
(2)编译成什么—js代码
html只是标签语言,只有js可以满足上述需求;
转换成了render函数:
a.里面是一个with代码块,作用域对象是this
b.返回createElement生成的vnode;_c函数接受三个参数,第一个为标签名,第二个为标签信息,第三个为子元素信息
a.插值
b.表达式
c.属性与动态属性
d.条件判断
e.循环
_l函数接受两个函数,要遍历的数组,执行的回调函数(返回createElement函数生成的vnode)
f.事件
在第二个参数的on属性中
_c('div',{on:{'click': clickHandler},[])
g.v-model
createElement函数中,input数据源为绑定的变量,监听了input事件,在触发事件时更新该变量
_c // createElement函数 类似于snabbdom中的h函数
_v // createTextVnode函数 创建文本节点函数
_s // toString函数
_l // renderlist函数 循环渲染函数
3.执行render函数生成vnode
三、模板编译总体流程
1.模板编译为render函数,执行render函数后返回vnode
2.基于vnode再执行patch和diff
tip:一般情况下,会在开发环境就编译好模板
在开发环境下编译好模板,转化为了render函数,在生产环境下直接执行。
四、vue中使用render函数
1.render函数中可以拿到createElement参数函数,返回生成的vnode。
2.createElement参数
第一个参数为标签名,第二个参数为标签信息(非必需参数),第三个为子元素
3.render函数使用情况
在一些复杂的情况下,不能使用template,可以考虑使用render函数
render:function(createElement){
return createElement('div',[
createElement('a',
{attrs:{
name:'link',
href:'#' + this.href
}},
['this is a tag']
)
])
}