avalon2學習教程15指令總結

avalon的指令在上一節已經全部介紹完畢,當然有的語焉不詳,如ms-js。本節主要總結我對這方面的思考與探索。

MVVM的成功很大一語分是來自于其指令,或叫綁定。讓操作視圖的功能交由形形式式的指令來代勞。VM,成了一個大管家。它只一個反射體。我們對它的操作,直接影響到視圖。因此俗稱“操作數據即操作視圖”!至于它是怎么影響視圖,avalon視其版本的不同,也有不同的解法。如果拋開avalon,縱觀世上所有MVVM框架,大抵有如下幾種方式

  1. 函數wrapper:將原數據對象重新改造,所有屬性都變成一個函數,有參數時就是賦值,進行視圖同步與回調派發,沒有參數時就取值,進行依賴收集。如knockout.js。
  2. 上帝getter,setter: 將原數據對象重新包裝,但對數據的操作必須經過統一的set,get方法。在set方法進行視圖同步與回調派發,沒有參數時進行依賴收集。如reactive.js。如果放松要求,react也是這種方式,它使用setState進行視圖同步。但它們依賴收集的過程。
  3. 函數編譯及臟檢測:將VM放到一個函數體內,取toString重新編譯,內部是第一種方式。如angular.
  4. Object.defineProperty屬性劫持:前三種的用戶體驗非常糟,于是有了這種方式,最初我是從emberjs中學來的。avalon,vue及其他后來的MVVM框架都是使用這種方式。在賦值時執行內部的setter方法,進行視圖同步與回調派發,在取值時執行內部的getter方法,進行依賴收集。
  5. Object.observe對象監控: 這個API很短命,因此沒幾個MVVM框架用上它。由于無法進行依賴收集,需要別辟蹊徑!
  6. Proxy對象監控:Object.observe對用戶的行為監控是很弱的,并且是異步的,不夠友好。于是有了這個新寵物。但這其實也不算新寵,firefox4就存在了。它能對數據賦值,取值,遍歷,刪除等各種行為都能監控到,了解Object.defineProperty 不能監控新屬性的難題。在avalon2 中,就有一分支使用它實現。avalon2一共使用了VBScript, Object.defineProperty, Proxy實現vm。并且它沒有進行依賴數據,而是將整個視圖編譯成一個大函數,每次數據變動,都重新執行這個函數,產生虛擬DOM,前后虛擬DOM進行diff,最后全量更新。這思路從react.js學來的。

上面說了,既然使用編譯整個視圖成模板函數這一手段,我們就盡量讓這函數輕量化。位于這視圖上的所有指設也要簡化,方便在對應位置上代入VM中的屬性。在avalon1及其他MVVM框架,都是使用動態依賴收集方式來推斷指令中的某個單詞是否為vm中的某個屬性,這性能耗損比較嚴重。在avalon2直接讓用戶在屬性名前加上 @ 符號,人工優化這步驟了。此外,指令屬性值的設計原則也很明確,就是方便轉換一個函數,返回對象或對象數組(如ms-attr,ms-css,ms-widget,ms-effect,ms-class,ms-hover,ms-active,ms-for),少量的返回布爾或字符串等直接可用于JS 語句的字面量。除了ms-for與過濾器,沒有其他特殊語法。

圖片描述
除了ms-duplex,ms-on,原則上不再出來ms-xxx-yyy這樣的指令。ms-后面只跟一個單詞就夠了,不用再加-及其他單詞。

各種指令的優先級如下:
ms-for, ms-widget, ms-effect, ms-if…………其他指令(按指令名的charCodeAt排序)…………ms-duplex!

ms-duplex是最后,因此再不用擔心它與其他指令沖突的問題。

指令的更新時機有兩個,一個是位于此標簽之間的所有孩子執行之前,一個是位于此標簽之間的所有孩子執行之后。亦即change, afterChagne列隊。有興趣的話,可以閱覽這里的源碼。

想自定義指令,可以使用avalon.directive方法,第一個為指令名,第二個是定義體,里面至少有parse, diff, update三個方法。自己參看css指令,編寫指令吧。

//css指令var update = require('./_update')avalon.directive('css', {parse: function(cur, pre, binding) {cur[binding.name] = avalon.parseExpr(binding)},diff: function (copy, src, name) {var a = copy[name]var p = src[name]if (Object(a) === a) {a = a.$model || a//安全的遍歷VBscriptif (Array.isArray(a)) {//轉換成對象a = avalon.mix.apply({}, a)}if (typeof p !== 'object') {//如果一開始為空src.changeStyle = src[name] = a} else {var patch = {}var hasChange = falsefor (var i in a) {//diff差異點if (a[i] !== p[i]) {hasChange = truepatch[i] = a[i]}}if (hasChange) {src[name] = asrc.changeStyle = patch}}if (src.changeStyle) {update(src, this.update)}}delete copy[name]//釋放內存},update: function (dom, vdom) {var change = vdom.changeStylevar wrap = avalon(dom)for (var name in change) {wrap.css(name, change[name])}delete vdom.changeStyle}
})

里面的parse(cur, pre, binding)方法是用于創建虛擬DOM, cur是通過vm.$render方法生成的新虛擬節點,pre是之前的虛擬節點,binding是當前指令抽象生成的綁定對象。

里面的diff(copy, src, name)方法是用來比較前后兩個虛擬DOM。copy是新虛擬節點,src是之前的虛擬DOM,name為指令的名字。當你用各種方式比較出這兩個虛擬DOM有差異,那你就可以使用require('./_update')這個方法執行更新,更新方式為指令的update方法。

2.1.0后,刷新機制有點改動,兩個節點比較出差異后立即更新真實DOM, 不像過去那樣全部比較再全量更新。

里面的update(dom,vnode,parent)方法是用來更新真實元素的。

最后你可以在avalon.directives對象中指到所有指令的定義。你也可以在vm.$element.vtree中看到你生成的虛擬DOM樹。

既然avalon的指令已經全部介紹完了,因此大家現在可以直接使用avalon2了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS錯誤異常100問】之002:Error 000735 簡化容差:值是必需的(簡化線、簡化面工具)

測試環境: 操作系統:windows7ArcGIS版本:10.2結果:通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法4. 問題驗證1. 錯誤提示 在ArcGIS中使用簡化面或者簡化線工具時,點擊確定會提示Error 000735:簡化容…

mybatis中mysql轉義講解

本文為博主原創,未經允許不得轉載: 在mybatis中寫sql的時候,遇到特殊字符在加載解析的時候,會進行轉義,所以在mybatis中 寫sql語句的時候,遇到特殊字符進行轉義處理。 需要注意的是,轉義的字符為…

用Python執行js文件代碼并獲取返回結果

js代碼(myjs.js): /** Title: This is a file for ……* Author: JackieZheng* Date: 2022-04-12 09:24:13* LastEditTime: 2022-04-12 09:40:55* LastEditors: Please set LastEditors* Description:* FilePath: myjs.js*/function hello(…

.NET桌面開發的一些思考

在22日,我在公眾號上發布了一條短文字,內容如下:其實在.NET開發大軍中,還有一股力量,那就是桌面程序的開發者們。他們很少發聲,可能技術成熟,可能太企業化了,也可能我沒關注到。最近…

【ArcGIS錯誤異常100問】之003:屬性表中文亂碼解決辦法總結

測試環境: 操作系統:windows7ArcGIS版本:10.X、Pro結果:通過測試 文章目錄1. 錯誤提示2. 原因分析3. 解決方法4. 問題驗證1. 錯誤提示 如圖所示,安裝完ArcGIS Pro后,由于計算機系統和應用軟件字符編碼的問…

大型網站架構演化(二)——應用服務和數據服務分離

隨著網站業務的發展,一臺服務器逐漸不能滿足需求:越來越多的用戶訪問導致性能越來越差,越來越多的數據導致存儲空間不足。這時就需要將應用和數據分離。應用和數據分離后整個網站使用三臺服務器:應用服務器、文件服務器和數據庫服…

再不自動化就晚啦!優云教你4步打造基于CentOS的產品鏡像

隨著Linux程序的增多,軟件的安裝過程中經常出現如下問題: 1、硬件配置類似或者相同時,批量安裝系統和軟件,希望實現自動化安裝,減少安裝時間和人為出錯。 2、工程實施人員在不同客戶現場進行系統和軟件安裝(硬件配置不…

【ArcGIS錯誤異常100問】之004:ArcGIS表轉Excel超了65535限制解決辦法

測試環境: 操作系統:windows7ArcGIS版本:10.2 文章目錄1. 錯誤提示2. 原因分析3. 解決方法1. 錯誤提示 如下圖,當矢量shp圖斑數目過多,文件超過了65535條記錄時,利用ArcGIS的表轉Excel工具處理成Excel文件…

[轉]硬核 | Redis 布隆(Bloom Filter)過濾器原理與實戰

在Redis 緩存擊穿(失效)、緩存穿透、緩存雪崩怎么解決?中我們說到可以使用布隆過濾器避免「緩存穿透」。 碼哥,布隆過濾器還能在哪些場景使用呀? 比如我們使用「碼哥跳動」開發的「明日頭條」APP 看新聞,如…

Senparc.Weixin.Sample.MP源碼剖析

Senparc.Weixin.Sample.MP是微信公眾號樣例的.NET6源碼,項目配置文件appsettings.json的修改和微信公眾號測試環境的搭建參考:微信公眾號調試與Natapp環境搭建。接下來從項目結構,項目應用和項目源碼3個角度來進行講解。一.項目結構角度項目代…

解決java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor問題

hibernate整合spring當在spring配置文件中加入如下代碼 <!--2.配置事務屬性,需要事務管理器--><tx:advice id"txAdvice" transaction-manager"transactionManager"><tx:attributes><tx:method name"get*" read-only"t…

Packagist / Composer 中國全量鏡像

Packagist / Composer中國全量鏡像 本鏡像共緩存了 186695 個項目(package)、Millions 個(zip)安裝包。最后同步時間&#xff1a;2018/1/28 上午11:01:13 。Composer 最新版本&#xff1a;1.6.2 立即使用 贊助 Packagist 鏡像使用方法 還沒安裝 Composer 嗎&#xff1f;請往…

mock.js使用

一、Mock.js入門 1&#xff0e; 什么是mock.js? Mock.js &#xff08;官網http://mockjs.com/&#xff09;是一款模擬數據生成器&#xff0c;旨在幫助前端攻城獅獨立 于后端進行開發&#xff0c;幫助編寫單元測試。提供了以下模擬功能&#xff1a; 1,根據數據模板生成模擬數據…

面向對象——概念(成員變量、靜態變量、成員方法、靜態方法、垃圾回收機制、重載、包)...

靜態變量和成員變量的區別&#xff1a; 1、成員變量描述的是對象的特征&#xff0c;包含在對象之中。不同的對象成員變量彼此獨立。一個對象成員變量的改變&#xff0c;不會影響其他對象。 靜態變量獨立在對象之外&#xff0c;是所有對象共享的變量。靜態變量改變后會影響所有對…

【ArcGIS微課1000例】0042:ArcGIS自帶取色器工具的妙用

在ArcGIS中作圖時,通常要進行顏色對照填充,輸入特定的RGB值,本文介紹ArcGIS自帶取色器工具的妙用,及第三方顏色拾取工具。 文章目錄 一、ArcGIS自帶取色器二、第三方取色器工具一、ArcGIS自帶取色器 很多人可能不知道,ArcGIS中自帶取色器工具,如下圖所示。 當然了,自帶…

第一輪復習完畢,kmp走起

//代碼via:http://blog.csdn.net/v_JULY_v/article/details/6111565 //簡單思路via:http://study.163.com/course/courseLearn.htm?courseId468002#/learn/video?lessonId1024414&courseId468002 1 #include<iostream>2 #include<string>3 #include<vecto…

微信.NET SDK-Senparc資料整理

微信生態系統包括微信公眾號、小程序、微信支付、微信開放平臺、企業微信、小游戲等&#xff0c;官方提供了很多的API接口。Senparc是目前使用最廣泛的微信.NET SDK&#xff0c;同時支持支持.NET Framework 4.5/.NET Core 2.x/.NET Core 3.x/.NET 5/.NET 6。由于在微信生態開發…

7 種提升 Spring Boot 吞吐量神技

目錄 二、增加內嵌Tomcat的最大連接數 三、使用ComponentScan()定位掃包比SpringBootApplication掃包更快 四、默認tomcat容器改為Undertow&#xff08;Jboss下的服務器&#xff0c;Tomcat吞吐量5000&#xff0c;Undertow吞吐量8000&#xff09; 五、使用 BufferedWriter 進…

Atitit.ati?orm的設計and架構總結?適用于java?c#?php版

Atitit.ati orm的設計and架構總結 適用于java c# php版 1. Orm的目標 1 1.1. 動態obj 1 1.2. Hb的api(meger,save,update,del) 1 2. Orm的概念 1 3. 動態obj 2 4. 參考 4 1. Orm的目標 1.1. 動態obj 1.2. Hb的api(meger,save,update,del) 2. Orm的概念 saveOrUpdate后的對象會納…

【ArcGIS微課1000例】0043:ArcGIS縮略圖的創建及應用

縮略圖通常出現在地圖文檔中&#xff0c;便于在啟動頁面中快速打開指定的地圖文檔&#xff0c;提高效率。 文章目錄一、縮略圖預覽二、縮略圖創建一、縮略圖預覽 打開ArcMap軟件&#xff0c;彈出啟動窗口&#xff0c;在最近打開的文檔中&#xff0c;可以看到兩類&#xff0c;一…