亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue.js實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的方法

 更新時(shí)間:2018年08月13日 11:20:33   作者:_小生_  
這篇文章主要介紹了Vue.js實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

許多前端JavaScript框架(例如Angular,React和Vue)都有自己的數(shù)據(jù)相應(yīng)引擎。通過(guò)了解相應(yīng)性及其工作原理,您可以提高開(kāi)發(fā)技能并更有效地使用JavaScript框架。在視頻和下面的文章中,我們構(gòu)建了您在Vue源代碼中看到的相同類(lèi)型的Reactivity。

如果您觀看此視頻而不是閱讀文章,請(qǐng)觀看系列中的下一個(gè)視頻,與Vue的創(chuàng)建者Evan You討論反應(yīng)性和代理。

💡 The Reactivity System

當(dāng)你第一次看到它時(shí),Vue的響應(yīng)系統(tǒng)看起來(lái)很神奇。拿這個(gè)簡(jiǎn)單的Vue應(yīng)用程序:

不知何故,Vue只知道如果價(jià)格發(fā)生變化,它應(yīng)該做三件事:

  • 更新我們網(wǎng)頁(yè)上的價(jià)格值。
  • 重新計(jì)算乘以price * quantity的表達(dá)式,并更新頁(yè)面。
  • 再次調(diào)用totalPriceWithTax函數(shù)并更新頁(yè)面。

但是等等,你應(yīng)該會(huì)覺(jué)得奇怪,當(dāng)價(jià)格變化時(shí),Vue如何知道要更新什么,以及它如何跟蹤所有內(nèi)容?

這不是JavaScript編程常規(guī)的工作方式。

如果你不明白,那我們?cè)囍纯闯R?guī)的JavaScript是怎么運(yùn)行的。例如,如果我運(yùn)行此代碼:

你覺(jué)得它打印什么?由于我們沒(méi)有使用Vue,它將打印10。

在Vue,我們希望每當(dāng)價(jià)格或數(shù)量更新時(shí),總計(jì)都會(huì)得到更新。我們想要:

不幸的是,JavaScript是程序性的,而不是被動(dòng)的,所以這在現(xiàn)實(shí)生活中不起作用。為了使數(shù)據(jù)變化得到相應(yīng),我們必須使用JavaScript來(lái)使事情表現(xiàn)不同。

⚠️ 問(wèn)題

我們需要保存計(jì)算總數(shù)的方式,以便在價(jià)格或數(shù)量變化時(shí)重新運(yùn)行。

✅ 解決方案

首先,我們需要一些方法告訴我們的應(yīng)用程序,“我即將運(yùn)行的代碼,存儲(chǔ)它,我可能需要你在另一個(gè)時(shí)間運(yùn)行它?!比缓笪覀儗⒁\(yùn)行代碼,如果價(jià)格或數(shù)量變量得到更新,再次運(yùn)行存儲(chǔ)的代碼。

請(qǐng)注意,我們?cè)谀繕?biāo)變量中存儲(chǔ)了一個(gè)匿名函數(shù),然后調(diào)用了一個(gè)記錄函數(shù)。使用ES6箭頭語(yǔ)法我也可以這樣寫(xiě):

請(qǐng)注意,我們?cè)谀繕?biāo)變量中存儲(chǔ)了一個(gè)匿名函數(shù),然后調(diào)用了一個(gè)記錄函數(shù)。使用ES6箭頭語(yǔ)法我也可以這樣寫(xiě):

記錄的方法:

我們正在存儲(chǔ)目標(biāo)(在我們的例子中是{total = price * quantity}),所以我們可以稍后運(yùn)行它。

這將遍歷存儲(chǔ)陣列中存儲(chǔ)的所有匿名函數(shù)并執(zhí)行它們中的每一個(gè)。

然后在我們的代碼中,我們可以:

很簡(jiǎn)單吧?如果您需要閱讀并嘗試再次掌握它,這里的代碼就完整了。僅供參考,如果您想知道原因,我會(huì)以特定的方式對(duì)此進(jìn)行編碼。

⚠️ 問(wèn)題

我們可以根據(jù)需要繼續(xù)記錄目標(biāo),但是有一個(gè)更強(qiáng)大的解決方案可以擴(kuò)展我們的應(yīng)用程序。那就是一個(gè)負(fù)責(zé)維護(hù)目標(biāo)列表的類(lèi),當(dāng)我們需要它們重新運(yùn)行時(shí),這些目標(biāo)列表會(huì)得到通知。

✅ 解決方法: 使用Class

我們可以開(kāi)始解決這個(gè)問(wèn)題的一種方法是將這種行為封裝到它自己的Class中,這是一個(gè)實(shí)現(xiàn)標(biāo)準(zhǔn)編程觀察者模式的依賴類(lèi)。

因此,如果我們創(chuàng)建一個(gè)JavaScript類(lèi)來(lái)管理我們的依賴項(xiàng)(它更接近Vue處理事物的方式),它可能看起來(lái)像這樣:

讓它運(yùn)行:

它仍然有效,現(xiàn)在我們的代碼感覺(jué)更可靠了。只有仍然感覺(jué)有點(diǎn)奇怪的是target()的設(shè)置和運(yùn)行。

⚠️ 問(wèn)題

我們將為每個(gè)變量設(shè)置一個(gè)Dep類(lèi),并且很好地封裝了創(chuàng)建需要監(jiān)視更新的匿名函數(shù)的行為。也許觀察者功能可能是為了處理這種行為。

(這只是上面的代碼)

我們可以改為:

✅ 解決方案:觀察者功能

在我們的Watcher功能中,我們可以做一些簡(jiǎn)單的事情:

如您所見(jiàn),watcher函數(shù)接受myFunc參數(shù),將其設(shè)置為我們的全局目標(biāo)屬性,調(diào)用dep.depend()以將目標(biāo)添加為訂閱者,調(diào)用目標(biāo)函數(shù)并重置目標(biāo)。

現(xiàn)在,當(dāng)我們運(yùn)行以下內(nèi)容時(shí):

您可能想知道為什么我們將target實(shí)現(xiàn)為全局變量,而不是將其傳遞到我們需要的函數(shù)中。這有一個(gè)很好的理由,這將在我們的文章結(jié)尾處揭曉。

⚠️ 問(wèn)題

我們有一個(gè)Dep類(lèi),但我們真正想要的是每個(gè)變量都有自己的Dep。在我們繼續(xù)之前,先存儲(chǔ)一下數(shù)據(jù)。

讓我們假設(shè)我們的每個(gè)屬性(價(jià)格和數(shù)量)都有自己的內(nèi)部Dep類(lèi)。

當(dāng)我們運(yùn)行時(shí):

由于訪問(wèn)了data.price值,我希望price屬性的Dep類(lèi)將我們的匿名函數(shù)(存儲(chǔ)在目標(biāo)中)推送到其訂閱者數(shù)組(通過(guò)調(diào)用dep.depend())。由于訪問(wèn)了data.quantity,我還希望quantity屬性Dep類(lèi)將此匿名函數(shù)(存儲(chǔ)在目標(biāo)中)推送到其訂閱者數(shù)組中。

如果我有另一個(gè)匿名函數(shù),只訪問(wèn)data.price,我希望只推送到價(jià)格屬性Dep類(lèi)。

我什么時(shí)候想要在價(jià)格訂閱者上調(diào)用dep.notify()?我希望在設(shè)定價(jià)格時(shí)調(diào)用它們。在文章的最后,我希望能夠進(jìn)入控制臺(tái)并執(zhí)行:

我們需要一些方法來(lái)掛鉤數(shù)據(jù)屬性(如價(jià)格或數(shù)量),所以當(dāng)它被訪問(wèn)時(shí)我們可以將目標(biāo)保存到我們的訂閱者數(shù)組中,當(dāng)它被更改時(shí),運(yùn)行存儲(chǔ)在我們的訂閱者數(shù)組中的函數(shù)。

✅ 解決方案:Object.defineProperty()

我們需要了解Object.defineProperty()函數(shù),它是簡(jiǎn)單的ES5 JavaScript。它允許我們?yōu)閷傩远xgetter和setter函數(shù)。在我向您展示如何在Dep類(lèi)中使用它之前,先簡(jiǎn)單展示一下改函數(shù)的用法。

如您所見(jiàn),它只記錄兩行。但是,它實(shí)際上并沒(méi)有獲取或設(shè)置任何值,因?yàn)槲覀冞^(guò)度使用了該功能。我們現(xiàn)在加回來(lái)吧。 get()期望返回一個(gè)值,而set()仍然需要更新一個(gè)值,所以讓我們添加一個(gè)internalValue變量來(lái)存儲(chǔ)我們當(dāng)前的價(jià)格值。

既然我們的get和set工作正常,您認(rèn)為將打印到控制臺(tái)的是什么?

因此,當(dāng)我們獲取并設(shè)置值時(shí),我們可以獲得通知。通過(guò)一些遞歸,我們可以為數(shù)組中的所有項(xiàng)運(yùn)行它

FYI,Object.keys(data)返回對(duì)象鍵的數(shù)組。

現(xiàn)在一切都有g(shù)etter和setter,我們?cè)诳刂婆_(tái)上看到了這一點(diǎn)。

🛠 Putting both ideas together

當(dāng)像這樣的一段代碼運(yùn)行并獲得價(jià)格的價(jià)值時(shí),我們希望價(jià)格記住這個(gè)匿名函數(shù)(目標(biāo))。這樣,如果價(jià)格變化,或者設(shè)置為新值,它將觸發(fā)此函數(shù)以重新運(yùn)行,因?yàn)樗来诵幸蕾囉谒?。所以你可以這樣想。

Get =>記住這個(gè)匿名函數(shù),當(dāng)我們的值發(fā)生變化時(shí),我們會(huì)再次運(yùn)行它。

Set =>運(yùn)行保存的匿名函數(shù),我們的值剛改變。

或者就我們的Dep Class而言

Price accessed (get) => 調(diào)用dep.depend()來(lái)保存當(dāng)前目標(biāo)

Price set => 在價(jià)格上調(diào)用dep.notify(),重新運(yùn)行所有目標(biāo)

讓我們結(jié)合這兩個(gè)想法,并完成我們的最終代碼。

現(xiàn)在看看會(huì)發(fā)生什么。

正是我們所希望的!價(jià)格和數(shù)量都確實(shí)是得到了實(shí)時(shí)的響應(yīng)的!只要價(jià)格或數(shù)量的價(jià)值得到更新,我們的總代碼就會(huì)重新運(yùn)行。

Vue文檔中的這個(gè)插圖現(xiàn)在應(yīng)該開(kāi)始有意義了。

你看到那個(gè)漂亮的紫色數(shù)據(jù)圈了嗎?看起來(lái)應(yīng)該很眼熟!每個(gè)組件實(shí)例都有一個(gè)從getter(紅線)收集依賴項(xiàng)的服務(wù)觀察器實(shí)例(藍(lán)色)。當(dāng)稍后調(diào)用設(shè)置程序時(shí),它會(huì)通知監(jiān)視程序,它將導(dǎo)致組件重新呈現(xiàn)。下面是我自己的一些注釋的圖片。

是的,現(xiàn)在是不是覺(jué)得更有意義了。

顯然,Vue做的可能更復(fù)雜更驚喜,但你現(xiàn)在知道了基礎(chǔ)知識(shí)。

⏪ 總結(jié):所以我們學(xué)了什么?如何創(chuàng)建一個(gè)Dep類(lèi)來(lái)收集依賴項(xiàng)(依賴)并重新運(yùn)行所有依賴項(xiàng)(notify)。如何創(chuàng)建一個(gè)觀察程序來(lái)管理我們正在運(yùn)行的代碼,這些代碼可能需要作為依賴項(xiàng)添加(target)。如何使用Object.defineProperty()創(chuàng)建getter和setter。

總結(jié)

以上所述是小編給大家介紹的Vue.js實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue使用canvas實(shí)現(xiàn)移動(dòng)端手寫(xiě)簽名

    vue使用canvas實(shí)現(xiàn)移動(dòng)端手寫(xiě)簽名

    這篇文章主要為大家詳細(xì)介紹了基于vue使用canvas實(shí)現(xiàn)移動(dòng)端手寫(xiě)簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • element?el-upload文件上傳覆蓋第一個(gè)文件的實(shí)現(xiàn)

    element?el-upload文件上傳覆蓋第一個(gè)文件的實(shí)現(xiàn)

    這篇文章主要介紹了element?el-upload文件上傳覆蓋第一個(gè)文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue如何通過(guò)Vue.prototype定義原型屬性實(shí)現(xiàn)全局變量

    Vue如何通過(guò)Vue.prototype定義原型屬性實(shí)現(xiàn)全局變量

    在Vue.js開(kāi)發(fā)中,通過(guò)原型屬性為Vue實(shí)例添加全局變量是一種常見(jiàn)做法,使用$前綴命名,可以避免與組件內(nèi)部的數(shù)據(jù)、方法或計(jì)算屬性產(chǎn)生命名沖突,這種方式簡(jiǎn)單有效,確保了變量在所有Vue實(shí)例中的可用性,同時(shí)保持全局作用域的整潔
    2024-10-10
  • Vue實(shí)戰(zhàn)記錄之登陸頁(yè)面的實(shí)現(xiàn)

    Vue實(shí)戰(zhàn)記錄之登陸頁(yè)面的實(shí)現(xiàn)

    最近學(xué)習(xí)過(guò)程中常碰到讓用戶登錄注冊(cè)這種,這篇文章主要給大家介紹了關(guān)于Vue實(shí)戰(zhàn)記錄之登陸頁(yè)面實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • webpack vue項(xiàng)目開(kāi)發(fā)環(huán)境局域網(wǎng)訪問(wèn)方法

    webpack vue項(xiàng)目開(kāi)發(fā)環(huán)境局域網(wǎng)訪問(wèn)方法

    下面小編就為大家分享一篇webpack vue項(xiàng)目開(kāi)發(fā)環(huán)境局域網(wǎng)訪問(wèn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • vue組件常用的父子、兄弟、跨組件等傳值方法

    vue組件常用的父子、兄弟、跨組件等傳值方法

    Vue常用的三種傳值方式有:??父?jìng)髯??子傳父??非父子傳值?引用官網(wǎng)的一句話:父子組件的關(guān)系可以總結(jié)為?prop?向下傳遞,事件向上傳遞,熟悉vue各類(lèi)關(guān)系的組件之間傳值方法會(huì)令開(kāi)發(fā)更加得心應(yīng)手,下面將對(duì)父子、兄弟、頁(yè)級(jí)組件之間的傳值作淺談
    2023-12-12
  • Element-Plus?el-col、el-row快速布局及使用方法

    Element-Plus?el-col、el-row快速布局及使用方法

    這篇文章主要介紹了Element-Plus?el-col、el-row快速布局及使用方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue+Webpack完美整合富文本編輯器TinyMce的方法

    Vue+Webpack完美整合富文本編輯器TinyMce的方法

    這篇文章主要介紹了Vue+Webpack完美整合富文本編輯器TinyMce的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • vue服務(wù)端渲染的實(shí)例代碼

    vue服務(wù)端渲染的實(shí)例代碼

    本篇文章主要介紹了vue服務(wù)端渲染的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Vue中正確使用jQuery的方法

    Vue中正確使用jQuery的方法

    這篇文章主要為大家詳細(xì)介紹了Vue中正確使用jQuery的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論