目錄
鑰匙要點
實踐 - “項目清單”
最終組件,測試和固定裝置
>有效思維的關鍵組成部分是什麼?
有效思維是一個涉及多個關鍵組成部分的多方面過程。這些包括清晰度,精度,準確性,相關性,深度,廣度,邏輯,意義和公平性。這些組件中的每一個都在確保我們的思維過程有效並得出準確的結論中起著至關重要的作用。
>
首頁 web前端 js教程 在組件中思考

在組件中思考

Feb 21, 2025 am 09:54 AM

在組件中思考

鑰匙要點

  • 界面開發的組件方法提供了比傳統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</span>></span>
</span>  <span><span><span><a</span> href<span>="/projects/99"</span> title<span>="View project"</span>></span>Need sticker designs for XYZ Co.<span><span></a</span>></span>
</span>  <span><span><span><div</span> class<span>="project__actions"</span>></span>
</span>    <span><span><span><a</span> href<span>="/projects/99"</span> class<span>="button"</span>></span>View<span><span></a</span>></span>
</span>    <span><span><span><form</span> class<span>="action"</span> action<span>="/projects/99/archive"</span> method<span>="post"</span>></span>
</span>        <span><span><span><button</span>></span>Archive<span><span></button</span>></span>
</span>    <span><span><span></form</span>></span>
</span>  <span><span><span></div</span>></span>
</span><span><span><span></li</span>></span></span>
登入後複製
登入後複製
>這是我們用於處理表單提交和廣播事件的異步組件:

我們維護一個嚴格的政策,即從未使用JavaScript的類屬性,因此我們將在我們的操作表格中添加一個data-assync-form屬性,並將我們的組件附加到所有匹配的表單上,例如So:

>
<span><span><span><li</span>></span>
</span>  <span><span><span><a</span> href<span>="/projects/99"</span> title<span>="View project"</span>></span>Need sticker designs for XYZ Co.<span><span></a</span>></span>
</span>  <span><span><span><div</span> class<span>="project__actions"</span>></span>
</span>    <span><span><span><a</span> href<span>="/projects/99"</span> class<span>="button"</span>></span>View<span><span></a</span>></span>
</span>    <span><span><span><form</span> class<span>="action"</span> action<span>="/projects/99/archive"</span> method<span>="post"</span>></span>
</span>        <span><span><span><button</span>></span>Archive<span><span></button</span>></span>
</span>    <span><span><span></form</span>></span>
</span>  <span><span><span></div</span>></span>
</span><span><span><span></li</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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1243
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

See all articles