上一篇文章我們定義好資料的儲存結構:
{
title: '專案標題',
boards: {
ids: ['board1', 'board2'],
byId: {
board1: {
name: '看板一',
cardIds: ['card1', 'card2']
},
board2: {
name: '看板二',
cardIds: ['card3', 'card4']
}
}
},
cards: {
byId: {
card1: '卡片一',
card2: '卡片二',
card3: '卡片三',
card4: '卡片四',
}
}
}
接著要來定義各種更新資料的 action。
使用 useReducer 會回傳一個 dispatch 函式,呼叫 dispatch 函式可以傳入一個 action 物件,這個物件會有一個 type 屬性,也就是更新資料的類型,用來決定如何更新資料,所以 action 大致上會長這樣:
{
type: '更新資料的類型',
payload: {
// 更新時需要的額外資料
}
}
先來看看有哪些會更新到資料的網頁功能:
修改標題需要新標題的文字,所以 action 會是:
{
type: 'CHANGE_TITLE',
payload: {
title: '新標題'
}
}
新增看板一樣需要新看板的名稱,action:
{
type: 'ADD_BOARD',
payload: {
boardName: '新看板名稱'
}
}
修改看板名稱除了需要新的看板名稱之外,還要知道被修改的看板 id:
{
type: 'CHANGE_BOARD_NAME',
payload: {
boardName: '新看板名稱',
boardId: 'board1'
}
}
刪除看板只需要知道被刪除的看板 id:
{
type: 'REMOVE_BOARD',
payload: {
boardId: 'board1'
}
}
移動看板則是要知道被移動的看板 id,還有移到哪一個位置(index):
{
type: 'ADD_CARD',
payload: {
draggingBoardId: 'board1',
targetBoardIndex: 2
}
}
新增卡片和新增看板一樣需要新卡片的內容,而且還要知道新增卡片到哪一個看板的 id:
{
type: 'ADD_CARD',
payload: {
cardValue: '卡片1'
boardId: 'board1'
}
}
修改卡片內容類似修改看板名稱,除了需要新的卡片內容之外,還要知道被修改的卡片 id:
{
type: 'CHANGE_CARD_NAME',
payload: {
cardValue: '新卡片內容',
cardId: 'card1'
}
}
刪除卡片只需要知道被刪除的卡片 id:
{
type: 'REMOVE_CARD',
payload: {
draggingCardId: 'card1'
}
}
移動卡片要知道被移動的卡片 id,還有移到哪一個看板中的哪一個位置:
{
type: 'MOVE_CARD',
payload: {
draggingCardId: 'card1',
targetBoardId: 3,
targetCardIndex: 0
}
}
定義資料更新的邏輯 - reducer