這次的內容為簡單的待辦事項列表 (to-do list) 應用,並使用 localStorage
來儲存數據。
const addItems = document.querySelector(".add-items");
const itemsList = document.querySelector(".plates");
const items = JSON.parse(localStorage.getItem("items")) || [];
addItems.addEventListener("submit", addItem);
itemsList.addEventListener("click", toggleItem);
addItems
選取接受輸入值的form表
itemsList
選取待辦事項的顯示列表
items
從 localStorage 讀取已儲存的待辦事項,若無則使用空陣列
function addItem(e) {
e.preventDefault(); //防止表單的默認提交行為
let text = this.querySelector("[name=item]").value; //選取 input的值
items.push({ text, done: false });
localStorage.setItem("items", JSON.stringify(items));
createList(items, itemsList);
this.reset();
}
items.push({ text, done: false })
將變數text以及設定屬性done:false
放入items
localStorage.setItem("items", JSON.stringify(items));
設定localStorage
key名稱為”items”,key值是JSON.stringify(items)
createList(items, itemsList);
為我們等等要渲染list畫面的函式
this.reset();
用於重置表單內容,讓輸入框清空
function createList(plates = [], platesList) {
platesList.innerHTML = plates
.map((plate, i) => {
return `
<li>
<input type="checkbox" data-index=${i} id="item${i}" ${
plate.done ? "checked" : "" //如果是done狀態則打勾
} />
<label for="item${i}">${plate.text}</label>
</li>
`;
})
.join("");
}
plates.map
利用map來閱歷plates.map
的每個元素,並return相應的Html結構
若plate.done為(done: true
),則 checkbox
會顯示勾選狀態。
function toggleItem(e) {
//避免重複觸發
if (!e.target.matches("input")) return;
let index = e.target.dataset["index"];
items[index].done = !items[index].done;
localStorage.setItem("items", JSON.stringify(items));//更新localStorag資料
createList(items, itemsList); //更新畫面
}
if (!e.target.matches("input"))
判斷e.target
是否為一個input元素,如果不是則跳出
index
賦值e.target屬性名稱為data-index的值
items[index].done = !items[index].done;
紀錄checkBox是否check的開關
populateList(items, itemsList);
當頁面重新加載時,會將localStorage
儲存的待辦事項顯示出來
JS30
[ Alex 宅幹嘛 ] 👨💻 深入淺出 Javascript30 快速導覽 | Day 15:LocalStorage