1. computed与watch
computed
和watch
之间的区别与联系:
-
computed
能完成的功能,watch
<font color=red>都可以完成</font>,且通常computed
的写法会更简便。例如:姓名案例,
computed
、watch
都能完成,但computed
写起来,更简单。 -
watch
能完成的功能,computed
<font color=red>不一定能完成</font>。例如:还做姓名案例,但要求:名改完
1
秒钟后,全名再变。
1.1 computed
- 侧重在【算】,核心是:计算出来的值。
- 靠
return
来输出计算的结果。 - 不能异步计算。
1.2 watch
- 侧重在【监视】,核心是:
xxx
变了,我要做???
事。 - 无需
return
,靠内部逻辑去完成要做的事。 - 能开启异步任务。
2. 条件渲染
2.1 v-show
- 语法:
v-show="表达式"
。 - 适用于:切换频率较高的场景。
- 特点:不展示的
DOM
元素依然在,仅仅是使用样式隐藏掉了,不破坏DOM
结构。
2.2 v-if
-
语法:
v-if="表达式" v-else-if="表达式" v-else
适用于:切换频率较低的场景。
-
特点:不展示的
DOM
元素直接被移除。注意点:
-
v-if
可以和:v-else-if
、v-else
一起使用,但要求结构不能被“打断”。 - 如果使 用
v-if
,可能会出现无法获取元素的问题。
-
3. 列表渲染
3.1 v-for
指令
- 指令:
v-for
。 - 作用:用于遍历数据,生成多个结构。
- 语法:
v-for="(item,index) in xxx" :key="????"
。
通俗理解:想生成多个谁,就在谁身上加
v-for
,别忘了写key
。
key
的使用原则(同react
):有唯一值就用唯一值(身份证号、手机号、学号......),没有就用索引值。
3.2 详聊 v-for
-
遍历数组
<ul> <li v-for="(item,index) in arr" :key="index"> {{item}} </li> </ul>
-
遍历对象
<li v-for="(value,key,index) in car" :key="index"> {{value}} - {{key}} - {{index}} </li>
-
遍历字符串
<li v-for="(char,index) in str" :key="index"> {{char}} - {{index}} </li>
-
遍历指定次数
<li v-for="(number,index) in 10" :key="index"> {{number}} - {{index}} </li>
-
v-for
很健壮,遍历如下内容都不会报错<h1 v-for="(a,b) in null">尚硅谷</h1> <h1 v-for="(a,b) in undefined">尚硅谷</h1> <h1 v-for="(a,b) in '' ">尚硅谷</h1> <h1 v-for="(a,b) in true ">尚硅谷</h1>
3.3 人员案例
- 可以使用
watch
、computed
分别去实现一下,发现用computed
更简单。 - 用到了:字符串的
includes
方法,数组的filter
方法。
4. 数据劫持
4.1 何为数据劫持
- 概念:捕获对象属性变化的一种手段,前端的响应式框架通常都会对数据进行劫持,这样当数据发生变化时,可以自动更新相关的视图或执行其他逻辑。
4.2 Vue中的数据劫持
-
具体实现方式:
-
Vue
收集到数据后,会将所有层级的属性,全都改为getter
、setter
的形式,随后放在_data
中。 - 当
_data
中的数据放生变化时,对应的setter
会执行,在setter
中会:①修改数据、②更新界面。
-
-
图示:
4.3 总结_数据代理 _数据劫持
-
数据代理(简单,
vm
身上的那点事):- 目的:让程序员更加方便的读取、修改到
_data
中属性。 - 原理:
Object.defineProperty
。 - 体现:
vm
身上有_data
里的所有属性,且有每一个属性,都有自己的proxyGetter
、proxySetter
。
- 当修改
vm
上的属性时,该属性对应的proxySetter
就会调用,去修改_data
中对应的属性。 - 当读取
vm
上的属性时,该属性对应的proxyGetter
就会调用,去读取_data
中对应的属性。
- 目的:让程序员更加方便的读取、修改到
-
数据劫持(
_data
里的那点事):目的:为了实现响应式(什么是响应式?—— 数据变页面自动更新),有了数据劫持,就可以捕获到数据的改变,进而重新解析模板,更新界面。
原理:
Object.defineProperty
。体现:
_data
身上的每一个属性不直接给值,都变为:reactiveSetter
、reactiveGetter
形式。
- 当修改
_data
上的属性时,该属性对应的reactiveSetter
就会调用。且在reactiveSetter
中Vue会:维护数据、更新页面。 - 当读取
_data
上的属性时,该属性对应的reactiveGetter
就会调用,返回对应的值。
5. Vue中使用函数的原则
- 由
Vue
所管理的函数,务必写成普通函数,例如:data
、methods
中的函数、computed
中的函数、watch
中的函数。 - 不是
Vue
所管理的函数,最好写成箭头函数,例如:数组方法的回调函数、ajax
请求的回调函数、定时器的回调函数、Promise
的回调函数等等。
遵循上述两个原则的目的只有一个:让
this
的指向是vm
。
6. 其它指令
-
我们学过的指令:
-
v-bind
: 单向数据绑定, 可简写为:xxx
-
v-model
: 双向数据绑定 -
v-for
: 遍历数组/对象/字符串/指定次数 -
v-on
: 绑定事件监听, 可简写为@
-
v-if
: 条件渲染(动态控制节点是否存在) -
v-else-if
: 条件渲染(动态控制节点是否存在) -
v-else
: 条件渲染(动态控制节点是否存在) -
v-show
: 条件渲染 (动态控制节点是否展示)
-
v-text
作用:向其所在的节点中渲染文本内容。
与插值语法的区别:
v-text
会替换掉节点中的内容,{{xx}}
则不会。
v-html
作用:向指定节点中渲染包含
html
结构的文本。
与插值语法的区别:
v-html
会替换掉节点中所有的内容,{{xx}}
则不会。
v-html
可以识别html
结构。备注:
v-html
存在一些安全性问题,因为结构中很有可能包含恶意脚本。
v-once
v-once
所在节点在初次动态渲染后,就视为静态内容了。- 以后数据的改变不会引起
v-once
所在结构的更新,可以用于优化性能。
v-pre
跳过这个元素和它的子元素的编译过程,一般用在大量不使用
Vue
语法的结构中。
v-cloak
本质是一个特殊属性,
Vue
接管容器后,会删掉v-cloak
属性。使用
css
配合v-cloak
可以解决网速慢时,页面展示出{{xxx}}
的问题。
7. 收集表单数据
- 若:
<input type="text"/>
,则v-model
收集的是value
值,用户输入的就是value
值。 - 若:
<input type="radio"/>
,则v-model
收集的是value
值,且要给标签配置value
值。 - 若:
<input type="checkbox"/>
- 没配置
input
的value
属性,那么收集的就是checked
(勾选 或 未勾选,是布尔值) - 配置了
input
的value
属性:-
v-model
的初始值是非数组,那么收集的就是checked
(勾选 或 未勾选,是布尔值)。 -
v-model
的初始值是数组,那么收集的就是value
组成的数组。
-
- 没配置