iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
SideProject30

30天製作與眾不同的TodoList吧!系列 第 22

添加修改功能 - 修改todo

  • 分享至 

  • xImage
  •  

上一篇進行到透過 useModal 建立彈窗 & 按鍵點擊的時候顯示彈窗。
接下來我們需要在彈窗顯示的時候,帶入所點擊的 todo 資料

const handleEditBtnClick = (item) => {
  setModalTodo((prev) => item);
  newTodo.current = { ...item };
  show();
};

我們先建立一個用於儲存顯示於 modal 中資料的 state,並且在顯示彈窗前將目標 todo 放進這個 state 中,在彈窗出現的時候顯示資料。

接下來我們需要儲存 user 再輸入欄位做的變更,這邊我們不使用 useState,因為 useState 會在每次觸發的時候產生 re-render,我們不希望再儲存資料的時候畫面一直 re-render 導致使用者體驗下降,所以這邊可以使用 useRef 來儲存這個資料,useRef 可以讓我們保存的 value 在整個生命週期中保持不變。

const newTodo = useRef({});

這邊我們使用 useRef 保存一個物件,後續我們需要變更這個 ref 的時候就需要使用

newTodo.current = { ...todo };

使用以上的方式可以變更 ref 中的 value。
現在將這個方法綁定至 onChange 中

onChange={(e) => {
    e.preventDefault();
    newTodo.current.title = e.target.value;
}}

現在 user 在使用彈窗的同時,我們就可以在背後保存 user 所做的變更。
最後,我們需要在 user 送出保存的時候更新 todo & 關閉視窗,並重置modalTodo & 保存在ref中的資料。

const updateTodoItem = (item) => {
  dispatch(updateTodo(item));
  newTodo.current = {};
  setModalTodo({});
  hide();
};

上一篇
添加修改功能 - 建立彈窗
下一篇
登入頁面
系列文
30天製作與眾不同的TodoList吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言