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() 刪除對應的資料,最後再存一次檔,並重新渲染餐點列表一次。