亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue.js實現數據響應的方法

2019-11-19 13:16:35
字體:
來源:轉載
供稿:網友

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

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

💡 The Reactivity System

當你第一次看到它時,Vue的響應系統看起來很神奇。拿這個簡單的Vue應用程序:

不知何故,Vue只知道如果價格發生變化,它應該做三件事:

  • 更新我們網頁上的價格值。
  • 重新計算乘以price * quantity的表達式,并更新頁面。
  • 再次調用totalPriceWithTax函數并更新頁面。

但是等等,你應該會覺得奇怪,當價格變化時,Vue如何知道要更新什么,以及它如何跟蹤所有內容?

這不是JavaScript編程常規的工作方式。

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

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

在Vue,我們希望每當價格或數量更新時,總計都會得到更新。我們想要:

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

⚠️ 問題

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

✅ 解決方案

首先,我們需要一些方法告訴我們的應用程序,“我即將運行的代碼,存儲它,我可能需要你在另一個時間運行它。”然后我們將要運行代碼,如果價格或數量變量得到更新,再次運行存儲的代碼。

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

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

記錄的方法:

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

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

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

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

⚠️ 問題

我們可以根據需要繼續記錄目標,但是有一個更強大的解決方案可以擴展我們的應用程序。那就是一個負責維護目標列表的類,當我們需要它們重新運行時,這些目標列表會得到通知。

✅ 解決方法: 使用Class

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

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

讓它運行:

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

⚠️ 問題

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

(這只是上面的代碼)

我們可以改為:

✅ 解決方案:觀察者功能

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

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

現在,當我們運行以下內容時:

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

⚠️ 問題

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

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

當我們運行時:

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

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

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

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

✅ 解決方案:Object.defineProperty()

我們需要了解Object.defineProperty()函數,它是簡單的ES5 JavaScript。它允許我們為屬性定義getter和setter函數。在我向您展示如何在Dep類中使用它之前,先簡單展示一下改函數的用法。

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

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

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

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

現在一切都有getter和setter,我們在控制臺上看到了這一點。

🛠 Putting both ideas together

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

Get =>記住這個匿名函數,當我們的值發生變化時,我們會再次運行它。

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

或者就我們的Dep Class而言

Price accessed (get) => 調用dep.depend()來保存當前目標

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

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

現在看看會發生什么。

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

Vue文檔中的這個插圖現在應該開始有意義了。

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

是的,現在是不是覺得更有意義了。

顯然,Vue做的可能更復雜更驚喜,但你現在知道了基礎知識。

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

總結

以上所述是小編給大家介紹的Vue.js實現數據響應的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜一区二区| 国产精品吊钟奶在线| 色狠狠av一区二区三区香蕉蜜桃| 粉嫩老牛aⅴ一区二区三区| 亚洲国产精品久久久久| 神马国产精品影院av| 91亚洲va在线va天堂va国| 国产一区二区日韩精品欧美精品| 国产不卡一区二区在线播放| 岛国精品视频在线播放| 在线播放日韩欧美| 亚洲a级在线播放观看| 亚洲免费伊人电影在线观看av| 欧美激情视频在线观看| 中文字幕亚洲二区| 欧美性感美女h网站在线观看免费| 亚洲免费小视频| 91在线观看免费高清完整版在线观看| 国产精品久久久久久久久久99| 中文字幕亚洲综合| 日韩大陆毛片av| 久久久久国产一区二区三区| 日韩在线视频中文字幕| 日韩最新av在线| 欧美大片在线免费观看| 久久精品国产亚洲精品2020| 538国产精品视频一区二区| 欧美精品久久久久| 这里只有视频精品| 俺去亚洲欧洲欧美日韩| 国产亚洲欧美另类中文| 欧美在线影院在线视频| 成人黄色av播放免费| 国产精品精品视频一区二区三区| 日韩精品中文字幕在线| 亚洲欧洲成视频免费观看| 国产97人人超碰caoprom| 性欧美xxxx视频在线观看| 欧美中文字幕视频| 日本一区二区在线播放| 亚洲成人aaa| 亚洲黄色www网站| 奇米成人av国产一区二区三区| 精品国产成人av| 福利二区91精品bt7086| 国产精品久久精品| 日本aⅴ大伊香蕉精品视频| 色综合久久88色综合天天看泰| 国产精品久久久久久久久免费看| 日本不卡高字幕在线2019| 中文字幕日韩高清| 久久精品99国产精品酒店日本| 国产美女精品免费电影| 日韩精品一区二区三区第95| 8x拔播拔播x8国产精品| 日韩美女激情视频| 青青久久av北条麻妃黑人| 欧美一级片免费在线| 亚洲精品99久久久久| 国产福利精品av综合导导航| 成人免费网站在线看| 91av福利视频| 日韩美女免费视频| 成人午夜在线影院| 狠狠色香婷婷久久亚洲精品| 欧美精品久久久久| 亚洲а∨天堂久久精品9966| 91在线视频成人| 亚洲第一区中文字幕| 欧美在线视频播放| 国产精品视频一区二区高潮| 国产精品亚洲综合天堂夜夜| 国产精品永久免费观看| 欧美性猛交xxxx久久久| 久热精品在线视频| 欧美激情亚洲精品| 国产精品免费观看在线| 97视频com| 国产精品久久久91| 欧美精品在线观看91| 亚洲国产精品久久久久久| 国产v综合v亚洲欧美久久| 日韩精品一区二区视频| 欧洲成人午夜免费大片| 亚洲视频自拍偷拍| 国产精品av网站| 亚洲精品少妇网址| 国产精品综合网站| 日韩精品视频在线播放| 欧美日韩国产123| 久久精彩免费视频| 欧美成人合集magnet| 国产精品啪视频| 亚洲精品www久久久| 国产精品狼人色视频一区| 国产999精品视频| 91视频国产一区| 高清欧美性猛交xxxx| 国产精品一区=区| 91精品久久久久久久久| 欧美高清一级大片| 久久久黄色av| 91爱视频在线| 亚洲v日韩v综合v精品v| 亚洲性夜色噜噜噜7777| 久久久久国产精品免费网站| 欧美黄色小视频| 日韩免费精品视频| 欧美色道久久88综合亚洲精品| 色综合伊人色综合网| 精品毛片网大全| 性日韩欧美在线视频| 亚洲第一网站免费视频| xxxxx成人.com| 国产精品美女999| 日本久久久久久久久| 91免费在线视频| 亚洲人成在线观看网站高清| 97精品国产97久久久久久春色| 欧美专区福利在线| 久久久国产成人精品| 欧美日韩国产一区中文午夜| 欧美性少妇18aaaa视频| 亚洲男人天堂2024| 久久成人精品一区二区三区| 亚洲黄页视频免费观看| 亚洲国产精品网站| 国产精品扒开腿爽爽爽视频| 欧美一区二区影院| 69久久夜色精品国产7777| 亚洲va欧美va国产综合剧情| 97精品视频在线观看| 高清欧美性猛交xxxx黑人猛交| 日韩成人中文字幕在线观看| 国产欧美一区二区三区视频| 成人免费视频a| 美女久久久久久久久久久| 92国产精品久久久久首页| 91亚洲国产成人久久精品网站| 中文字幕精品www乱入免费视频| 久久久亚洲成人| 国产午夜精品全部视频在线播放| 日韩精品有码在线观看| 欧美亚洲成人免费| 国产日韩中文字幕在线| 国内免费久久久久久久久久久| 久久精品成人欧美大片| 国产精品美女www爽爽爽视频| 色爱精品视频一区| 九九久久久久久久久激情| 日本精品一区二区三区在线播放视频| 精品久久久久久国产91| 91亚洲午夜在线| 国产亚洲欧洲在线| 亚洲美女久久久| 国产一区二区日韩精品欧美精品| 91成人天堂久久成人| 国产精品久久久久免费a∨| 中文字幕亚洲无线码a| 欧美国产日韩免费| 91精品91久久久久久| 欧美日韩成人在线观看| 国产精品久久久久久中文字| 国内精品视频一区|