vue实例属性
vm.$slot 用来访问插槽分发的内容,每个具名插槽有其相应的属性,
v-slot中的内容可以使用vm.$slot.foo中被找到,其中在vm.$slot身上还有一个默认的defaul属性,
default属性中包括了所有没有被包含在具名插槽中的节点(也就是匿名插槽),
或者是v-slot:default的内容
节点、树、以及虚拟DOM
对于浏览器而言,当浏览器读到一段代码之后,会建立一个DOM节点树,就像是一个家谱树一样,
可以来追踪家庭成员,在这个DOM树中,每一个元素都是一个节点,不管是元素还是文本节点,
甚至对于浏览器的解析而言,
就连注释也是节点,节点组成页面,所以在浏览器解析的时候,不断的更新这些DOM节点会非常消耗性能。
为了解决大量的性能消耗,以及页面的重流和重绘,vue中出现了虚拟DOM,主要是通过diff算法
(广度优先遍历的方式),对比每次更新节点,找到更新的节点,对其进行单独更新。
return createElement('h1', this.blogTitle)
createElement返回的不是一个实际DOM元素,他更准确的名字可能是createNodeDescript,
实际上就是一个节点描述信息,他告诉浏览器该渲染什么样的节点,以什么样的标签渲染这个数据,
在这个描述信息中还包括子节点的信息,我们把这样的节点称之为虚拟节点,简写为VNode,
对于虚拟DOM而言,其实就是多个虚拟节点的组合
createElement
createElement相当于是创建一个节点信息,是一个方法,
通过传递createElement('div','张三'),这样的语句就是相当于是创建一个内容是张三的div标签
render函数
使用render函数我们可以直接在函数内使用JavaScript进行编程,这种编程方式对我们JavaScript
的编程能力要求更高,但是对于模板(template)而言,其实他比模板更接近编译器
render: function (createElement) {
return createElement('div',
Array.apply(null, { length: 20 }).map(function () {
return createElement('p', 'hi')
})
)
}
注意这里的Array.apply是生成一个长度为20的空数组,并且使用map方法对每一项进行操作