鑰匙要點
- 界面開發的組件方法提供了比傳統MVC和MVVM框架的好處,重點是交互的最小抽象部分,而不是建模業務領域。 >組件應設計用於重複使用,遠離業務領域並適應不同上下文。可以在創建可以普遍使用的暗示性文本輸入組件的創建中,而不是特定類型的幫助搜索組件。 將界面分解為可組合組件不僅簡化了開發過程,而且還促進了孤立的測試。組件彼此獨立,可以進行修改和添加而不會干擾整個系統。
- > Web組件,反應,聚合物,飛行 - 全部用於構建接口組件。這是與大MVC和MVVM框架不同的工具集,在計劃如何實現界面時需要不同的思維方式。雖然我仍然將MVC之類的模型用於服務器應用程序,但我是一個專門的轉換,轉換為接口開發的組件方法的好處。在本文中,我將概述組件中的思考與在MVC中思考並在現實世界中實現該方法的思考如何不同。
- 在我看來,MVC設計的頂空間是“我如何建模我的業務領域?如何建模與該域交互的過程?如何建模界面以促進這些過程?”。我認為,這個頂空不能促進良好的組件設計。實際上,當您打算將界面分解為可組合組件時,您應該如何思考。充其量您最終會獲得微型應用程序。在最糟糕的情況下,您將建立上帝的組成部分。您要做的最後一件事是將業務領域作為組件建模。您應該以建模為目標是您可以描述的最小的互動段。 >
而不是“我如何製作這個不可接受的警報面板?”,問自己:“如果我添加了新的HTML元素來促進這種互動,它們會是什麼?”。我發現這導致了與業務領域安全距離的組成部分,並且本質上是在不同情況下最可重複使用的組件。
>
作為另一個例子,不要製作您要允許搜索幫助系統的任何地方使用類型的幫助搜索組件,製作一個暗示性的文本輸入組件,以了解提供輸入建議所涉及的交互。然後進行幫助搜索API數據組件,該組件知道如何接收數據請求,與幫助搜索API進行交互並進行廣播結果。現在,您的建議性文本輸入的測試不需要任何嘲笑API,當您被要求將建議添加到“標籤”字段中時,您可以放入現有的建議性文本輸入組件中,匯總一個簡單的數據組件來交談到標籤API,然後完成!
>實踐 - “項目清單”
對於具體示例,讓我們看一個簡單的接口作為隔離組件。以下模型是從99Designs 1比1項目系統中提取的。雖然UI已大大簡化,但我們將在撰寫本網站上構建的JavaScript是生產代碼。這是線框:
在其核心中,我們每行有一個動作。執行該操作時,我們想從列表中刪除該行。我們已經提供了任何特定項目的領域知識!此外,我們有一個計數,每個列表中有多少個項目。為了限製本文的範圍,我們假設每個頁面都是生成服務器端的,而TAB導航會導致完整頁面刷新。由於我們不需要強制依賴JavaScript,因此我們的操作按鈕將是提交事件處理程序的表單元素,這些元素會異步執行表格的操作並在完成時廣播事件。
>
以下是單個項目行的HTML:>我將使用飛行來構建我們的組件。目前,由於我以前的SitePoint JavaScript文章中概述的原因。
<span><span><span><li>></li></span> </span> <span><span><span><a> href<span>="/projects/99"</span> title<span>="View project"</span>></a></span>Need sticker designs for XYZ Co.<span><span></span>></span> </span> <span><span><span><div> class<span>="project__actions"</span>> <span><span><span><a> href<span>="/projects/99"</span> class<span>="button"</span>></a></span>View<span><span></span>></span> </span> <span><span><span><form> class<span>="action"</span> action<span>="/projects/99/archive"</span> method<span>="post"</span>></form></span> </span> <span><span><span><button>></button></span>Archive<span><span></span>></span> </span> <span><span><span></span>></span> </span> <span><span><span></span></span></span></span></span></span> </div></span>></span> </span><span><span><span></span>></span></span></span></span>>這是我們用於處理表單提交和廣播事件的異步組件:
我們維護一個嚴格的政策,即從未使用JavaScript的類屬性,因此我們將在我們的操作表格中添加一個data-assync-form屬性,並將我們的組件附加到所有匹配的表單上,例如So:
><span><span><span><li>></li></span> </span> <span><span><span><a> href<span>="/projects/99"</span> title<span>="View project"</span>></a></span>Need sticker designs for XYZ Co.<span><span></span>></span> </span> <span><span><span><div> class<span>="project__actions"</span>> <span><span><span><a> href<span>="/projects/99"</span> class<span>="button"</span>></a></span>View<span><span></span>></span> </span> <span><span><span><form> class<span>="action"</span> action<span>="/projects/99/archive"</span> method<span>="post"</span>></form></span> </span> <span><span><span><button>></button></span>Archive<span><span></span>></span> </span> <span><span><span></span>></span> </span> <span><span><span></span></span></span></span></span></span> </div></span>></span> </span><span><span><span></span>></span></span></span></span>
>現在,我們有能力執行動作,並廣播將在成功中傳播DOM樹的事件。下一步是聆聽該事件,並刪除其起泡的行。為此,我們有可移動的:
<span>define(function(require) { </span> <span>'use strict'; </span> <span>var defineComponent = require('flight/lib/component'); </span> <span>function <span>AsyncForm</span>() { </span> <span>this.defaultAttrs({ </span> <span>broadcastEvent: 'uiFormProcessed' </span> <span>}); </span> <span>this.after('initialize', function() { </span> <span>this.on(this.node, 'submit', this.asyncSubmit.bind(this)); </span> <span>}); </span> <span>this.asyncSubmit = function(event) { </span> event<span>.preventDefault(); </span> $<span>.ajax({ </span> <span>'url': this.$node.attr('action'), </span> <span>'dataType': 'json', </span> <span>'data': this.$node.serializeArray(), </span> <span>'type': this.$node.attr('method') </span> <span>}).done(function(response<span>, data</span>) { </span> <span>this.$node.trigger(this.attr.broadcastEvent, data); </span> <span>}.bind(this)).fail(function() { </span> <span>// error handling excluded for brevity </span> <span>}); </span> <span>}; </span> <span>} </span> <span>return defineComponent(AsyncForm); </span><span>});</span>
>再次,我們在項目行中添加了一個可移動的屬性,然後將組件附加到行元素:
><span>AsyncForm.attachTo('[data-async-form]');</span>
完成!每個事件都有兩個小組,我們以優雅降級的方式處理了三種類型的動作。只剩下一件事,這就是我們在每個選項卡上的計數。應該很容易,我們需要的只是每次刪除一行時將活動選項卡的計數減少一個。但是等等!當一個活動的項目被存檔時,歸檔的計數需要增加,並且重新激活存檔的項目時,激活的計數需要增加。首先,讓我們製作一個可以接收指令更改其數字的計數組件:
><span>define(function(require) { </span> <span>'use strict'; </span> <span>var defineComponent = require('flight/lib/component'); </span> <span>function <span>Removable</span>() { </span> <span>this.defaultAttrs({ </span> <span>'removeOn': 'uiFormProcessed' </span> <span>}); </span> <span>this.after('initialize', function() { </span> <span>this.on(this.attr.removeOn, this.remove.bind(this)); </span> <span>}); </span> <span>this.remove = function(event) { </span> <span>// Animate row removal, remove DOM node, teardown component </span> $<span>.when(this.$node </span> <span>.animate({'opacity': 0}, 'fast') </span> <span>.slideUp('fast') </span> <span>).done(function() { </span> <span>this.$node.remove(); </span> <span>}.bind(this)); </span> <span>}; </span> <span>} </span> <span>return defineComponent(Removable); </span><span>});</span>
我們的計數將在HTML中表示為 4 之類的東西。由於計數在文檔級別上傾聽事件,因此我們將其事件屬性為空。這將迫使任何使用它來定義此實例應聽取的事件,並防止意外地讓多個計數實例收聽同一事件的說明。
><span>Removable.attachTo('[data-removable]');</span>
<span>define(function(require) { </span> <span>'use strict'; </span> <span>var defineComponent = require('flight/lib/component'); </span> <span>function <span>Count</span>() { </span> <span>this.defaultAttrs({ </span> <span>'event': null </span> <span>}); </span> <span>this.after('initialize', function() { </span> <span>this.on(document, this.attr.event, this.update.bind(this)); </span> <span>}); </span> <span>this.update = function(event<span>, data</span>) { </span> <span>this.$node.text( </span> <span>parseInt(this.$node.text(), 10) + data.modifier </span> <span>); </span> <span>} </span> <span>} </span> <span>return defineComponent(Count); </span><span>});</span>現在,計數和可移動之間的耦合發生在特定的頁面腳本中,我們將組件連接到DOM:
任務完成了。我們的櫃檯對我們的項目列表行不了解,這些行不了解其中的形式。而且,這些組件都沒有以少數方式設計的,圍繞著項目列表的概念。
<span>Count.attachTo( </span> <span>'[data-counter="active"]', </span> <span>{'event': 'uiActiveCountChanged'} </span><span>); </span> <span>Count.attachTo( </span> <span>'[data-counter="draft"]', </span> <span>{'event': 'uiDraftCountChanged'} </span><span>); </span> <span>Count.attachTo( </span> <span>'[data-counter="archived"]', </span> <span>{'event': 'uiArchivedCountChanged'} </span><span>);</span>最後一分鐘添加
>我們的UX設計師指出,如果有人試圖刪除草稿時,我們要求確認會更好,因為這項操作無法撤銷。沒問題,我們可以鞭打一個可以做到這一點的組件:
>
>將其連接到刪除按鈕上,我們得到了所要求的。確認對話框將攔截按鈕,如果用戶選擇“確定”,則允許表單提交。我們不必更改我們的異步組件,因為我們可以在不相互干擾的情況下組成這些組件。在我們的生產代碼中,我們還在“動作”按鈕上使用單身式組件,該組件提供了視覺反饋,表明該表格已提交並防止多個提交。
最終組件,測試和固定裝置
>希望本文已經證明您的項目如何從將界面分解為可組合組件中受益。我尚未涵蓋的組件設計的一個重要好處是它們易於隔離測試,因此,這是最終組件以及其茉莉測試和HTML測試固定裝置:
- yncform
- 可移動
- >計數
- >確認
>關於思考組件的常見問題(常見問題解答)
>有效思維的關鍵組成部分是什麼?
有效思維是一個涉及多個關鍵組成部分的多方面過程。這些包括清晰度,精度,準確性,相關性,深度,廣度,邏輯,意義和公平性。這些組件中的每一個都在確保我們的思維過程有效並得出準確的結論中起著至關重要的作用。
>>我如何提高我的批判性思維能力?諸如質疑假設,尋求多種觀點並開放新思想之類的習慣。它還涉及開發諸如分析,解釋,推理,評估,解釋和自我調節之類的技能。
>>邏輯在批判性思維中的作用是什麼?批判性思維。它涉及正確推理,從前提獲得結論,評估索賠並避免推理中的謬論或錯誤的能力。
>相關性如何有效思維?我們正在考慮的信息或想法與當前問題或問題直接相關。它有助於我們保持專注並避免分心或無關緊要的信息。 >
>批判性思維中深度的重要性是什麼?問題或問題,了解其潛在的原因或含義,並從多個角度探索它。>
>我如何在思想中發展廣度?>
在思考中發展廣度涉及考慮廣泛的觀點,思想和信息來源。它需要開放,好奇,願意探索新的想法或觀點。 公平在批判性思維中的作用是什麼?和客觀。它要求我們考慮所有相關的觀點和證據,並避免偏愛,偏見或偏見。精確性如何有效思維?
精確性涉及精確,詳細和清晰的思想和表達方式。它有助於我們避免模糊,模棱兩可或混亂,並有效地傳達我們的想法。
>>準確性在批判性思維中的重要性是什麼?
準確性的批判性思維中的準確性涉及確保我們的信息,想法和結論是正確的,可靠的,並且沒有錯誤或扭曲。這對於做出正確的決策和判斷至關重要。 >我如何提高思想的清晰度?我們的思想和表達中的簡單性和直截了當。 以上是在組件中思考的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。