iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
SideProject30

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

修正各種method

  • 分享至 

  • xImage
  •  

當我們引入 redux 之後,我們之前所有邏輯的部分都需要進行重構,這將會大幅減少 function & State 這兩個部分,因為我們原本的操作基本上都是接收到資料後=>存進 state 中,接下來對這個 state 進行各種操作。

但是當我們引入 redux 之後,我們的所有行為都可以透過 store 取得目前最新的資料,並調用 store 中儲存的 method 對 store 中的 state 進行各種操作。

首先先看到我們的父層元件,原先我們抓取 api 後將結果儲存在 state 中,現在我們可以來修改一下段 code。
//修改前

useEffect(() => {
    getTodoList()
        .then(res => {
            const definedTodo = defineTodo(res.data.todoList);
            setOriList(definedTodo);
            arrSort(definedTodo);
        })
        .catch(err => console.log(err));
}, []);

//修改後

useEffect(() => {
    getTodoList()
        .then(res => {
            const definedTodo = defineTodo(res.data.todoList);
            dispatch(updateTodoArr(definedTodo));
        })
        .catch(err => console.log(err));
}, []);

可以看到,原先我們取得資料後,經過 definedTodo 進行資料整理後,將結果透過 useState 存在 state 中,但現在我們透過從 store 中獲得的 updateTodoArr 這個方法,將我們獲得的資料更新至 store 中。
接下來我們要使用資料的時候都可以透過 store 中的資料進行處哩,而不再需要建立一個 state 儲存資料。

    // const [todoList, setTodoList] = useState([]);
    // const [doneTodo, setDoneTodo] = useState([]);
    // console.log("OriData", OriData);

這代表以上這些 state 我們都可以刪掉了,那接下來我們要如何獲得已完成&未完成的資料呢。
最直觀的來說,我們可以

const completedTodos = useSelector(state=>state.isDone)

這樣確實沒錯,我們可以得到"目前"store 中已完成&未完成的資料,但是並不會因為 store 中的資料更新,這兩個參數所儲存的 state 也跟著變化,所以我們需要透過createSelector這個來自於 reselect 中的方式,建立一個 Memoized Selector。
他會在 store 中的 state 產生變化的時候重新計算需要的 state。

首先第一個參數會是一個 input array,第二個參數為處裡資料的 function。

若是 input array 中的資料沒有變化,則不觸發後面的資料處理 function。


上一篇
為我們的todo引入Redux-2
下一篇
修正各種method-2、custom hook
系列文
30天製作與眾不同的TodoList吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言