日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

[Vue 3] 為什么需要同時(shí)使用 Ref 和 Reactive

來(lái)源: 責(zé)編: 時(shí)間:2023-08-09 23:02:05 340觀看
導(dǎo)讀AICube 開(kāi)放GPT-4給大家使用以及AI工具助手,可以簡(jiǎn)化大家生圖的的prompt。在使用 Options API 工作時(shí)聲明響應(yīng)性數(shù)據(jù)是直截了當(dāng)?shù)摹ata 選項(xiàng)內(nèi)的所有內(nèi)容都會(huì)自動(dòng)變?yōu)轫憫?yīng)性,并在模板中可用。唯一需要注意的是,要將data

OyS28資訊網(wǎng)——每日最新資訊28at.com

AICube 開(kāi)放GPT-4給大家使用以及AI工具助手,可以簡(jiǎn)化大家生圖的的prompt。OyS28資訊網(wǎng)——每日最新資訊28at.com

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

讓我們討論一下Vue 3中發(fā)生了什么變化,以及為什么我們需要兩個(gè)不同的助手。OyS28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

可以通過(guò)以下簡(jiǎn)單的例子來(lái)理解代理是如何工作的:OyS28資訊網(wǎng)——每日最新資訊28at.com

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è)定的陷阱:OyS28資訊網(wǎng)——每日最新資訊28at.com

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 // OKproxy.age = 300 // Error: The age seems invalid

這正是 Vue 3 響應(yīng)性背后的理念。當(dāng)使用 reactive 助手聲明一個(gè)變量時(shí),會(huì)使用一個(gè) proxy. 來(lái)跟蹤任何變化。OyS28資訊網(wǎng)——每日最新資訊28at.com

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。OyS28資訊網(wǎng)——每日最新資訊28at.com

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

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

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)或重新分配給本地變量也是行不通的。OyS28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

那么,為什么需要 Ref 和 Reactive 的答案是:Proxy。對(duì)于復(fù)雜類型,它們可以直接使用,但對(duì)于原始類型,需要?jiǎng)?chuàng)建一個(gè)代理對(duì)象。OyS28資訊網(wǎng)——每日最新資訊28at.com

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。OyS28資訊網(wǎng)——每日最新資訊28at.com

OyS28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-5099-0.html[Vue 3] 為什么需要同時(shí)使用 Ref 和 Reactive

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 微軟發(fā)布.NET 8 最終預(yù)覽版,正式版計(jì)劃 11 月 14 日發(fā)布

下一篇: 如何優(yōu)雅地處理RabbitMQ中的消息丟失

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 丹江口市| 九龙城区| 无为县| 宁陕县| 乐东| 望谟县| 萨迦县| 广州市| 海城市| 洱源县| 平度市| 延安市| 庄浪县| 沛县| 大悟县| 保定市| 大余县| 沙坪坝区| 彰武县| 井研县| 泾阳县| 梨树县| 西平县| 陆丰市| 稻城县| 苍溪县| 宁德市| 马鞍山市| 集贤县| 苏尼特右旗| 桓仁| 息烽县| 滨海县| 贵德县| 那曲县| 金寨县| 青岛市| 林周县| 台中市| 高邑县| 安徽省|