數(shù)據(jù)響應(yīng)式:就是在數(shù)據(jù)變化時(shí)可以被檢測(cè)并對(duì)這種變化做出響應(yīng)的機(jī)制
vue中關(guān)于響應(yīng)式,主要需要了解MVVM模型
M:模型(Model):對(duì)應(yīng)data中的數(shù)據(jù)
V:視圖(view):模板
VM:視圖模型(ViewModel):Vue實(shí)例對(duì)象
在這個(gè)機(jī)制中要解決的一個(gè)核心問(wèn)題是連接數(shù)據(jù)層和視圖層,通過(guò)數(shù)據(jù)驅(qū)動(dòng)視圖,數(shù)據(jù)變化,視圖更新,要做到這點(diǎn)的就需要對(duì)數(shù)據(jù)做響應(yīng)式處理,這樣一旦數(shù)據(jù)發(fā)生變化就可以立即做出更新處理。
以vue為例說(shuō)明,通過(guò)數(shù)據(jù)響應(yīng)式加上虛擬DOM和patch算法,可以使我們只需要操作數(shù)據(jù),完全不用接觸繁瑣的dom操作,從而大大提升開(kāi)發(fā)效率,降低開(kāi)發(fā)難度。
響應(yīng)式的優(yōu)缺點(diǎn):
vue2中的數(shù)據(jù)響應(yīng)式會(huì)根據(jù)數(shù)據(jù)類型來(lái)做不同處理,如果是對(duì)象則采用Object.defineProperty()的方式定義數(shù)據(jù)攔截,當(dāng)數(shù)據(jù)被訪問(wèn)或發(fā)生變化時(shí),我們感知并作出響應(yīng);如果是數(shù)組則通過(guò)覆蓋該數(shù)組原型的方法,擴(kuò)展它的7個(gè)變異方法,使這些方法可以額外的做更新通知,從而作出響應(yīng)。這種機(jī)制很好的解決了數(shù)據(jù)響應(yīng)化的問(wèn)題,但在實(shí)際使用中也存在一些缺點(diǎn):比如初始化時(shí)的遞歸遍歷會(huì)造成性能損失;新增或刪除屬性時(shí)需要用戶使用Vue.set/delete這樣特殊的api才能生效;對(duì)于es6中新產(chǎn)生的Map、Set這些數(shù)據(jù)結(jié)構(gòu)不支持等問(wèn)題。
關(guān)于Object.defineProperty()方法:
Object.defineProperty()傳三個(gè)參數(shù)
Object.defineProperty(a,b,c)
a:要添加屬性的對(duì)象
b:要添加的屬性名
c:配置項(xiàng)
configurable:是否可刪除
(1)當(dāng)我們直接在一個(gè)對(duì)象上定義某個(gè)屬性時(shí),它的默認(rèn)值是true
(2)而當(dāng)我們通過(guò)屬性描述符進(jìn)行定義屬性時(shí),它的默認(rèn)值是false
enumerable:是否可枚舉,就是是否可遍歷
(1)當(dāng)我們直接在一個(gè)對(duì)象上定義某個(gè)屬性時(shí),他的默認(rèn)值是true
(2)而當(dāng)我們通過(guò)屬性描述符進(jìn)行定義屬性時(shí),他的默認(rèn)值是false
writable:是否可修改,他的默認(rèn)值是false
value:屬性值
get函數(shù)
獲取屬性時(shí)執(zhí)行的函數(shù),默認(rèn)為undefined
set函數(shù)
設(shè)置或者修改屬性值時(shí)執(zhí)行的函數(shù),默認(rèn)為undefined
數(shù)組變異方法:
在數(shù)組原型方法上進(jìn)行了部分更改,使其在保存原效果的同時(shí)新增的部分效果,用法保持不變
push():往數(shù)組最后面添加一個(gè)元素,成功返回當(dāng)前數(shù)組的長(zhǎng)度
pop():刪除數(shù)組的最后一個(gè)元素,成功返回刪除元素的值
shift():刪除數(shù)組的第一個(gè)元素,成功返回刪除元素的值
unshift():往數(shù)組最前面添加一個(gè)元素,成功返回當(dāng)前數(shù)組的長(zhǎng)度
splice():有三個(gè)參數(shù),第一個(gè)是想要?jiǎng)h除的元素的下標(biāo)(必選),第二個(gè)是想要?jiǎng)h除的個(gè)數(shù)(必選),第三個(gè)是刪除 后想要在原位置替換的值
sort():sort() 使數(shù)組按照字符編碼默認(rèn)從小到大排序,成功返回排序后的數(shù)組
reverse():reverse() 將數(shù)組倒序,成功返回倒序后的數(shù)組