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

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

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

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

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

💡 The Reactivity System

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

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

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

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

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

如果你不明白,那我們試著看看常規(guī)的JavaScript是怎么運行的。例如,如果我運行此代碼:

你覺得它打印什么?由于我們沒有使用Vue,它將打印10。

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

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

⚠️ 問題

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

✅ 解決方案

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

請注意,我們在目標(biāo)變量中存儲了一個匿名函數(shù),然后調(diào)用了一個記錄函數(shù)。使用ES6箭頭語法我也可以這樣寫:

請注意,我們在目標(biāo)變量中存儲了一個匿名函數(shù),然后調(diào)用了一個記錄函數(shù)。使用ES6箭頭語法我也可以這樣寫:

記錄的方法:

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

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

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

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

⚠️ 問題

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

✅ 解決方法: 使用Class

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

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

讓它運行:

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

⚠️ 問題

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

(這只是上面的代碼)

我們可以改為:

✅ 解決方案:觀察者功能

在我們的Watcher功能中,我們可以做一些簡單的事情:

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

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

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

⚠️ 問題

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

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

當(dāng)我們運行時:

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

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

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

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

✅ 解決方案:Object.defineProperty()

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

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

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

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

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

現(xiàn)在一切都有g(shù)etter和setter,我們在控制臺上看到了這一點。

🛠 Putting both ideas together

當(dāng)像這樣的一段代碼運行并獲得價格的價值時,我們希望價格記住這個匿名函數(shù)(目標(biāo))。這樣,如果價格變化,或者設(shè)置為新值,它將觸發(fā)此函數(shù)以重新運行,因為它知道此行依賴于它。所以你可以這樣想。

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

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

或者就我們的Dep Class而言

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • vue使用canvas實現(xiàn)移動端手寫簽名

    vue使用canvas實現(xiàn)移動端手寫簽名

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Vue中正確使用jQuery的方法

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

最新評論