成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不要再搞混Vue的響應(yīng)式原理和雙向數(shù)據(jù)綁定了

開發(fā) 新聞
面試到的80%的同學(xué)會(huì)把兩者搞混,通常我要是先問響應(yīng)式原理再問雙向數(shù)據(jù)綁定原理。

前言

之前公司招人,面試了一些的前端同學(xué),因?yàn)楣臼褂玫那岸思夹g(shù)是Vue,所以免不了問到其響應(yīng)式原理和Vue的雙向數(shù)據(jù)綁定。但是這邊面試到的80%的同學(xué)會(huì)把兩者搞混,通常我要是先問響應(yīng)式原理再問雙向數(shù)據(jù)綁定原理,來面試的同學(xué)大都會(huì)認(rèn)為是一回事,那么這里我們就說一下二者的區(qū)別。

響應(yīng)式原理

是Vue的核心特性之一,數(shù)據(jù)驅(qū)動(dòng)視圖,我們修改數(shù)據(jù)視圖隨之響應(yīng)更新,就很優(yōu)雅~

Vue2.x是借助Object.defineProperty()實(shí)現(xiàn)的,而Vue3.x是借助Proxy實(shí)現(xiàn)的,下面我們先來看一下2.x的實(shí)現(xiàn)。

Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
//攔截get,當(dāng)我們訪問data.key時(shí)會(huì)被這個(gè)方法攔截到
get: function getter () {
//我們在這里收集依賴
return obj[key];
},
//攔截set,當(dāng)我們?yōu)閐ata.key賦值時(shí)會(huì)被這個(gè)方法攔截到
set: function setter (newVal) {
//當(dāng)數(shù)據(jù)變更時(shí),通知依賴項(xiàng)變更UI
}
})
復(fù)制代碼

我們通過Object.defineProperty為對象obj添加屬性,可以設(shè)置對象屬性的getter和setter函數(shù)。之后我們每次通過點(diǎn)語法獲取屬性都會(huì)執(zhí)行這里的getter函數(shù),在這個(gè)函數(shù)中我們會(huì)把調(diào)用此屬性的依賴收集到一個(gè)集合中 ;而在我們給屬性賦值(修改屬性)時(shí),會(huì)觸發(fā)這里定義的setter函數(shù),在次函數(shù)中會(huì)去通知集合中的依賴更新,做到數(shù)據(jù)變更驅(qū)動(dòng)視圖變更。

3.x的與2.x的核心思想一致,只不過數(shù)據(jù)的劫持使用Proxy而不是Object.defineProperty,只不過Proxy相比Object.defineProperty在處理數(shù)組和新增屬性的響應(yīng)式處理上更加方便。

let nObj=new Proxy(obj,{
//攔截get,當(dāng)我們訪問nObj.key時(shí)會(huì)被這個(gè)方法攔截到
get: function (target, propKey, receiver) {
console.log(`getting ${propKey}!`);
return Reflect.get(target, propKey, receiver);
},
//攔截set,當(dāng)我們?yōu)閚Obj.key賦值時(shí)會(huì)被這個(gè)方法攔截到
set: function (target, propKey, value, receiver) {
console.log(`setting ${propKey}!`);
return Reflect.set(target, propKey, value, receiver);
}
})
復(fù)制代碼

Proxy的詳細(xì)使用方法參考ES6教程。

Vue的響應(yīng)式原理的實(shí)現(xiàn)細(xì)節(jié)相信大多數(shù)同學(xué)已經(jīng)很熟悉了,這里就不在展開細(xì)談了,如果還想更詳細(xì)的了解,或者想要做一個(gè)簡易的Vue實(shí)現(xiàn),可以參考這篇Vue原理,相信你會(huì)有不小收獲。

雙向數(shù)據(jù)綁定

雙向數(shù)據(jù)綁定通常是指我們使用的v-model指令的實(shí)現(xiàn),是Vue的一個(gè)特性,也可以說是一個(gè)input事件和value的語法糖。Vue通過v-model指令為組件添加上input事件處理和value屬性的賦值。

<template>
<input v-model='localValue'/>
</template>
復(fù)制代碼

上述的組件就相當(dāng)于如下代碼

<template>
<!-- 這里添加了input時(shí)間的監(jiān)聽和value的屬性綁定 -->
<input @input='onInput' :value='localValue' />
<span>{{localValue}}</span>
</template>
<script>
export default{
data(){
return {
localValue:'',
}
},
methods:{
onInput(v){
//在input事件的處理函數(shù)中更新value的綁定值
this.localValue=v.target.value;
console.log(this.localValue)
}
}
}
</script>
復(fù)制代碼

因此當(dāng)我們修改input輸入框中的值時(shí),我們通過v-model綁定的值也會(huì)同步修改,基于上述原理,我們可以很容易的實(shí)現(xiàn)一個(gè)數(shù)據(jù)雙向綁定的組件。

v-model實(shí)踐

首先我們定義一個(gè)Vue組件,相信大家已經(jīng)很熟悉了。

<tempalte>
<div class="count" @click="addCount">click me {{value}}</div>
</template>
<script>
export default{
props:{
//關(guān)鍵的第一步:設(shè)置一個(gè)value屬性
value:{
type:Number,
default:0
}
},
watch:{
//監(jiān)聽value變化,更新組件localvalue狀態(tài)
value(v){
this.localvalue=v;
}
},
methods:{
//關(guān)鍵的第二步:事件觸發(fā)localvalue變更,通過事件同步父組件狀態(tài)變更
addCount(){
this.localvalue++;
this.$emit('input',this.localvalue);
}
},
data(){
return{
//組件狀態(tài),遵守單項(xiàng)數(shù)據(jù)流原則,不直接修改props中的屬性
localvalue:0
}
},
created(){
//初始化獲取value值
this.localvalue=this.value;
}
}
</script>
復(fù)制代碼

上面的組件定了我們通過在props中添加value屬性,并且在值更新時(shí)觸發(fā)input事件。created鉤子和watch中為localvalue賦值是為了同步父組件狀態(tài)到子組件中。通過上面??的組件定義,我們就可以在組件上使用v-model指令做雙向數(shù)據(jù)綁定了。

<template>
<add-one v-model="count"></add-one>
<span>父組件{{count}}</span>
</tempalte>
<script>
export default{
data() {
return {
count: 0,
};
},
methods: {
},
created(){
}
}
</script>
復(fù)制代碼

下面是實(shí)際效果 當(dāng)然我們也可以不使用value和input事件這樣的組合,為了更使得組件的定義更加符合語義,我們也可以自定義要實(shí)現(xiàn)雙向綁定的屬性和事件。我們在組件的model選項(xiàng)中設(shè)置value和event即可。如下:

export default{
//這里做了一個(gè)value和event的映射
model:{
value:'count',
event:'change'
},
props:{
//關(guān)鍵的第一步:設(shè)置一個(gè)value屬性
count:{
type:Number,
default:0
}
},
methods:{
//關(guān)鍵的第二步:事件觸發(fā)localvalue變更,通過事件同步父組件狀態(tài)變更
addCount(){
this.localvalue++;
this.$emit('change',this.localvalue);
}
},
}
復(fù)制代碼

通過上面的組件定義

<add-one v-model="count"></add-one>
復(fù)制代碼
就相當(dāng)于
<template>
<add-one @change='onChange' :count='count'></add-one>
<span>{{count}}</span>
</template>
<script>
export default{
data(){
return {
count:0,
}
},
methods:{
onChange(v){
this.count=v;
console.log(this.count)
}
}
}
</script>
復(fù)制代碼

只不過v-model指令幫我們做上面的事件添加,屬性綁定和狀態(tài)同步操作罷了。這里埋下一個(gè)小伏筆,不知道同學(xué)們熟不熟悉*Vue的自定義指令*,不熟悉的同學(xué)可以在評論區(qū)留言,下篇提前把使用自定義指令的各種技巧為各位同學(xué)奉上,附帶v-model的具體實(shí)現(xiàn)。

加更:自定義指令的各種技巧和v-model的實(shí)現(xiàn)已完成,感興趣的同學(xué)可以看一下理論+實(shí)踐,徹底掌握Vue自定義指令

結(jié)語

以上就是本人關(guān)于Vue響應(yīng)式原理和雙向數(shù)據(jù)綁定原理的理解

責(zé)任編輯:張燕妮 來源: 前端進(jìn)階之旅
相關(guān)推薦

2022-08-22 09:01:24

Vue響應(yīng)式原則雙向數(shù)據(jù)綁定

2021-04-02 11:24:22

Vue2.x雙向綁定前端

2017-08-30 17:10:43

前端JavascriptVue.js

2020-06-09 11:35:30

Vue 3響應(yīng)式前端

2019-07-01 13:34:22

vue系統(tǒng)數(shù)據(jù)

2021-01-22 11:47:27

Vue.js響應(yīng)式代碼

2021-09-13 09:20:20

前端框架VUE

2024-03-08 10:38:07

Vue響應(yīng)式數(shù)據(jù)

2023-06-01 08:27:30

SolidJS響應(yīng)式函數(shù)

2021-02-19 23:07:02

Vue綁定組件

2023-06-02 16:28:01

2024-04-10 08:45:51

Vue 3Proxy對象監(jiān)測數(shù)據(jù)

2021-09-27 06:29:47

Vue3 響應(yīng)式原理Vue應(yīng)用

2019-11-18 10:05:43

程序員技能開發(fā)者

2019-11-18 10:16:37

工程師開發(fā)網(wǎng)絡(luò)

2024-09-02 16:10:19

vue2前端

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測數(shù)據(jù)變化

2016-12-27 15:23:56

vue.js雙向綁定操作

2017-10-27 22:03:35

javascrip

2013-08-19 11:03:21

微軟谷歌
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 青青草网 | 男人的天堂久久 | 中文精品视频 | 青青久草 | 国产区一区 | 91就要激情 | 久热电影 | 国产黄色av电影 | 免费精品视频 | 欧美精品电影一区 | 欧洲亚洲一区 | 国产在线中文 | 成人高清视频在线观看 | 亚洲日产精品 | 亚洲成人免费 | 亚洲精品电影网在线观看 | 日韩成人在线视频 | 91av视频在线免费观看 | 成人亚洲网 | 综合久久av | 久久精品国产免费 | 一区二区三区视频在线免费观看 | 欧美一级大片 | 国产一区二区三区四区hd | 国产精品久久久久久久久久 | 欧美精品一区二区三区四区五区 | 国产欧美一级 | 色偷偷人人澡人人爽人人模 | 国产精品99久久久久久人 | 色综合桃花网 | 成人免费看片 | 久久久久久久久久一区二区 | 成人精品视频在线观看 | 久久99精品久久久久久国产越南 | 99精品欧美一区二区三区综合在线 | 日韩中出 | 国产伦一区二区三区四区 | 久久激情网 | 午夜激情视频在线 | 视频一区二区在线观看 | 91久久久久久久久久久 |