天天看點

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

大家好,我是小丞同學,一名大二的前端愛好者

這個系列文章是實戰 jira 任務管理系統的一個學習總結

非常感謝你的閱讀,不對的地方歡迎指正

願你忠于自己,熱愛生活

在上一篇文章中,我們處理了看闆頁面的布局,以及它的邏輯功能,基礎功能已經基本實作,項目、任務的增删改查,搜尋功能的實作,在這一篇我們就對任務組頁面進行最後的布局,和功能實作,寫到這裡,大部分的功能 hook 已經實作了,對于增删改查我們也已經非常了解了。

知識點搶先看

增删任務組功能

路由跳轉

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

一、頁面布局

這部分已經寫過好幾次了,速戰速決

1. 布局的簡單介紹

這裡我們采用的是 antd 中的 List 元件,頂部左右兩側采用的是自己封裝的 Row 元件,讓它們排列在兩側,連結跳轉部分采用的 Link 元件,通過周遊資料的方式實作渲染

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

2. 資料的擷取

在這裡我們需要擷取到我們的任務資料,在這裡我們需要寫一個擷取資料的 custom hook: useEpics ,和其他擷取資料的 hook 一樣

我們接收一個 param 資料對象,通過 useQuery 發送請求

再複習一下,它的第二個參數是一個異步事件,第一個參數是元組,當依賴項 param 發生改變時,會重新發送請求,更新緩存中的 epics 資料内容

export const useEpics = (param?: Partial<Epic>) => {
    const client = useHttp()
    return useQuery<Epic[]>(['epics', param], () => client('epics', { data: param }))
}      

我們在 epic/index.ts 中使用 ,擷取任務組資料 epics 以及用于跳轉連結的 tasks 資料

// 關于任務的資訊
const { data: epics } = useEpics(useEpicSearchParams())
// 擷取任務組中的任務清單
const { data: tasks } = useTasks({ projectId: currentProject?.id })      

這樣我們就實作了資料的擷取

接下來我們來看看如何在元件中使用這兩個資料的

對于 epics 它作為我們需要渲染的主内容,需要通過 List.Item 進行渲染

在 List 元件中,我們可以傳入我們的資料源 dataSource ,通過 renderItem 屬性,對 epics 資料進行周遊

<List dataSource={epics} renderItem={epic => <List.Item></List.Item> />      

這樣我們的 epic 就是每一個任務資料通過對象取值方式就能擷取需要的資料

在這裡主要提一下對于時間的渲染

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

後端給我們傳回的資料格式是時間戳,我們需要将她轉變成這種格式便于閱讀

在這裡我們采用了一個 dayjs 的庫,通過 format 方法确定了她輸出的時間格式 YYYY-MM-DD ,隻需要傳入它的時間即可

<div>開始時間:{dayjs(epic.start).format("YYYY-MM-DD")}</div>
<div>結束時間:{dayjs(epic.end).format("YYYY-MM-DD")}</div>      

二、增删任務組功能

首先我們先來實作删除任務組的功能

1. 删除任務組

實作思路如下

點選删除按鈕,彈出提示框

确認删除

調用接口删除緩存

代碼實作

當我們點選删除時,我們調用 confirmDeleteEpic 函數,進行删除确認

這個函數封裝的是一個 Modal.config 元件

// 删除時的提示框
const confirmDeleteEpic = (epic: Epic) => {
    Modal.confirm({
        title: `你确定删除項目組${epic.name}嗎?`,
        content: '點選确定删除',
        okText: '确定',
        onOk() {
            // 确認時調用删除
            deleteEpic({ id: epic.id })
        }
    })
}      

當我們在點選确認時,正式調用删除接口 deleteEpic ,傳入我們删除的任務組 id ,即可删除

我們來看看如何實作這個 deleteEpic

首先我們還是需要封裝一個 useDeleteEpic 的 hook 用來處理删除請求,這裡采用 useMutation 來處理,傳入目前的 id ,配置删除的 config 對象

寫到這裡自己也對 useMutation 有了進一步的認識,它可以接收兩個參數,第一個參數我們傳入我們的異步請求,第二個參數來配置 config 如何處理緩存中的資料

// 删除看闆
export const useDeleteEpic = (queryKey: QueryKey) => {
    const client = useHttp()
    return useMutation(
        // 這裡我沒有出現問題,視訊出現了問題
        // 直接(id:number)
        ({ id }: { id: number }) => client(`epics/${id}`, {
            method: "DELETE",
        }),
        useDeleteConfig(queryKey)
    )
}      

這樣我們的删除功能就實作了

2. 添加任務組功能

實作思路

寫一個 create-epic 頁面

寫入新增任務組資訊

送出建立請求

首先我們需要在 epic 檔案夾目錄下建立一個 create-epic 檔案,用來編寫建立任務頁面

這樣做的好處是能夠将複雜部分分離出來,使得主檔案中的代碼量減少,閱讀性更佳

新增任務組頁面,我們同樣采用的是 Drawer 元件來實作

值得注意的是我們必須要添加 forceRender={true} 元件,否則在頁面第一次加載時會報錯

在 Drawer 元件中同樣的我們采用了 Form 元件,當表單送出時自動調用 onFinish 方法,處理添加請求

const onFinish = async (values: any) => {
    // 僅僅傳一個values 不夠,需要傳入 projectid
    await addEpic({ ...values, projectId })
    props.onClose()
}      

在這裡我們采用的時一個 async、await 的組合,等待接口傳回結果後我們再關閉視窗,但是由于我們采用了樂觀更新,這裡其實隻要寫入緩存中就會關閉視窗了

同時為了讓 Form 表單在視窗關閉時自動清空,這裡我們采用了 useEffect 來實作,在依賴項中寫入 visible 監聽變化

useEffect(() => {
    form.resetFields()
}, [form, props.visible])      

這樣我們的建立功能也實作了,最後我們再稍微講講任務組 item 中的路由跳轉

三、路由跳轉

當我們點選下面的任務時,需要跳轉到看闆頁面對應任務的編輯視窗,我們來看看效果圖

Hooks + TS 搭建一個任務管理系統(七)-- 任務組頁面實作

其實這隻要我們的路由位址配置好了就沒有問題了

我們來看看如何配置這個跳轉的路由位址

指定到對應的 editingTaskId 頁面,這樣視窗就會彈出來了,這樣是我們采用 url 進行狀态管理的好處

to={`/projects/${currentProject?.id}/kanban?editingTaskId=${task.id}`}      

那麼我們如何将對應的任務綁定到對應的任務組下呢?

這裡我們采用 filter 來實作,當 task 下的 epicId 和 epic 下的 id 一緻時說明是這個任務組下的,我們周遊渲染即可

{
    tasks?.filter(task => task.epicId === epic.id)
        .map(task => <Link
            style={{ marginRight: '20px' }}
            key={task.id}
            // 連結到看闆頁面
            to={`/projects/${currentProject?.id}/kanban?editingTaskId=${task.id}`}>
            {task.name}
        </Link>)
}      

注意:采用 map 是一定要注意 key 唯一噢~

總結

能夠熟練的實作了增删功能

認識到了 url 狀态管理的好處

采用合适的數組的方法可以極好的幫助我們實作功能

繼續閱讀