边 踩 边 记
-
Vue.component
新建组件的名字若为驼峰命名法如showImg
,实际的标签名会自动编译为<show-Img>
而不是<showImg>
;全是小写的组件名则不会改编 -
v-model
用在除表单元素以外的地方没有作用,不能与v-bind:property=
搞混 -
Vue官方文档中的提醒:
不要在选项 property 或回调上使用箭头函数
,比如created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())
。因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止,经常导致
Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。
-
v-html
中不能使用Vue自定义组件.因为Vue 不是基于字符串的模板引擎
绝对不能让用户提供的内容提供v-html插值,这很容易引来xss攻击 -
模板表达式
{{message.split('')[1]=='I'? true : false}}
<input v-bind:id="'list-'+id">
都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。(访问自定义的全局变量只会是undefind
)
6. v-for
和v-if
当处于同一节点,v-for
的优先级比 v-if
更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。
7. 单向数据流
所有的 prop
都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
这里有两种常见的试图变更一个 prop
的情形:
这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data
property 并将这个 prop 用作其初始值:
props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}
这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性
:
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
注意在 JavaScript 中对象和数组是通过引用
传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。
双向绑定
- 原理
- 利用
Object.defineProprty(obj,propertyName,{getter,setter})
为DOM节点的属性数据创建访问器,进行数据劫持,当改变该值的时候就被监听到 - 利用
订阅者\发布者模式
建立数据–>[标签元素]的一对多关系,一旦数据被监听到发生变化(如输入框事件引起的改动),则通知所有绑定该数据的标签(组件)进行视图更新(改变文字节点值)
- 利用
- 步骤和MVVM结构
- 当新建一个vue对象
new Vue({})
的时候,会先将参数中的data绑定到该vue对象(vm)下,通过Object.defineProprty(this,propertyName,{getter,setter})
进行数据劫持 - 创建一个该vue组件的全局的发布者对象
Dep
,拥有订阅者列表和通知订阅者进行更新(调用所有列表中订阅者update
)的notify()
方法 - 在
setter
中调用Dep.notify()
发布更新需求,实现双向绑定 - 通过
document.createDocumentFragment()
将组件下的所有DOM节点抽取出来 - 对这些节点进行compile编译,主要任务是获取
v-model
属性节点的值(key),从viewmodel 即vm.data[key]
处获取数据,并初步绑定到该标签元素节点上 !!!
为每一个与data绑定的元素节点创建Watcher
订阅者对象,创建时将自己添加到全局发布者的订阅列表中,拥有重新根据数据赋值的update()
方法- 为一些元素节点增加事件监听器,在事件监听器中修改数据,就会触发访问器
setter
- 当新建一个vue对象
虚拟DOM
虚拟DOM即vue在编译模板成渲染函数时用于描述实际DOM树的简要数据结构,用于与旧虚拟DOM进行diff算法
的对比(patch
),实现只更新有实际变动的最优化视图更改渲染