首页 > 其他分享 >【React工作记录一百一十二】React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)

【React工作记录一百一十二】React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)

时间:2023-06-18 10:33:44浏览次数:46  
标签:status axios 一百一十二 todolist React import const taskName id

前言

大家好 我是歌谣 最近开始在做关于前端扫盲的一些只是处理 花了一周左右录制了了 一个hook写法的关于todoList的视频 主要用于基础知识的一个使用和处理

目录

# 前端巅峰人才交流群私信我
# 第一节 创建项目  todolist项目
 技术选型 React(Hook)+TS+axios+ant design+json server
 npx create-react-app HookTodoList --template typescript
 hook  16.8之后写法
 Ts 限制数据类型
 axios 请求
 ant design pc组件库
 json server模拟数据
 # 第二节 创建项目 
 前端交流群可以私信我
 微信公众号是前端小歌谣
 想要源码的话也乐意关注我
 评论区给邮箱发源码
 npx create-react-app todolist --template typescript
 package.json 配置文件
 # 第三节 项目目录和页面修改
 清除多余样式 修改输出为hello world
 # 第四节 增加ant design库
 npm install antd 
 渲染一个table
 # 第五节 Json server模拟数据请求
Json server模拟数据请求
npm install -g json-server
json-server --watch db.json --port 5000
# 第六节 封装axios请求
npm install axios
# 第七节 请求接口调用
# 第八节 问题解决和列表渲染
# 第九节 简单定义ts数据类型
# 第十节 增加一个新增页面(样式绘制)
# 第十一节 增加一个新增页面(样式绘制)优化
# 第十二节 解决问题并完善新增页面
# 第十三节 状态修改
# 第十四节 任务删除
# 第十五节 课程的回顾
详情页  选项卡方式 增删改查

Json server模拟数据格式

{
  "hookList": [
    {
      "taskName": "写诗",
      "status": "1",
      "id": 5
    },
    {
      "taskName": "写诗",
      "status": "0",
      "id": 6
    },
    {
      "taskName": "作曲",
      "status": "0",
      "id": 7
    },
    {
      "taskName": "唱歌",
      "status": "0",
      "id": 8
    },
    {
      "taskName": "跳舞",
      "status": "0",
      "id": 9
    }
  ],

list列表

import { Button, Space, Table, Tag } from 'antd';

import type { ColumnsType } from 'antd/es/table';
import React, { useEffect, useState } from 'react';
import { getHookList } from '../service/codeing';
import TodoAdd from './TodoAdd';
import axios from 'axios';
interface DataType {
    id:number,
    taskName:string,
    status:boolean
}
interface IHookList{
    id:number,
    taskName:string,
    status:boolean
}
const TodoList: React.FC = () => {
    const columns: ColumnsType<DataType> = [
        {
            title: 'id',
            dataIndex: 'id',
            key: 'id',
            render: text => <a>{text}</a>,
        },
        {
            title: '任务名称',
            dataIndex: 'taskName',
            key: 'taskName',
        },
        {
            title: '任务状态',
            dataIndex: 'status',
            key: 'status',
            render: text => <a>{text==true?"已完成":"未完成"}</a>,
        },
    
        {
            title: '操作',
            key: 'action',
            render: (_, record) => (
                <Space size="middle">
                    <a onClick={()=>handleStatus(record,"0")}>修改为未完成</a>
                    <a onClick={()=>handleStatus(record,"1")}>修改为已完成</a>
                    <a onClick={()=>handleDelete(record)}>删除</a>
                </Space>
            ),
        },
    ];
    const handleDelete=(record:any)=>{
        axios.delete(`http://localhost:5000/hookList/${record.id}`, {
            
        }).then(res => {
           
           initMenuList()
        })
    }
    const handleStatus=(record:any,data:any)=>{
        axios.patch(`http://localhost:5000/hookList/${record.id}`, {
            status:data
        }).then(res => {
           console.log(res)
           initMenuList()
        })
        
    }
    const [visable,setVisable]=useState<boolean>(false)
    const handleClick=()=>{
       setVisable(true)
    }
    useEffect(() => {
        initMenuList();
    }, []);
    const [data,setData]=useState<Array<IHookList>>()
    const initMenuList = async () => {
        // 想加入前端交流群可以私信我
        const response = await getHookList({  });
        setData(response.data)
    };
    const onCancle=()=>{
        setVisable(false)
     
    }
    const onConfirm=()=>{
        initMenuList()
        setVisable(false)
    }
    return (
    <>
    <Button type='primary' onClick={handleClick}>新增任务</Button>
    <Table columns={columns} dataSource={data} />
       <TodoAdd visable={visable} onConfirm={onConfirm} onCancle={onCancle}></TodoAdd>
    </>)
        
}
export default TodoList;

ListAdd页面

import { Space, Table, Tag, Form, Input, Modal } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import React, { useEffect, useState } from 'react';
import { getHookList } from '../service/codeing';
import axios from 'axios';
import { useForm } from 'antd/es/form/Form';
interface DataType {
    id: number,
    taskName: string,
    status: boolean
}
interface IHookList {
    id: number,
    taskName: string,
    status: boolean
}
const columns: ColumnsType<DataType> = [
    {
        title: 'id',
        dataIndex: 'id',
        key: 'id',
        render: text => <a>{text}</a>,
    },
    {
        title: '任务名称',
        dataIndex: 'taskName',
        key: 'taskName',
    },
    {
        title: '任务状态',
        dataIndex: 'status',
        key: 'status',
        render: text => <a>{text == true ? "已完成" : "未完成"}</a>,
    },

    {
        title: '操作',
        key: 'action',
        render: (_, record) => (
            <Space size="middle">
                <a>状态修改</a>
            </Space>
        ),
    },
];

const TodoAdd: React.FC<any> = (props: any) => {
    const { visable } = props
    const [form] = useForm()
    useEffect(() => {
        initMenuList();
    }, []);
    const [data, setData] = useState<Array<IHookList>>()
    const initMenuList = async () => {
        // 想加入前端交流群可以私信我

        const response = await getHookList({});
        setData(response.data)

    };
    const handleOK = () => {
        axios.post(`http://localhost:5000/hookList`, {
            taskName: form.getFieldValue("name"),
            status:"0"
        }).then(res => {
           
            props.onConfirm();
        })
       
    }
    const handleCancle = () => {
        props.onCancle()
    }
    return (
        <Modal title="新增任务" open={visable} onOk={handleOK} onCancel={handleCancle}>
            <Form form={form}>
                <Form.Item label="任务名称" name="name">
                    <Input placeholder='请输入任务名称'></Input>
                </Form.Item>
            </Form>
        </Modal>

    )

}

export default TodoAdd;

axios封装部分

import axios from "axios";
const instance=axios.create({
    baseURL:"http://127.0.0.1:5000",
    timeout:60000
})
export function get(url,data={}){
    return new Promise((resolve,reject)=>{
        instance.get(url,{
            params:data
        }).then((response)=>{
            resolve(response)
        }).catch((err)=>{
            reject(err)
        })
    })
}
export function post(url,data={}){
    return new Promise((resolve,reject)=>{
       instance.post(url,data).then(
        (response)=>{
            resolve(response.data)
        },
        (err)=>{
            reject(err)
        }
       )
    })
}

结果展示

【React工作记录一百一十二】React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)_ios

【React工作记录一百一十二】React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)_List_02

源码和视频地址

视频地址

https://space.bilibili.com/474556051/channel/collectiondetail?sid=960841

源码地址

https://gitee.com/geyaoisgeyao/hook-todolist.git

标签:status,axios,一百一十二,todolist,React,import,const,taskName,id
From: https://blog.51cto.com/u_14476028/6507559

相关文章

  • 【React工作记录一百一十三】ant design table项目中遇到的数据处理实例
    前言大家好我是歌谣今天需要进行一个数据处理的问题原始数据到目标数据的处理过程数据处理的过程就是逻辑推理的过程类似一道数学题的解法原始数据格式(本次以两组数据格式为例Rawdata)[{"id":1047,"name":"README.md","manufacture_id":1......
  • React环境搭建
    安装node.js全局安装create-react-appnpminstall-gcreate-react-app检查create-react-app版本create-react-app-V创建一个项目create-react-appmyapp临时安装create-react-app使用最新的create-react-app版本去创建项目npxcreate-react-appmyapp启动项目c......
  • react经典面试题解析--持续更新--day01
    一、类组件和函数组件的区别(面试常考)简单理解(所有同学都要掌握)1、类组件有生命周期,函数组件没有2、类组件需要继承Class,函数组件不需要3、类组件可以获取实例化的this,并且基于this做各种操作,函数组件不行4、类组件内部可以定义并维护state,函数组件都称为无状态了,那肯定......
  • Reactive Extensions 响应式扩展 用于事件驱动编程的库,具有可组合的声明性模型
    响应式扩展这个存储库包含四个库,它们在概念上是相关的,因为它们都与LINQoverofthings序列有关:ReactiveExtensionsfor.NET又名Rx.NET或Rx( System.Reactive ):一个用于事件驱动编程的库,具有可组合的声明性模型AsyncRx.NET(实验性预览)(System.Reactive.Async):Rx的实验......
  • 【React工作记录一百零八】前端小知识点扫盲笔记记录9
    前言我是歌谣放弃很容易但是坚持一定很酷微信公众号关注前端小歌谣带你进入前端巅峰交流群今天继续对前端知识的小结如何截取字符串<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge">......
  • 【React工作记录一百零九】前端小知识点扫盲笔记记录10
    前言我是歌谣放弃很容易但是坚持一定很酷微信公众号关注前端小歌谣带你进入前端巅峰交流群今天继续对前端知识的小结对称数<!DOCTYPEhtml><htmllang="en"> <head> <metacharset="UTF-8"/> <metahttp-equiv="X-UA-Compatible"content="IE=edge"/>......
  • 利用react-resizable实现antd表格头宽度可以拖拽调节
    1.创建ResizeAbleTable文件夹1.1index.jsimport{Table}from"antd4"importReact,{useEffect,useState}from"react"import{Resizable}from"react-resizable"import"./index.less"/***可伸缩列*@paramprops*@retur......
  • React图片上传组件设计
    本文讨论React图片上传组件的正确设计思路。程序员对React图片上传组件主要有如下几点关心:界面方面:自动提供图片预览功能,能删除错传的图,传图数量限制等。编程方面:上传时机是否可以外部编程控制,如果是(1)即拍即传,则不能控制也无妨,如果是(2)批量上传,则外部需要有能力控制上传时机;每一张图......
  • 初学者的React全家桶完整实例
    概述该项目还有些功能在开发过程中,如果您有什么需求,欢迎您与我联系。我希望能够通过这个项目对React初学者,或者Babel/webpack初学者都有一定的帮助。我在此再强调一下,在我写的这些文章末尾都附加了很多参考文献,而这些参考文献的作用对我的帮助真的很大,在此表示感谢!!!!!......
  • 【React工作记录一百零五】springBoot+vue实现登录操作和JWT验证
    前言大家好我是歌谣今天继续进行前后端的一个学习目前进入的是javaweb部分今天来聊聊登录部分和JWT验证部分的书写用户登录loginControllerpackagecom.itheima.controller;importcom.itheima.pojo.Emp;importcom.itheima.pojo.Result;importcom.itheima.service.EmpSer......