關注點分離的 JavaScript 應用程式

閱讀時間約 10 分鐘

在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。


框架選擇

常見的前端框架有三個:Vue、React 和 Angular。這些框架各有特色:

  • Vue:由尤雨溪開發,擁有友好的中文社群,適合初學者。
  • React:由 Facebook 開發,擁有廣泛的使用者群體,靈活性強。
  • Angular:由 Google 開發,適合大型應用,提供完整的解決方案。

我們主要會介紹Vue,如果有想知道其他框架的詳細內容可以留言告訴我喔!無論選擇哪個框架,都應選擇定期維護並且受歡迎的開源項目(如 MIT 授權),以確保使用過程中的安全性和穩定性。

關注點分離

關注點分離是一種軟體設計原則,旨在將不同功能的程式碼分開,讓程式更易於維護和理解。關注點分離在框架會有大量使用,以下是如何在 JavaScript 中實現這一原則的範例。

基本範例:計算陣列的總和

我們首先創建一個簡單的 HTML 結構,並用 JavaScript 將數據動態顯示在頁面上。

HTML 結構

<div>
<ul id="container"></ul>
<hr>
<p id="output"></p>
</div>



JavaScript 實現

以下是傳統寫法:

const data = [1, 2, 3];

// 一般寫法
const container = document.querySelector('#container');
const output = document.querySelector('#output');

let content = '';
let sum = 0;

for (let i = 0; i < data.length; i++) {
content += `<li>${data[i]}</li>`;
sum += data[i];
}
container.innerHTML = content;
output.textContent = sum;

使用關注點分離後的寫法:

const app = {
container: document.querySelector('#container'),
output: document.querySelector('#output'),
data: [1, 2, 3, 4],

// 計算data陣列總和的函式
sum() {
return this.data.reduce((acc, num) => acc + num, 0);
},

// 渲染畫面的函式
render() {
this.container.innerHTML = this.data.map(num => `<li>${num}</li>`).join('');
this.output.textContent = this.sum();
},

// 初始化
init() {
this.render();
},
}

// 執行app的初始化
app.init();

看出差別了嗎~


新增與刪除資料的範例

接下來,我們將實作一個可以新增和刪除資料的功能,一樣使用關注點分離的方式。

HTML 結構

<div>
<form>
<label>
姓氏
<input id="last-name" type="text">
</label>
<label>
名字
<input id="first-name" type="text">
</label>
<button id="add-btn" type="button">新增</button>
</form>
<ul id="container"></ul>
</div>

JavaScript 實現

const app = {
lastName: document.querySelector('#last-name'),
firstName: document.querySelector('#first-name'),
addBtn: document.querySelector('#add-btn'),
container: document.querySelector('#container'),
arr: [],

addListen() {
this.addBtn.addEventListener('click', () => {
const newEntry = {
id: new Date().getTime(),
lastName: this.lastName.value,
firstName: this.firstName.value,
};
this.arr.push(newEntry);
this.lastName.value = '';
this.firstName.value = '';
this.render();
});

this.container.addEventListener('click', (e) => {
const id = e.target.dataset.id;
if (!id) return;
this.deleteItem(Number(id));
});
},

render() {
const content = this.arr.map(item => `
<li>
<span>${item.lastName} ${item.firstName}</span>
<button data-id="${item.id}" type="button">刪除</button>
</li>
`).join('');
this.container.innerHTML = content;
},

deleteItem(id) {
const index = this.arr.findIndex(item => item.id === id);
if (index !== -1) {
this.arr.splice(index, 1);
this.render();
}
},

init() {
this.addListen();
},
}

app.init();

程式碼解析

  1. 宣告:將所有 DOM 元素和數據都放入一個物件中,便於管理。
  2. 事件監聽:使用箭頭函式來確保 this 總是指向 app 物件。新增按鈕和刪除按鈕的事件監聽器也清晰地分開。
  3. 渲染函式render 函式負責更新畫面,利用 map 方法將資料渲染為列表項。
  4. 刪除功能:透過資料的 id 進行刪除,並更新顯示。

總結

通過這種關注點分離的方式,我們的程式碼更具可讀性和可維護性。在開發過程中,選擇適合的框架和良好的程式撰寫習慣將使團隊協作更加順暢,這邊主要會練習專注點分離是要習慣後面使用Vue.js框加的寫法,接下來會介紹Vue.js的基礎。


對於這類的撰寫方式習慣嗎?歡迎多多進行良性的知識交流喔!目前是在學習階段,大家有不同看法的話歡迎進行良性的知識交流!


提醒,文章僅供正當的知識參考,文章不負任何責任。


avatar-img
0會員
1內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。