最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Vue3響應(yīng)式原理

 更新時(shí)間:2022年09月07日 10:39:21   作者:??奔跑吧雞翅????  
這篇文章主要介紹了一文詳解Vue3響應(yīng)式原理,文章通過與vue2.x?的響應(yīng)式做對(duì)比詳解展現(xiàn)出了Vue3響應(yīng)式原理詳情,感興趣的小伙伴可以參考一下

回顧 vue2.x 的響應(yīng)式

實(shí)現(xiàn)原理:

  • 對(duì)象類型:通過object.defineProperty()對(duì)屬性的讀取、修改進(jìn)行攔截(數(shù)據(jù)劫持)
  • 數(shù)組類型:通過重寫更新數(shù)組的一系列方法來實(shí)現(xiàn)攔截(對(duì)數(shù)組的變更方法進(jìn)行了包裹)
Object.defineProperty(data,'count ",{
	get(){},
	set(){}
})

存在問題:

  • 新增屬性、刪除屬性,界面不會(huì)更新
  • 直接通過下標(biāo)修改數(shù)組,界面不會(huì)自動(dòng)更新

但是 vue2 給了解決方法,我們看以下代碼:

<template>
  <div>
    <h2>我是vue2寫的效果</h2>
    <h4 v-show="person.name">姓名:{{person.name}}</h4>
    <h4>年齡:{{person.age}}</h4>
    <h4 v-show="person.sex">性別:{{person.sex}}</h4>
    <h4>愛好:{{person.hobby}}</h4>
    <button @click="addSex">添加sex屬性</button>
    <button @click="deleteName">刪除name屬性</button>
    <button @click="changeHobby">修改愛好</button>
  </div>
</template>

<script>
import Vue from 'vue'
export default {
  name: 'App',
  data(){
    return{
      person:{
        name:'張三',
        age:18,
        hobby:['學(xué)習(xí)','吃飯']
      }
    }
  },
  methods:{
    addSex(){
      //這樣直接加是不行的
      //this.person.sex = '男'
      this.$set(this.person,"sex",'男')
      //Vue.set(this.person,"sex",'男')
    },
    deleteName(){
      //這樣直接加是不行的
      //delete this.person.name
      //this.$delete(this.person,'name')
      Vue.delete(this.person,"name")
    },
    changeHobby(){
      //這樣直接加是不行的
      //this.person.hobby[0] = '逛街'
      //可以這樣
      this.$set(this.person.hobby,0,'逛街')
      //或
      //this.person.hobby.splice(0,1,"逛街")
    },
  }
}
</script>

我們可以用 js 模擬 vue2 的響應(yīng)式:

<script>
        //源數(shù)據(jù)
        let person = {
            name:"張三",
            age:18
        }
        let p = {}
        //模擬vue2實(shí)現(xiàn)響應(yīng)式
        Object.defineProperty(p,"name",{
        	configurable:true,
            get() {//有人讀取name時(shí)調(diào)用
                return person.name
            },
            set(v) {
                person.name = v
                console.log("有人修改了name屬性,我發(fā)現(xiàn)了,我要去更新界面");
            }
        })
        Object.defineProperty(p,"age",{
            get() {//有人讀取age時(shí)調(diào)用
                return person.age
            },
            set(v) {
                person.age = v
                console.log("有人修改了age屬性,我發(fā)現(xiàn)了,我要去更新界面");
            }
        })
</script>

先輸出 person,然后看下 p,當(dāng)修改 name 或 age 時(shí)會(huì)檢測(cè)到

它的問題是,如果增加一個(gè) sex 屬性,vue 不會(huì)檢測(cè)到,雖然增加了 sex 屬性,但它不像 name 和 age 有 getter 和 setter,不是響應(yīng)式的

同樣,當(dāng)刪除 name 屬性時(shí)也監(jiān)測(cè)不到

vue3的響應(yīng)式

<template>
  <h1>一個(gè)人的信息</h1>
  <h3 v-show="person.name">姓名:{{ person.name }}</h3>
  <h3>年齡:{{ person.age }}</h3>
  <h3 v-show="person.sex">性別:{{ person.sex }}</h3>
	......
  <button @click="changeInfo">修改人的信息</button>
  <button @click="addSex">添加一個(gè)sex屬性</button>
  <button @click="deleteName">刪除一個(gè)name屬性</button>
</template>

<script>
import {reactive} from 'vue'

export default {
  name: 'App',
  setup() {
	......

    function changeInfo() {
      ......
      person.hobby[0] = '學(xué)習(xí)'
    }
    
    function addSex() {
      person.sex = "男"
    }

    function deleteName() {
      delete person.name
    }

    return {
      ......
      addSex,
      deleteName
    }
  }
}
</script>

模擬 vue3 中的響應(yīng)式:

    <script>
        //源數(shù)據(jù)
        let person = {
            name:"張三",
            age:18
        }
        const p = new Proxy(person,{
            //有人讀取p的某個(gè)屬性時(shí)調(diào)用
            get(target, p, receiver) {
                console.log(`有人讀取了p身上的${p}屬性`);
                //return target[p]
                return Reflect.get(target,p)
            },
            //有人修改、增加p的某個(gè)屬性時(shí)調(diào)用
            set(target, p, value, receiver) {
                console.log(`有人修改了p身上的${p},我要去更新界面了`);
                //target[p] = value
                Reflect.set(target,p,value)
            },
            //有人刪除p的某個(gè)屬性時(shí)調(diào)用
            deleteProperty(target, p) {
                console.log(`有人刪除了p身上的${p},我要去更新界面了`);
                //return delete target[p]
                return Reflect.deleteProperty(target,p)
            }
        })
    </script>

實(shí)現(xiàn)原理:

  • 通過Proxy(代理)∶攔截對(duì)象中任意屬性的變化,包括:屬性值的讀寫、屬性的添加、屬性的刪除等
  • 通過Reflect(反射):對(duì)源對(duì)象的屬性進(jìn)行操作

MDN文檔中描述的 Proxy 與 Reflect

Reflect 是一個(gè)內(nèi)置的對(duì)象,它提供攔截 JavaScript 操作的方法。Reflect不是一個(gè)函數(shù)對(duì)象,因此它是不可構(gòu)造的。

new Proxy(data,{
	//攔截讀取屬性值
	get (target, prop){
		return Reflect.get(target,prop)
	},
	//攔截設(shè)置屬性值或添加新屬性
	set (target,prop, value) {
		return Reflect.set(target,prop, value)
	},
	//攔截刪除屬性
	deleteProperty (target,prop) {
		return Reflect.deleteProperty(target,prop)
	}
})
proxy.name = "tom"

到此這篇關(guān)于一文詳解Vue3響應(yīng)式原理的文章就介紹到這了,更多相關(guān)Vue3響應(yīng)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3.x使用swiper實(shí)現(xiàn)卡片輪播

    vue3.x使用swiper實(shí)現(xiàn)卡片輪播

    這篇文章主要為大家詳細(xì)介紹了vue3.x使用swiper實(shí)現(xiàn)卡片輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • VUE3中Element table表頭動(dòng)態(tài)展示合計(jì)信息

    VUE3中Element table表頭動(dòng)態(tài)展示合計(jì)信息

    本文主要介紹了在Vue中實(shí)現(xiàn)動(dòng)態(tài)合計(jì)兩個(gè)字段并輸出摘要信息的方法,通過使用監(jiān)聽器和深度監(jiān)聽,確保當(dāng)數(shù)據(jù)變化時(shí)能正確更新合計(jì)結(jié)果,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • vue實(shí)現(xiàn)圖片上傳功能

    vue實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù))

    vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù))

    這篇文章主要介紹了vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 詳解Vue3中shallowRef和shallowReactive的使用

    詳解Vue3中shallowRef和shallowReactive的使用

    這篇文章主要為大家介紹了Vue3中shallowRef和shallowReactive函數(shù)的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定的幫助,需要的可以參考一下
    2022-07-07
  • vue watch監(jiān)聽取不到this指向的數(shù)問題

    vue watch監(jiān)聽取不到this指向的數(shù)問題

    這篇文章主要介紹了vue watch監(jiān)聽取不到this指向的數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • vue寫一個(gè)全局彈窗組件通過js調(diào)用的方法

    vue寫一個(gè)全局彈窗組件通過js調(diào)用的方法

    彈窗效果是在Web開發(fā)中經(jīng)常用到的一種交互效果,它可以在用戶點(diǎn)擊某個(gè)按鈕或者觸發(fā)某個(gè)事件時(shí)顯示一個(gè)懸浮框,提供用戶與頁(yè)面進(jìn)行交互的機(jī)會(huì),這篇文章主要給大家介紹了關(guān)于vue寫一個(gè)全局彈窗組件通過js調(diào)用的方法,需要的朋友可以參考下
    2024-06-06
  • Vue-CLI多頁(yè)分目錄打包的步驟記錄

    Vue-CLI多頁(yè)分目錄打包的步驟記錄

    這篇文章主要給大家介紹了關(guān)于Vue-CLI多頁(yè)分目錄打包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • elementUI樣式修改未生效問題詳解(掛載到了body標(biāo)簽上)

    elementUI樣式修改未生效問題詳解(掛載到了body標(biāo)簽上)

    vue+elementUI項(xiàng)目開發(fā)中,經(jīng)常遇到修改elementUI組件樣式無效的問題,這篇文章主要給大家介紹了關(guān)于elementUI樣式修改未生效問題的相關(guān)資料,掛載到了body標(biāo)簽上,需要的朋友可以參考下
    2023-04-04
  • 在Vue項(xiàng)目中取消ESLint代碼檢測(cè)的步驟講解

    在Vue項(xiàng)目中取消ESLint代碼檢測(cè)的步驟講解

    今天小編就為大家分享一篇關(guān)于在Vue項(xiàng)目中取消ESLint代碼檢測(cè)的步驟講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評(píng)論

杭锦后旗| 喜德县| 浪卡子县| 定州市| 绩溪县| 邹平县| 新竹市| 砚山县| 福贡县| 饶平县| 南涧| 淮滨县| 建阳市| 昌江| 岱山县| 侯马市| 江源县| 讷河市| 潍坊市| 简阳市| 延安市| 元阳县| 苏州市| 交口县| 仁怀市| 偃师市| 富蕴县| 沙雅县| 阳曲县| 中卫市| 阜阳市| 平谷区| 平定县| 聊城市| 博乐市| 衡阳市| 旌德县| 延川县| 教育| 内乡县| 洛阳市|