15 - LocalStorage
筆記
實作一個基於 localStorage 儲存的點菜單。
作法
html
1 | <div class="wrapper"> |
透過一個 ul
將 li
項目包起來,一個 form
來處理表單,使用 required
屬性來限制使用者一定要輸入內容才能提交。
javascript
初始設定,取 DOM,設定餐點清單陣列
1 | const addItems = document.querySelector(".add-items"); |
這邊 items
為所新增的菜,初始為空陣列,待會會用 localStorage
儲存,由於 localStorage
僅能儲存字串,所以這裡必須將 JSON.stringify
過的資料解析回來。
新增餐點與儲存
1 | function saveItemsToLocalStorage(toSave) { |
submit
發生時,將 input 輸入框的值包成一個 item
物件,裡面用 done
的 key 值表示此項目完成與否,之後這個 item
物件就可 push 進一開始定義的 items
陣列。
透過 localstorage.setItem
可以將 items
存入,這邊用一個 function 包起來比較方便不用重寫 JSON.stringify。
最後使用 submit
事件的 reset()
method 來清空 input 框。
餐點資料輸出呈現
1 | // 將餐點輸出成HTML結構, plates初始為空陣列 |
populateList
傳入餐點陣列與需要渲染的 element
,透過 map()
來迭代操作 items
,而map
的回調函式第二個帶入的參數為迴圈的 index
,剛好可以用來為每個 element 綁定個別的 id
,之後比較好抓取操作。
這邊因為使用 template string,可以很方便使用三元判斷式來做是否綁定 checked
屬性。
完成餐點與取消完成
1 | function toggleDone(e) { |
如果使用迴圈個別監聽每個 li
,會造成後來新增的餐點監聽不到,這邊監聽整個 ul
就可以監聽所有底下的元素。
透過 event.target 來區別監聽到的元素,如果點擊到 input checkbox,利用 渲染時綁定的 data-index
選取 items
陣列對應的資料, 將 done
反值。
監聽到刪除按鈕就透過 splice()
刪除對應的資料,最後再存一次檔,並重新渲染餐點列表一次。