• 【前端】简易化看板


    【前端】简易化看板

    在这里插入图片描述
    在这里插入图片描述

    项目简介

    看板分为三个模块,分别是待办,正在做,已做完三个部分。每个事件采取"卡片"式设计,支持任务间拖拽,删除等操作。

    代码

    import React, { useState } from 'react';
    import { Card, CardContent } from '@/components/ui/card';
    import { Input } from '@/components/ui/input';
    import { Button } from '@/components/ui/button';
    
    const KanbanBoard = () => {
      const [tasks, setTasks] = useState({
        todo: [
          { id: '1', title: '设计新的登录页面' },
          { id: '2', title: '优化数据库查询' }
        ],
        doing: [
          { id: '3', title: '实现用户认证功能' },
          { id: '4', title: '编写单元测试' }
        ],
        done: [
          { id: '5', title: '更新API文档' },
          { id: '6', title: '修复登录bug' }
        ]
      });
    
      const [newTasks, setNewTasks] = useState({
        todo: '',
        doing: '',
        done: ''
      });
    
      const onDragStart = (e, id, sourceColumn) => {
        e.dataTransfer.setData('text/plain', JSON.stringify({ id, sourceColumn }));
      };
    
      const onDragOver = (e) => {
        e.preventDefault();
      };
    
      const onDrop = (e, targetColumn) => {
        e.preventDefault();
        const { id, sourceColumn } = JSON.parse(e.dataTransfer.getData('text'));
        if (sourceColumn === targetColumn) return;
    
        const updatedTasks = { ...tasks };
        const taskToMove = updatedTasks[sourceColumn].find(task => task.id === id);
        updatedTasks[sourceColumn] = updatedTasks[sourceColumn].filter(task => task.id !== id);
        updatedTasks[targetColumn].push(taskToMove);
        setTasks(updatedTasks);
      };
    
      const addTask = (column) => {
        if (newTasks[column].trim()) {
          const updatedTasks = { ...tasks };
          updatedTasks[column] = [...tasks[column], { 
            id: Date.now().toString(), 
            title: newTasks[column]
          }];
          setTasks(updatedTasks);
          setNewTasks({...newTasks, [column]: ''});
        }
      };
    
      const deleteTask = (columnId, taskId) => {
        const updatedTasks = { ...tasks };
        updatedTasks[columnId] = tasks[columnId].filter(task => task.id !== taskId);
        setTasks(updatedTasks);
      };
    
      const renderTask = (task, columnId) => (
         onDragStart(e, task.id, columnId)}
          className="mb-2 shadow-sm hover:shadow-md transition-shadow duration-200"
        >
          <CardContent className="p-3 flex justify-between items-center">
            <p className="text-sm font-medium text-gray-700 truncate flex-grow mr-2">{task.title}p>
            

    效果图

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Java中根据中文汉字获取首字母
    web前端期末大作业 基于HTML+CSS+JavaScript程序员个人博客模板(web学生作业源码)
    Flow Problem(最大流模板)
    【电商数仓】数仓搭建之DIM维度层(商品、优惠券、活动、地区、时间维度表)
    sm2多端加密解密,java,js,android,ios实战
    JOSEF 同步检查继电器 JT-1 额定电压100V 柜内固定安装,板前接线
    什么是代码签名证书?
    JavaScript(Array,String,window对象)入门
    docker安装mysql8和mysql5.7
    快速学会git版本管理——创建分支和合并分支
  • 原文地址:https://blog.csdn.net/m0_74120525/article/details/140052375