其中object是对象data属性下的一个对象类型的属性,value则是object对象下的属性值,name则是object对象下的属性名,index则是代表object对象下的属性顺序,从0开始;
当它们处于同一节点,v-for优先级比v-if高,这意味着v-if将分别重复运行于每个v-for循环中;
⑧组件与v-for
2.2.0+版本里,当在组件上使用v-for时,key必须存在;
为了把迭代数据传递到组件里,我们要使用prop;
9.Vue的特殊属性:key
key的取值类型:number | string | boolean (2.4.2 新增) | symbol (2.5.12 新增)
按照官方介绍,在虚拟DOM算法,新旧nodes对比时辨识VNodes;如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用key时,它会基于key的变化重新排列元素顺序,并且会移除key不存在的元素;
通俗来讲,为了提高效率,Vue是尽可能的复用/修改已经存在的、类型相同的元素,但这样会造成显示错乱,为了避免这种情况,属性key就可以打破这种局面;
10.v-on与事件处理
①v-on的取值
Function|Inline Statement|Object,可以用v-on指令监听DOM事件;
②event与$event
可以在Vue的methods中用event来访问原始的DOM事件,也可以通过$event把原始的DOM事件传入方法;
③事件修饰符
调用event.preventDefault()/event.stopPropagation()这类常见的功能时,这种写法既显得繁琐,同时,本来需要自定义的methods中添加了DOM事件细节,显得逻辑混乱;
为了解决这个问题出现了事件修饰符:.stop/.prevent/.capture/.self/.once/.passive
注意:使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生;
④按键修饰符
监听键盘按键,Vue允许为v-on在监听键盘事件时添加按键修饰符:.enter/.tab/.delete/.esc/.space/.up/.down/.left/.right
⑤系统修饰键
2.1.0 新增,可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器:
.ctrl/.alt/.shift/.meta/.exact/.left/.right/.middle
11.v-model与表单输入绑定
①绑定HTML标签
v-model只能用在、
②针对不同的标签,提供不同的逻辑
text和textarea使用value属性和input事件;
checkbox和radio使用checked属性和change事件;
select标签使用option标签的value作为属性和change作为事件;
③v-model与v-bind值绑定
对于radio单选按钮/checkbox复选框/select选择框,v-model 绑定的值通常是静态字符串(对于复选框也可以是布尔值);
例如:radio和checkbox绑定的是checked属性,因此v-model取值就是true/false,而select选择框绑定的是option的value属性,v-model取值就是option的value值;
但,我们还可以把v-model取值绑定到Vue实例的一个动态属性上,这种需求可以用v-bind实现,且这个Vue实例动态属性值可以不是字符串;
④v-model的修饰符
.lazy:默认v-model在每次input事件触发后将输入框的值与数据进行同步,而lazy修饰符转为在change事件之后进行同步;
.number:自动将用户的输入值转为数值类型;
.trim:自动过滤用户输入的首尾空白字符;
12.Vue的响应式原理
12.1.如何追踪变化
当一个object传入Vue实例来作为data选项,Vue遍历object的所有属性并通过Object.defineProperty把所有属性转化为getter/setter方式,这样就可以对各个属性进行跟踪;
Vue会为每个组件实例分配一个watcher实例,当data选项中属性setter方法被触发后,会通知watcher,watcher再去触发re-render函数,从而使它关联的组件重新渲染;

12.2.检测变化的注意事项
由于JS限制,Vue不能检测数组和对象的变化,为此,Vue作出如下变动:
对于对象而言,你必须把对象挂载到data项后,Vue对其属性转化成setter/getter方法之后,才能对其进行监控;
对于数组而言,主要是数组的2种操作没法监控,但我们可以变通,变通之后就可以进行监控了;
12.3.声明响应式property
Vue不允许动态添加根级响应式property,所以必须在初始化实例前声明所有根级响应式property,哪怕只是一个空值;
12.4.异步更新队列
Vue在更新DOM时是异步执行的。
只要侦听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个watcher被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。
为了在数据变化之后等待Vue完成更新 DOM,可以在数据变化之后立即使用Vue.nextTick(callback)。这样回调函数将在DOM更新完成后被调用;
13.组件
13.1.基础
组件是可复用的Vue实例,且带有一个名字;
我们可以在一个通过new Vue创建的Vue根实例中,把这个组件作为自定义元素来使用;
因为组件是可复用的Vue实例,所以它们与new Vue接收相同的选项,除了el属性之外,其他一切不变;
13.2.data选项
一个组件的data选项必须是一个函数,只有这样才能保证各个实例有自己独立的变量域;
13.3.组件的组织
通常一个应用会以一棵嵌套的组件树的形式来组织:

为了能在模板中使用,这些组件必须先注册以便Vue能够识别。这里有2种组件的注册类型:全局注册和局部注册;
全局注册的组件可以用在其被注册之后的任何(通过 new Vue)新创建的Vue根实例,也包括其组件树中的所有子组件的模板中;
13.4.通过Prop向子组件传递数据
Prop是你可以在组件上注册的一些自定义属性。当一个值传递给一个prop属性的时候,它就变成了那个组件实例的一个属性,就像访问data中的值一样;
13.5.单个根元素
①每个组件必须只有一个根元素;
②props的取值类型是:Array | Object,这里如果要继承的属性比较多时,可以采用object,不论何时为父类对象添加一个新的属性,它都会自动地在templdate中自由使用;
13.6.监听子组件事件
假如,我通过Vue.component方式注册一个全局组件child,然后我在一个app的Vue实例的el中进行使用,那么谁是父组件,谁是子组件呢?
按照官网的案例,这种情况下,app就是父组件,而child就是子组件,也就是说对于全局组件,使用方就是父组件,被使用方就是子组件;
按照网上给出的父子组件的生命周期过程:
加载渲染过程:父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程:父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程:父beforeUpdate->父updated
销毁过程:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
从上面的看出,无论是哪个过程,都是先操作父组件,然后再去操作子组件
13.6.1.使用事件抛出一个值
假如父组件app,有N个子组件child,那我可以通过某个子组件来修改父组件的属性,进而对所有子组件进行统一修改,其操作过程如下:
第一步:核心在于父级组件可以像处理本地DOM事件一样通过v-on来监听子组件实例的任意事件;
第二步:子组件通过调用内建的$emit方法并传入事件名称来触发一个事件;
第三步:父组件通过v-on来定义子组件$emit方法中指明的事件名称;
当需要通过$emit传递额外的参数时,该怎么处理呢?
$emit的第二个参数可以用来传递其他值,当在父级组件监听这个事件的时候,父组件可以通过$event访问到被抛出的这个值,或者如果父组件的这个事件处理函数是一个方法,则这个值将会作为第一个参数传入这个方法;
13.6.2.在组件上使用v-model
自定义事件也可以用于创建支持v-model的自定义输入组件(自定义事件、支持v-model的自定义组件、自定义输入组件)
要想达到这个目标,需要这个组件内的标签必须达到下面2个要求:
①将标签的value属性通过v-bind绑定到一个名叫 value的prop上;
②在标签的input事件被触发时,将新的值通过自定义的input事件抛出;
核心代码如下:
Vue.component('custom-input', { props: ['value'], template: ` v-bind:value="value" v-on:input="$emit('input', $event.target.value)" > }) |
13.7.动态组件
在不同组件之间进行动态切换时,可以通过Vue的 元素加一个“is”属性来实现:
其中currentTabComponent可以是:已注册组件的名字、一个组件的选项对象;
13.8.解析DOM模板时的注意事项
Vue针对el绑定的HTML代码有要求:
有些HTML元素,诸如
、、 和