欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Vue的響應式原則與雙向數據綁定

 更新時間:2022年08月22日 09:45:23   作者:web前端開發(fā)  
使用 Vue.js 久了,還是不明白響應式原理和雙向數據綁定的區(qū)別?今天,我們就一起來學習一下,將解釋它們的區(qū)別,快跟隨小編一起學習學習吧

反應性原則

它是 Vue.js 的核心特性之一,一個數據驅動的視圖,我們修改數據視圖來響應更新,非常優(yōu)雅。

Vue2.x 使用 Object.defineProperty() 實現,而 Vue3.x 使用 Proxy 實現。 我們先來看看2.x的實現。

Object.defineProperty(obj, key, {
   enumerable: true,
   configurable: true,
   get: function getter () {
       return obj[key];
   },
   set: function setter (newVal) {
       ...
    }  
})

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

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

3.x的核心思想和2.x一樣,只是在數據劫持上使用了Proxy而不是Object.defineProperty,但是在處理數組和響應式處理新屬性時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響應式原理的實現細節(jié)相信大部分人已經很熟悉了,這里不再贅述。

雙向數據綁定

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

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

上面的組件等價于下面的代碼。

<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>

因此,當我們修改輸入框的值時,我們通過v-model綁定的值也會同步修改。 基于以上原理,我們可以輕松實現一個雙向數據綁定組件。

v-model實踐

首先,我們定義一個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 更新時觸發(fā) input 事件。 在創(chuàng)建的 hook 和 watch 中對 localvalue 的賦值是將父組件的狀態(tài)同步到子組件。

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

<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>

以下是實際效果。

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

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>

相當于:

<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)同步操作。

到此這篇關于一文詳解Vue的響應式原則與雙向數據綁定的文章就介紹到這了,更多相關Vue雙向數據綁定內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決vue2中使用elementUi打包報錯的問題

    解決vue2中使用elementUi打包報錯的問題

    這篇文章主要介紹了解決vue2中使用elementUi打包報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue跳轉頁面打開新窗口,并攜帶與接收參數方式

    vue跳轉頁面打開新窗口,并攜帶與接收參數方式

    這篇文章主要介紹了vue跳轉頁面打開新窗口,并攜帶與接收參數方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Mint UI實現A-Z字母排序的城市選擇列表

    Mint UI實現A-Z字母排序的城市選擇列表

    這篇文章主要為大家詳細介紹了Mint UI實現A-Z字母排序的城市選擇列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • vue中uni-app 實現小程序登錄注冊功能

    vue中uni-app 實現小程序登錄注冊功能

    這篇文章主要介紹了uni-app 實現小程序登錄注冊功能,文中給大家介紹了實現思路,以及vuex和本地緩存的區(qū)別,需要的朋友可以參考下
    2019-10-10
  • jdk1.8+vue elementui實現多級菜單功能

    jdk1.8+vue elementui實現多級菜單功能

    這篇文章主要介紹了jdk1.8+vue elementui實現多級菜單功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • vue3中vite使用sass的配置方法

    vue3中vite使用sass的配置方法

    這篇文章主要介紹了vue3中vite使用sass的配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • vue如何監(jiān)聽頁面的滾動的開始和結束

    vue如何監(jiān)聽頁面的滾動的開始和結束

    這篇文章主要介紹了vue如何監(jiān)聽頁面的滾動的開始和結束,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue實現移動端input上傳視頻、音頻

    vue實現移動端input上傳視頻、音頻

    這篇文章主要為大家詳細介紹了vue實現移動端input上傳視頻、音頻,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • vue原生input輸入框原理剖析

    vue原生input輸入框原理剖析

    這篇文章主要為大家介紹了vue原生input輸入框原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue-photo-preview圖片預覽失效的問題及解決

    vue-photo-preview圖片預覽失效的問題及解決

    這篇文章主要介紹了vue-photo-preview圖片預覽失效的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論