摘要:本文介紹應用于通用開發的最佳實踐,只聚焦于典型場景下最優開發方法。結合的可視化設計新近推出版本,設計方式在體系得到完整支持了。注此項為建議,不強制面板之下不能直接放行內構件,要在面板下放置類構件后,才能放類構件。
本文介紹 "React + Shadow Widget" 應用于通用 GUI 開發的最佳實踐,只聚焦于典型場景下最優開發方法。分上、下兩篇講解,下篇講述正交框架分析模式與常用調測方法。
查閱上篇 請點擊這里,Shadow Widget 開源項目 在這里。
1. Controller View 與 View典型的 Flux 框架中,Store 與 View 之間的關系如下:
本圖摘自 fluxxor.com 的 “What is Flux?” 一文,Store 中的數據傳遞給一個 Component,這個 Component 又通過 props 屬性驅動多層 Component 子節點來展示界面。在這種數據傳遞關系中,多個 Component 都是 View,但從 Store 獲得數據的那個 View 比較特殊,稱為 "Controller View"(見上圖)。將 Controller View 與 View 對應到 Shadow Widget 的 MVVM 框架,Controller View 就是 VM(ViewModel),由 VM 驅動的子級 Component 就是 V (View)。
然而現實編程并非上圖那么簡單,Controller View 的子節點,也即 View 節點,有時很復雜,其外部若只依賴從上級 props 傳遞下來的數據來驅動渲染,會很別扭。開發者常不由自主的放棄 “純凈” 的編程模式,突破限制,讓 View 也從全局變量讀數據,即,變相的把部分數據從 Store 分離出去,改用全局變量表達,或者干脆讓 View 也直接從 Store 讀數據,而不是只用 Controller View 代傳的數據。
Shadow Widget 將問題簡化,既然 Store 主要用于存貯數據,那就還原它的數據特性,作為數據,在哪兒定義關系不大,直接拿 Component 的屬性存貯數據就好,將 Store 并入 Component 沒有不可逾越的障礙,當然,前提是我們已設計了 “雙源屬性” 與 “W 樹” 機制。然后,Controller View 及其下級多個 View,合起來視作一個 FB(Functionarity Block),在同一 Functionarity Block Namespace 下用 javascript 定義各節點行為。把相關節點的投影定義寫一起,很大程度消除了節點間隔閡,因為,你能隨時可以定義一個變量用來傳數據。
2. 正交框架分析模式接本文上篇的例子,假定我們在原功能基礎上,再增加 “全局配置” 的功能,提供 3 個可選項:“自動選 Celsius 還是 Fahrenheit 格式”、“固定用 Celsius”、“固定用 Fahrenheit”。其中,第一個選項 Auto(自動選格式)依據瀏覽器特性推斷國別信息,然后智能選擇 Celsius 或 Fahrenheit。
新增如下界面設計:
相應的,增加一個 Functionarity Block,JS 編碼如下:
(function() { // functionarity block var configComp = null; idSetter["config"] = function(value,oldValue) { // ... }; })();
該 FB 的入口節點是 configComp。再接著細化設計,我們該將 configComp 定義挪到全局變量定義區,因為該節點在兩個 FB 功能塊都用到。
為方便講述起見,我們把這兩個 FB 分別稱為 config 與 calculator,以 FB 分布為橫軸,以 W 樹為縱軸,W 樹中的節點是層層串聯的,繪制這兩個 FB 的分布如下圖:
當我們整體設計 GUI 時,應以 MVVM 方式思考。結合本例,也就是規劃 config 與 calculator 兩個 “功能塊”,確定各功能塊的入口節點,以及它的上下層串接關系。而處理各個功能塊之間聯動關系時,應切換到 Flux 單向數據流思考方式。
總結一下,整個 HTML 頁面是一顆 DOM 樹,是縱向的,在這顆樹劃分若干功能塊的過程,是基于 MVVM 為主的設計過程;而處理各功能塊之間橫向聯系,則以 FRP 思路為主導。這一縱一橫的思考方式,我們稱為 “正交框架” 分析模式。
說明,Flux 是 FRP(Functional Reactiv Programming)開發思想的一種實現,對于 React 開發,上面所提 Flux 與 FRP 基本等效。
至于 FB 之間的功能如何交互,如果處理邏輯簡單,不妨在相關 FB 代碼塊中直接寫代碼,如果邏輯復雜,不妨取相關 FB 的共有父節點作為入口節點,新設一個 FB 功能塊。取共有父節點的主要作用是,該父節點從創建到 unmount,可以覆蓋其下所有節點的生存周期,在它的 idSetter 函數中編程會方便一些。
3. 掛載數據來驅動調測在可視設計器中開發界面的過程,可能存在破壞式重構,比如你在某個 FB 的入口節點指定 data 屬性值,然后它的子節點根據 data 取值自動生成子節點,如果你給定的 data 初始值格式不對,其下子節點會無法生成。所給初值不對可能因為設計變化了,你的 data 格式還沒來得及調整。
為了最大幅度減少上述破壞式重構帶來錯誤,在設計界面時,我們建議用作驅動源頭的數據初值應取 “空” 值,比如賦給 null 或 [] 之類的值。
界面設計過程中,若想查看不同數據初值會驅動什么樣的界面形態,不妨啟用 W.$dataSrc 定義,比如前面例子界面缺省顯示 Celsius 溫度格式,因為 ".body.calculator.field" 節點的 scale 屬性初值是 "c",現在我們想檢查 scale="f" 界面是否正確。按如下方式使用兩行代碼即可:
if (!window.W) { window.W = new Array(); W.$modules = [];} W.$modules.push( function(require,module,exports) { var W = require("shadow-widget"); var dataSrc = W.$dataSrc = {}; dataSrc[".body.calculator.field"] = { "scale": "f" }; });
其中,var dataSrc = W.$dataSrc = {} 表示啟用 W.$dataSrc,缺省是不啟用的。另一句 dataSrc[".body.calculator.field"] = { "scale": "f" },用來預定義哪個節點要附加哪些屬性的初值。
上面代碼可以寫入獨立的 js 文件,多個此類 js 文件可構造不同的調測場景,然后用 標簽按需把某一個 js 文件導入到被測頁面。
4. 結合 shadow-bootstrap 的可視化設計shadow-bootstrap 新近推出 v1.1 版本,Bootstrap 設計方式在 Shadow Widget 體系得到完整支持了。
Bootstrap 提供了優秀的前端控件庫,在 shadow-widget 上用 bootstrap 堪稱完美,畢竟上百個 class 類誰都記不住,大家做開發時,要不停的查手冊。用 shadow-widget 的可視化設計器,只需從右側樣板頁拖一個樣板扔進來,就創建你想要的構件了,然后選擇相應節點,把相關屬性配置一下,你的界面很快就做好。
上圖是其中一個樣板頁,該拖入哪個樣板,看一眼就能區分,不再受那么多 class 類名困擾了。
5. 注意事項剛開始使用 Shadow Widget 時,大家可能不適應它的可視化設計,容易忘掉幾項設計約束,簡單舉幾個例子:
在根節點(即 ".body" 節點)下只能擺放面板與絕對定位的構件(如 ScenePage 等),即首層節點要么是 Panel 類構件,要么是指定 position="absolute" 的非行內構件。
絕對定位的構件,應掛到根節點,不宜在其它地方出現。(注:此項為建議,不強制)
面板之下不能直接放行內構件,要在面板下放置 P 類構件后,才能放 Span 類構件。
一個構件要么啟用 "html." 屬性,要么使用它的若干子節點,兩者只能二選一,若定義子節點了,以 "html." 表示文本將被忽略。
總之,與界面設計打交道,設計總是具體的,你要面對各類封裝好的構件,不少構件有特殊要求,《Shadow Widget 用戶手冊》有全面介紹,有必要通讀該手冊。
6. 關于團隊分工Shadow Widget 最佳實踐還建議團隊成員要按技能分工,至少有兩個工種,其一是能運用他人已封裝好的 WTC 類或庫化 UI,進行 GUI 開發;其二是為他人封裝 WTC 類或庫化 UI。前者對技能要求不高,后者則要求深入掌握 React 與 Shadow Widget 知識。
對于微型團隊,也應按上述分工的思路規劃您的產品開發,因為這兩種分工的目標不同,前者著眼短期目標,盡快把產品做出來,把界面弄漂亮些,后者著眼中長期目標,用封裝庫提高開發復用率。即使是單人團隊,同樣需要分工,無非在時間上錯開,一段時間承擔一種角色,另一段時間換一個角色。
Shadow Widget 當前的 WTC 類與界面庫還不夠豐富,但它的架子已搭好,起點不低。它的定制擴展能力出色,已通過一些上規模代碼的產品檢驗,如 shadow-bootstrap, pinp-blogs 等,具備一定成熟度。我們有理由相信,這個產品會隨著擴展庫逐漸增多,前景越來越光明。
(本文完)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89014.html
摘要:上例的功能塊定義了如下節點樹入口節點是面板,結合該節點的函數書寫特點,我們接著介紹最佳實踐如何處理功能塊之內的編程。 本文介紹 React + Shadow Widget 應用于通用 GUI 開發的最佳實踐,只聚焦于典型場景下最優開發方法。分上、下兩篇講解,上篇概述最佳實踐,介紹功能塊劃分。 showImg(https://segmentfault.com/img/bVWu3d?w=6...
摘要:前言非正經入門是相對正經入門而言的。不過不要緊,正式學習仍需回到正經入門的方式。快速入門建議先學會用拼文寫文檔注冊一個賬號,把庫到自己名下,然后用這個庫寫自己的博客,參見這份介紹。會用拼文寫文章,相當于開發已入門三分之一了。 本系列博文從 Shadow Widget 作者的視角,解釋該框架的設計要點,既作為用戶手冊的補充,也從更本質角度幫助大家理解 Shadow Widget 為什么這...
摘要:是前端開發領域新興的方法論體系,它繼承了與編程理念,在技術上有不少創新。但專利與開源協議是平行的兩個世界,改底層也不大容易解決問題。此外,要求在中結合各屬性的是否變化,判斷是否該觸發更新。 ReRest (Reactive Resource State Transfer) 是前端開發領域新興的方法論體系,它繼承了 MVVM 與 FRP 編程理念,在技術上有不少創新。本文從專利稿修改而來...
閱讀 3269·2023-04-25 22:47
閱讀 3781·2021-10-11 10:59
閱讀 2314·2021-09-07 10:12
閱讀 4271·2021-08-11 11:15
閱讀 3440·2019-08-30 13:15
閱讀 1757·2019-08-30 13:00
閱讀 977·2019-08-29 14:02
閱讀 1695·2019-08-26 13:57