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

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

開發(fā) 前端
使用 Vue.js 久了,還是不明白響應(yīng)式原理和雙向數(shù)據(jù)綁定的區(qū)別?今天,我們就一起來學(xué)習(xí)一下,將解釋它們的區(qū)別。

反應(yīng)性原則

它是 Vue.js 的核心特性之一,一個(gè)數(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: function getter () {
return obj[key];
},
set: function setter (newVal) {
...
}
})

我們通過Object.defineProperty給對象obj添加屬性,可以設(shè)置對象屬性的getter和setter函數(shù)。  

之后,我們每通過點(diǎn)語法獲取一個(gè)屬性,就會(huì)執(zhí)行這里的getter函數(shù)。 在這個(gè)函數(shù)中,我們會(huì)將調(diào)用這個(gè)屬性的依賴收集到一個(gè)集合中; 當(dāng)我們給屬性賦值時(shí),這個(gè)定義就會(huì)被觸發(fā)。 setter函數(shù),在輔助函數(shù)中,會(huì)通知集合中的依賴更新,讓數(shù)據(jù)變化驅(qū)動(dòng)視圖變化。

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

let nObj=new Proxy(obj,{
get: function (target, propKey, receiver) {
console.log(`getting ${propKey}!`);
return Reflect.get(target, propKey, receiver);
},
set: function (target, propKey, value, receiver) {
console.log(`setting ${propKey}!`);
return Reflect.set(target, propKey, value, receiver);
}
})

Vue響應(yīng)式原理的實(shí)現(xiàn)細(xì)節(jié)相信大部分人已經(jīng)很熟悉了,這里不再贅述。

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

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

<template>
<input v-model='localValue'/>
</template>

上面的組件等價(jià)于下面的代碼。

<template>
<input @input='onInput' :value='localValue' />
<span>{{localValue}}</span>
</template>
<script>
export default{
data(){
return {
localValue:'',
}
},
methods:{
onInput(v){
this.localValue=v.target.value;
console.log(this.localValue)
}
}
}
</script>

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

v-model實(shí)踐

首先,我們定義一個(gè)Vue組件:

<tempalte>
<div class="count" @click="addCount">click me {{value}}</div>
</template>
<script>
export default{
props:{
value:{
type:Number,
default:0
}
},
watch:{
value(v){
this.localvalue=v;
}
},
methods:{
addCount(){
this.localvalue++;
this.$emit('input',this.localvalue);
}
},
data(){
return{
localvalue:0
}
},
created(){
this.localvalue=this.value;
}
}
</script>

上面的組件指定我們在 props 中添加 value 屬性,并在 value 更新時(shí)觸發(fā) input 事件。 在創(chuàng)建的 hook 和 watch 中對 localvalue 的賦值是將父組件的狀態(tài)同步到子組件。

通過上面的組件定義,我們可以使用 v-model 指令對組件進(jìn)行雙向數(shù)據(jù)綁定。

<template>
<add-one v-model="count"></add-one>
<span>The parent component{{count}}</span>
</tempalte>
<script>
export default{
data() {
return {
count: 0,
};
},
methods: {
},
created(){
}
}
</script>

以下是實(shí)際效果。

當(dāng)然,我們也可以不使用 value 和 input 事件的組合。 為了讓組件的定義更加語義化,我們還可以自定義屬性和事件,實(shí)現(xiàn)雙向綁定。 我們可以在組件的模型選項(xiàng)中設(shè)置值和事件。 如下:

export default{
model:{
value:'count',
event:'change'
},
props:{
count:{
type:Number,
default:0
}
},
methods:{
addCount(){
this.localvalue++;
this.$emit('change',this.localvalue);
}
},
}

由上述組件定義。

<add-one v-model="count"></add-one>

相當(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>

只是v-model指令幫我們做了上面的事件添加、屬性綁定和狀態(tài)同步操作。

最后

以上就是今天全部內(nèi)容,謝謝你的閱讀。如果你覺得有用,請記得點(diǎn)贊我,關(guān)注我,感謝感謝。

責(zé)任編輯:龐桂玉 來源: web前端開發(fā)
相關(guān)推薦

2022-09-02 10:34:23

數(shù)據(jù)Vue

2021-09-13 09:20:20

前端框架VUE

2021-02-19 23:07:02

Vue綁定組件

2021-04-02 11:24:22

Vue2.x雙向綁定前端

2024-04-10 08:45:51

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

2016-12-27 15:23:56

vue.js雙向綁定操作

2017-08-30 17:10:43

前端JavascriptVue.js

2017-10-27 22:03:35

javascrip

2014-11-21 10:17:32

響應(yīng)式WEB

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)式代碼

2019-10-30 14:31:47

Vue 3.0數(shù)組響應(yīng)

2022-04-17 09:18:11

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

2023-11-27 07:47:14

2021-05-19 14:25:19

前端開發(fā)技術(shù)

2021-07-14 13:12:51

2013-03-01 10:42:21

響應(yīng)式Web

2024-03-08 10:38:07

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

2022-04-16 13:59:34

Vue.jsJavascript
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 色综合av| 在线观看中文视频 | 国产精品精品久久久 | a级在线免费视频 | 亚洲男人天堂 | 亚洲精品在线看 | 日本成人福利 | 国产午夜精品久久久 | 日韩视频在线播放 | 国产亚洲成av人片在线观看桃 | 一区二区三区视频在线免费观看 | 国产精品国产亚洲精品看不卡15 | 欧美中文字幕 | 91精品久久久久久久久 | 一区二区三区亚洲 | 久久久久久综合 | 欧美一级在线观看 | 国产成人精品高清久久 | 精品国产一区二区三区久久狼黑人 | 精品国产欧美一区二区 | 日韩一区二区免费视频 | 免费一区 | 三级成人片 | 国产激情网| 亚洲一区二区久久 | 免费观看国产视频在线 | 国产精品久久久久一区二区三区 | 午夜精品久久久久久久久久久久久 | 亚洲一区精品在线 | 一区二区三区四区不卡视频 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 亚洲韩国精品 | 久久久爽爽爽美女图片 | 中文一区二区视频 | 狠狠涩 | 国内精品免费久久久久软件老师 | 九九免费视频 | 精品无码久久久久久国产 | www.久草.com | 亚洲一视频 | 欧美久久综合 |