必學 Todo List
JavaScript 必修篇 - 前端修練全攻略活動到了尾聲,開始實作一個 Todo List ,跟著艾草助教的步驟進行。
艾草提醒思考步驟
- 新增待辦事項
- 註冊監聽點擊按鈕事件:
- 必須選取 button
- 必須監聽 button 點擊事件
- 監聽函式內要先組物件,物件內包含:
- input 欄位的值(記得先取出)
- id (未來會需要透過 id 比對資料)
- 紀錄完成狀態(ckeckbox 有沒有打勾勾)
- 防呆,確認 input 欄位有值
- 有值的情況下,將剛組好的物件推到全域變數(記得宣告一個全域變數並賦予值為空陣列)
- 確認 HTML 結構,看要渲染的資料要擺在哪
- 宣告一個函式 render 用來渲染資料
- 將剛組好的資料拿來跑 forEach
- 將全域變數陣列內的 input 欄位值依需求擺放進要渲染的字串內
- id 、 紀錄完成狀態等資訊可以等後續用到時再來補埋
- 刪除單筆/切換打勾
-
監聽外層 ul 的點擊事件
- 取出點擊時該筆 li 的 id(此 id 需提前透過
data-"自定義名稱"
埋進渲染的字串內)
-
刪除功能
- 確認點擊到的是打叉按鈕
- 找出點擊到的該筆資料的索引值
- 刪除該筆資料
-
切換打勾功能
- 確認點擊到哪筆資料(可透過 id 比對)
- 點擊時新增 "checked" 屬性至 input checkbox 內(需提前埋進渲染的字串內)
- 補充:input checkbox 的屬性 checked ,可以使 checkbox 呈現打勾
-
重新渲染
- 切換 tab &修改完成狀態
- 切換 tab:監聽是否點擊到全部/待完成/已完成區塊
- 取出埋藏的 tab 狀態(在 HTML 透過
data-"自定義屬性"
埋藏 tab 的狀態)
- 透過 querySelectorAll 選取所有 tab
- 先取消全部 tab 的 class 類別 active
- 給點擊到的 tab 新增 class 類別為 active
- 修改完成狀態
- 建立一個新函式處理修改完成狀態
- 透過 tab 狀態去判斷是否完成
- 透過判斷是否打勾來顯示對應資料(可使用 filter)
- 最後呼叫 render 函式渲染 filter 後的資料
- 將原先其他功能的 render 渲染函式呼叫取消,替換成呼叫此新函式
- 計算待完成項目
- 透過計算陣列中未打勾狀態的長度,計算待完成筆數
- 將筆數賦予到 DOM 節點上
- 刪除全部&優化
- 監聽點擊清除已完成項目按鈕
- 點擊後刪除已完成項目(可透過 filter 篩選出未完成項目後重新渲染)
- 優化:鍵盤事件 Enter 也能新增待辦事項
- 刪除全部&優化
- 監聽點擊清除已完成項目按鈕
- 點擊後刪除已完成項目(可透過 filter 篩選出未完成項目後重新渲染)
- 優化:鍵盤事件 Enter 也能新增待辦事項
Todo List Start !
補充
艾草: 如果真的想不出來卡關了,也不要灰心,這裡有可愛的 Vtuber 艾拉的 👉 todoList 教學 一天實作一點小功能,很快就完成囉
其他寫法
刪除 :
todoList.addEventListener('click', deleteAndChecked);
function deleteAndChecked(e) {
let id = e.target.closest('li').dataset.id;
if (e.target.classList.value == 'delete') {
e.preventDefault();
todoData = todoData.filter((i) => i.id != id);
} else {
todoData.forEach((i, index) => {
if (i.id == id) {
if (todoData[index].checked == 'checked') {
todoData[index].checked = '';
} else {
todoData[index].checked = 'checked';
}
}
});
}
updateList();
}
最後,親愛的大家!我需要你的大聲鼓勵 ٩(⚙ᴗ⚙)۶
如果覺得這篇文章對你有幫助,請給我個一個小小的鼓勵 ❤ 讓我知道,這會成為我寫下去很大的動力。
對了,我還有其他文章,如果有興趣也來逛逛吧!
(文章中如有覺得不妥之處、錯誤內容,也可以透過聯絡我,我會儘速改善,感謝!)
☞ YoJanni 珍妮 2021 正在設計轉職前端的路上,希望大家在學習的路上能夠一起成長
☞ 聯絡我