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

淺析Vue為什么需要同時(shí)使用Ref和Reactive

 更新時(shí)間:2023年08月09日 08:44:30   作者:王大冶  
這篇文章主要想來(lái)和大家一起探討一下Vue為什么需要同時(shí)使用Ref和Reactive,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下

在使用 Options API 工作時(shí)聲明響應(yīng)性數(shù)據(jù)是直截了當(dāng)?shù)摹?code>data 選項(xiàng)內(nèi)的所有內(nèi)容都會(huì)自動(dòng)變?yōu)轫憫?yīng)性,并在模板中可用。唯一需要注意的是,要將data設(shè)為一個(gè)函數(shù),以防止在所有組件實(shí)例之間共享狀態(tài)。

讓我們討論一下Vue 3中發(fā)生了什么變化,以及為什么我們需要兩個(gè)不同的助手。

Vue 2中的響應(yīng)性

data 組件選項(xiàng)內(nèi)的每個(gè)屬性都將通過(guò) Object.defineProperty 轉(zhuǎn)換為getter/setter。這些getter/setter對(duì)我們來(lái)說(shuō)是看不見的,但在底層,它們使Vue在訪問(wèn)或修改屬性時(shí)能夠執(zhí)行依賴跟蹤。

每個(gè)組件都有一個(gè)關(guān)聯(lián)的觀察者,用于跟蹤在組件的渲染周期中使用的屬性。如果依賴項(xiàng)更新,觀察者會(huì)通知組件,然后觸發(fā)重新渲染。

Vue 3中的響應(yīng)性

在 Vue 3 中,一切都發(fā)生了變化。核心部分從零開始重寫,現(xiàn)在由Javascript Proxies提供響應(yīng)性。Proxies是一種現(xiàn)代且優(yōu)雅的方式來(lái)觀察一個(gè)對(duì)象并在其屬性被訪問(wèn)或更新時(shí)得到通知。

可以通過(guò)以下簡(jiǎn)單的例子來(lái)理解代理是如何工作的:

const userInfo = {
  firstName: "fotis",
  age: 35,
};
const handler = {
  get(target, property) {
    if (property === "firstName") {
      const name = target[property]
      return name.charAt(0).toUpperCase() + name.slice(1);
    }
    if (property === "age") {
      return '--'
    }
    return target[property]
  },
};
const proxy = new Proxy(userInfo, handler);
console.log(proxy.firstName) // "Fotis"
console.log(proxy.age) // "--"

處理器內(nèi)部的get方法被稱為陷阱,每次訪問(wèn)對(duì)象的屬性時(shí)都會(huì)被調(diào)用。以類似的方式,可以定義一個(gè)設(shè)定的陷阱:

const userInfo = {
  firstName: "Fotis",
  age: 35,
};
const handler = {
  set(target, prop, value) {
    if (prop === "age") {
      if (!Number.isInteger(value)) {
        throw new TypeError("The age is not an integer");
      }
      if (value > 200) {
        throw new RangeError("The age seems invalid");
      }
    }
    target[prop] = value;
    return true;
  },
};
const proxy = new Proxy(userInfo, handler);
proxy.age = 12 // OK
proxy.age = 300 // Error: The age seems invalid

這正是 Vue 3 響應(yīng)性背后的理念。當(dāng)使用 reactive 助手聲明一個(gè)變量時(shí),會(huì)使用一個(gè) proxy. 來(lái)跟蹤任何變化。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key)
      return target[key]
    },
    set(target, key, value) {
      target[key] = value
      trigger(target, key)
    }
  })
}

當(dāng)然,響應(yīng)式助手的實(shí)際實(shí)現(xiàn)更為復(fù)雜,能處理邊緣情況,但其核心仍然使用proxy。

以上的片段解釋了為什么將響應(yīng)性變量解構(gòu)或重新分配給本地變量后,它就不再具有反應(yīng)性,因?yàn)樗辉儆|發(fā)源對(duì)象上的 get/set proxy 陷阱。

這看起來(lái)像是一個(gè)完美的解決方案,可以使所有事物都變成響應(yīng)式。但是有個(gè)問(wèn)題!根據(jù)定義,proxy只適用于復(fù)雜類型。這些包括對(duì)象、數(shù)組、映射和集合。要使一個(gè)原始類型變得反應(yīng)靈敏,我們?nèi)匀恍枰褂么恚紫任覀儽仨殞⑵浒b在一個(gè)對(duì)象中。

function ref(value) {
  const refObject = {
    get value() {
      track(refObject, 'value')
      return value
    },
    set value(newValue) {
      value = newValue
      trigger(refObject, 'value')
    }
  }
  return refObject
}

這解釋了為什么必須在 script setup 中使用煩人的 .value 。而且,再次重構(gòu)或重新分配給本地變量也是行不通的。

總結(jié)

那么,為什么需要 Ref 和 Reactive的答案是:Proxy。對(duì)于復(fù)雜類型,它們可以直接使用,但對(duì)于原始類型,需要?jiǎng)?chuàng)建一個(gè)代理對(duì)象。

希望,理解Vue的內(nèi)部工作原理可以使你更有效,并且可以消除 refreactive 之間的任何混淆。

以上就是淺析Vue為什么需要同時(shí)使用Ref和Reactive的詳細(xì)內(nèi)容,更多關(guān)于Vue Ref Reactive的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue3+Vite+TS使用elementPlus時(shí)踩的坑及解決

    Vue3+Vite+TS使用elementPlus時(shí)踩的坑及解決

    這篇文章主要介紹了Vue3+Vite+TS使用elementPlus時(shí)踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 完美解決axios在ie下的兼容性問(wèn)題

    完美解決axios在ie下的兼容性問(wèn)題

    下面小編就為大家分享一篇完美解決axios在ie下的兼容性問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • vue 2.5.1 源碼學(xué)習(xí) 之Vue.extend 和 data的合并策略

    vue 2.5.1 源碼學(xué)習(xí) 之Vue.extend 和 data的合并策略

    這篇文章主要介紹了Vue.extend 和 data的合并策略 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • vue中v-for通過(guò)動(dòng)態(tài)綁定class實(shí)現(xiàn)觸發(fā)效果

    vue中v-for通過(guò)動(dòng)態(tài)綁定class實(shí)現(xiàn)觸發(fā)效果

    這篇文章主要介紹了vue中v-for通過(guò)動(dòng)態(tài)綁定class實(shí)現(xiàn)觸發(fā)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • Vue3中實(shí)現(xiàn)微信掃碼登錄的步驟和代碼示例

    Vue3中實(shí)現(xiàn)微信掃碼登錄的步驟和代碼示例

    在 Vue 3 中實(shí)現(xiàn)微信掃碼登錄,涉及到前端生成二維碼、監(jiān)聽微信回調(diào)以及與后端的交互,本文給大家介紹了一個(gè)詳細(xì)的實(shí)現(xiàn)步驟和代碼示例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • 詳解Vue注冊(cè)組件的方法

    詳解Vue注冊(cè)組件的方法

    Vue注冊(cè)組件有這幾種,分別是全局注冊(cè)、局部注冊(cè)、在模塊系統(tǒng)中注冊(cè),這篇文章主要介紹了Vue注冊(cè)組件的方法,需要的朋友可以參考下
    2022-08-08
  • 一文詳解Vue導(dǎo)航守衛(wèi)未生效問(wèn)題:為什么路由守衛(wèi)不執(zhí)行或邏輯失效?

    一文詳解Vue導(dǎo)航守衛(wèi)未生效問(wèn)題:為什么路由守衛(wèi)不執(zhí)行或邏輯失效?

    在 Vue 應(yīng)用中,導(dǎo)航守衛(wèi)實(shí)現(xiàn)權(quán)限控制、登錄驗(yàn)證、頁(yè)面加載前數(shù)據(jù)預(yù)取等關(guān)鍵功能的核心機(jī)制,然而,開發(fā)者常因守衛(wèi)注冊(cè)位置錯(cuò)誤、異步邏輯處理不當(dāng)或調(diào)用時(shí)機(jī)誤解,本文通過(guò)典型錯(cuò)誤示例、原理分析和規(guī)范實(shí)踐,幫助你正確使用全局、路由級(jí)和組件內(nèi)守衛(wèi),需要的朋友可以參考下
    2026-02-02
  • Vue+ElementUI?實(shí)現(xiàn)分頁(yè)功能-mysql數(shù)據(jù)

    Vue+ElementUI?實(shí)現(xiàn)分頁(yè)功能-mysql數(shù)據(jù)

    這篇文章主要介紹了Vue+ElementUI?實(shí)現(xiàn)分頁(yè)查詢-mysql數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)中數(shù)據(jù)比較多時(shí),就每次只查詢一部分來(lái)緩解服務(wù)器和頁(yè)面壓力。這里使用elementui的?Pagination?分頁(yè)?組件,配合mysql的limit語(yǔ)句,實(shí)現(xiàn)分頁(yè)查詢mysql數(shù)據(jù),下面來(lái)看看具體實(shí)現(xiàn)過(guò)程,希望對(duì)大家學(xué)習(xí)有所幫助
    2021-12-12
  • mpvue小程序仿qq左滑置頂刪除組件

    mpvue小程序仿qq左滑置頂刪除組件

    最近在做小程序開發(fā)的時(shí)候,遇到了點(diǎn)問(wèn)題。最終選擇用mpvue來(lái)做,誰(shuí)知這么多坑,下面小編把我遇到的問(wèn)題分享給大家,如果大家對(duì)mpvue小程序仿qq左滑置頂刪除組件相關(guān)知識(shí)感興趣的朋友一起看看吧
    2018-08-08
  • vue移動(dòng)UI框架滑動(dòng)加載數(shù)據(jù)的方法

    vue移動(dòng)UI框架滑動(dòng)加載數(shù)據(jù)的方法

    這篇文章主要介紹了vue移動(dòng)UI框架滑動(dòng)加載的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論

林西县| 芜湖市| 宜都市| 墨江| 监利县| 定日县| 巴彦淖尔市| 山阳县| 永清县| 崇明县| 桦南县| 武宣县| 合山市| 驻马店市| 姚安县| 云安县| 雷州市| 红河县| 子洲县| 东乌| 南宫市| 正宁县| 宝鸡市| 扎囊县| 昭平县| 邵武市| 明光市| 黔南| 刚察县| 来凤县| 瑞昌市| 高邑县| 洛浦县| 溆浦县| 焉耆| 天津市| 东源县| 庐江县| 宕昌县| 荔浦县| 乐东|