返回

从零到一搭建任务管理系统(六)-- 看板页面展示

前端

引言

在前几篇文章中,我们已经构建了一个基本的单页面任务管理系统,涵盖了添加任务、编辑任务、删除任务以及对任务状态进行更改等功能。接下来,我们将继续构建看板页面,以使任务管理系统更加直观和高效。

看板页面布局

看板页面主要分为两部分:任务列表和任务详情。

任务列表用于展示所有任务,并根据任务状态进行分类。任务详情用于展示选定任务的详细信息,并允许用户编辑任务。

处理后端返回的数据

看板页面需要从后端获取任务数据。获取数据的方式有很多种,我们这里使用axios库来发送HTTP请求。

import axios from 'axios';

const getTasks = async () => {
  const response = await axios.get('/api/tasks');
  return response.data;
};

渲染数据

获取数据后,我们需要将其渲染到界面上。

任务列表的渲染相对简单,只需要根据任务状态将任务分组,然后逐个渲染即可。

const TaskList = () => {
  const tasks = getTasks();

  return (
    <div className="task-list">
      {tasks.map((task) => (
        <TaskItem key={task.id} task={task} />
      ))}
    </div>
  );
};

任务详情的渲染稍微复杂一些,我们需要根据选定的任务动态地更新界面。

const TaskDetails = () => {
  const [task, setTask] = useState(null);

  useEffect(() => {
    const taskId = window.location.pathname.split('/').pop();
    const task = getTaskById(taskId);
    setTask(task);
  }, []);

  return (
    <div className="task-details">
      {task && (
        <>
          <h1>{task.title}</h1>
          <p>{task.description}</p>
          <div className="task-actions">
            <button onClick={() => editTask(task.id)}>编辑</button>
            <button onClick={() => deleteTask(task.id)}>删除</button>
          </div>
        </>
      )}
    </div>
  );
};

使用useQuery优化性能

useQuery是一个React Hook,它可以帮助我们优化数据请求的性能。useQuery允许我们声明式地定义数据请求,并缓存请求的结果。

import { useQuery } from 'react-query';

const TaskList = () => {
  const tasks = useQuery('tasks', getTasks);

  return (
    <div className="task-list">
      {tasks.data.map((task) => (
        <TaskItem key={task.id} task={task} />
      ))}
    </div>
  );
};

useQuery会自动缓存请求的结果,当组件再次渲染时,它会从缓存中获取数据,而不会再次发送HTTP请求。这可以大大提高性能。

结语

在本文中,我们重点介绍了看板页面的布局,探讨了如何处理后端返回的数据,并将其渲染到界面上。此外,我们探讨了如何利用useQuery来优化任务管理系统的性能。