Vite+React+TypeScript手撸TodoList的项目实践

下面是针对“Vite+React+TypeScript手撸TodoList的项目实践”的详细攻略。

1.前置技能要求

在进行Vite+React+TypeScript手撸TodoList的项目实践前,需要掌握以下几个技能:

  • 熟悉TypeScript语言和基本语法;
  • 熟悉React框架及其常用的Api;
  • 了解Vite构建工具的使用和基本原理。

2.环境搭建与初始化

首先,需要安装Node.js环境和yarn包管理器。之后在终端中执行以下命令初始化项目:

yarn create vite-app vite-react-todolist --template react-ts

这个命令将创建一个带有React和TypeScript的Vite项目,并将其命名为“vite-react-todolist”。

3.项目结构与代码编写

在初始化完成后,我们可以在项目的根目录下看到如下的文件结构:

├── node_modules
├── public
│   ├── favicon.svg
│   └── index.html
├── src
│   ├── App.css
│   ├── App.tsx
│   ├── index.css
│   ├── index.tsx
│   ├── react-app-env.d.ts
│   ├── setupTests.ts
│   └── components
│       ├── TodoForm.tsx
│       ├── TodoList.tsx
│       └── TodoItem.tsx
├── .editorconfig
├── .gitignore
├── package.json
├── README.md
├── tsconfig.json
├── vite.config.ts
└── yarn.lock

其中,src目录是项目的主要代码目录,我们需要在其中编写组件、样式和逻辑。

3.1 创建TodoList组件

我们打算创建一个简单的TodoList组件,它由两个子组件TodoForm和TodoList组成。

首先,我们可以在src/components目录下创建一个名为TodoForm.tsx的文件,并在其中添加如下代码:

import React, { useState } from 'react';

interface Props {
  onSubmit: (text: string) => void;
}

const TodoForm: React.FC<Props> = ({ onSubmit }) => {
  const [text, setText] = useState('');

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    if (!text) return;
    onSubmit(text);
    setText('');
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" value={text} onChange={e => setText(e.target.value)} placeholder="Add a new todo" />
      <button type="submit">Add</button>
    </form>
  )
}

export default TodoForm;

在上面的代码中,我们首先定义了一个接口Props,它包含一个名为onSubmit的函数属性。该函数的作用是将TodoItem添加到TodoList中。

接着,我们定义了一个函数组件TodoForm,并将Props作为参数传入该组件。在函数体内,我们使用React的useState钩子来定义一个状态变量text,该变量的初始值为空字符串。

在表单的提交事件中,我们首先阻止默认行为,然后判断text是否为空。如果text为空,则函数直接返回。否则,我们通过onSubmit函数将text作为参数加入到TodoList中,并将text的值重置为空字符串。

最后,我们返回一个包含输入框和添加按钮的form表单,当表单提交时调用handleSubmit函数。

接下来,我们在src/components目录下创建另外两个文件TodoList.tsx和TodoItem.tsx,并在其中编写相应的代码:

// src/components/TodoList.tsx
import React, { useState } from 'react';
import TodoItem from './TodoItem';
import TodoForm from './TodoForm';

interface Todo {
  text: string;
  complete: boolean;
}

const TodoList: React.FC = () => {
  const [todos, setTodos] = useState<Todo[]>([]);

  const toggleTodo = (index: number) => {
    const newTodos = [...todos];
    newTodos[index].complete = !newTodos[index].complete;
    setTodos(newTodos);
  };

  const addTodo = (text: string) => {
    const newTodos = [...todos, { text, complete: false }];
    setTodos(newTodos);
  };

  const removeTodo = (index: number) => {
    const newTodos = [...todos];
    newTodos.splice(index, 1);
    setTodos(newTodos);
  };

  return (
    <div>
      <TodoForm onSubmit={addTodo} />
      {todos.map((todo, index) => (
        <TodoItem key={index} todo={todo} index={index} toggleTodo={toggleTodo} removeTodo={removeTodo} />
      ))}
    </div>
  );
};

export default TodoList;

// src/components/TodoItem.tsx
import React from 'react';

interface Props {
  todo: {
    text: string;
    complete: boolean;
  };
  index: number;
  toggleTodo: (index: number) => void;
  removeTodo: (index: number) => void;
}

const TodoItem: React.FC<Props> = ({ todo, index, toggleTodo, removeTodo }) => {
  const handleToggle = () => {
    toggleTodo(index);
  };
  const handleRemove = () => {
    removeTodo(index);
  };

  return (
    <div>
      <span style={{ textDecoration: todo.complete ? 'line-through' : '' }} onClick={handleToggle}>
        {todo.text}
      </span>
      <button onClick={handleRemove}>x</button>
    </div>
  );
};

export default TodoItem;

在上面的代码中,我们定义了一个TodoList组件和一个TodoItem组件,它们分别用于展示整个TodoList和单独的TodoItem。

在TodoList组件中,我们使用useState钩子来定义了一个状态变量todos,初始值为空数组。该状态变量用于存储TodoItem的列表。我们同时定义了三个函数toggleTodo、addTodo和removeTodo,它们分别用于修改状态变量todos中的数据,分别代表切换TodoItem的完成状态、添加新的TodoItem和删除指定的TodoItem。

在TodoList组件的返回值中,我们首先渲染出一个TodoForm组件,并将addTodo函数作为参数传给它。接着,我们遍历todos,对于每一个元素,我们都渲染出一个TodoItem组件,并将相应的参数传给它。

在TodoItem组件中,我们定义了一个Props接口,用于接收TodoList组件中通过props传递的参数。该组件提供了两个事件处理函数handleToggle和handleRemove,分别用于切换TodoItem的完成状态和删除TodoItem。同时,我们还渲染出了一个由TodoItem的text属性组成的span元素,以及一个删除按钮。

4.运行和打包

在完成代码编写后,我们可以通过执行以下命令运行该项目:

yarn dev

该命令将启动Vite构建工具,并打开默认的浏览器窗口,将我们的应用程序呈现出来。

如果我们想要将整个项目打包为生产环境所需的文件,则可以执行以下命令:

yarn build

该命令将生成一个dist目录,其中包含了打包后的文件。

5.示例说明

在上述示例中,我们通过创建TodoList、TodoForm和TodoItem三个组件,实现了一个简单的待办事项应用程序。其中,TodoForm组件负责输入新的待办事项,TodoItem组件负责展示和操作单个的待办事项,而TodoList组件则包含了多个TodoItem,并提供了添加、删除、切换完成状态的功能。

在实现过程中,我们使用了React框架的基本Api,以及TypeScript语言和JSX语法。同时,我们使用Vite构建工具,进行了应用程序的初始化、运行和打包等操作,完整实践了Vite+React+TypeScript手撸TodoList的项目。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vite+React+TypeScript手撸TodoList的项目实践 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • CSS3网格的三个新特性详解

    下面是“CSS3网格的三个新特性详解”的完整攻略: CSS3网格的三个新特性详解 1. 网格容器的定义 在 CSS3 中,我们可以通过定义网格容器来使用网格。定义网格容器的方式是将元素的 display 属性设置为 grid 或 inline-grid。 .container { display: grid; /* 其他样式属性 */ } 或者是: .con…

    css 2023年6月9日
    00
  • KindEditor 4.x 在线编辑器常用方法小结

    KindEditor 4.x 在线编辑器常用方法小结 KindEditor是一款功能强大的基于Web的富文本编辑器,可以方便地实现各种富文本编辑功能,广泛应用于日常的表单编辑和网页建设等领域。本文主要介绍KindEditor 4.x在线编辑器的常用方法,包括文本编辑、图像处理、文件上传等常用功能,同时提供示例说明。 一、文本编辑 在KindEditor中,文…

    css 2023年6月9日
    00
  • DIV始终浮动在页面底部

    要实现“DIV始终浮动在页面底部”,有以下几种方法: 1. 使用绝对定位 通过将DIV的position属性设为absolute,并将bottom属性设为0,可以将DIV固定在页面底部。示例代码如下: #bottom-div { position: absolute; bottom: 0; width: 100%; height: 50px; /* 注意要设…

    css 2023年6月10日
    00
  • div css制作网页实战笔记心得

    下面是详细的“div css制作网页实战笔记心得”的完整攻略: 1.什么是div和css? 1.1 div是什么? div是HTML中一个标签,它代表一个没有具体含义的元素容器,可以用来把网页内容划分成不同的块。我们可以在CSS中为它定义样式,使它的外观和行为与其它元素不同。 1.2 CSS是什么? CSS(Cascading Style Sheets)翻译…

    css 2023年6月10日
    00
  • CSS3实现一根心爱的二踢脚示例代码

    我将为您详细讲解如何实现“CSS3实现一根心爱的二踢脚示例代码”。 什么是“一根心爱的二踢脚示例代码”? 在这一段中,我们需要先明确一下什么是“一根心爱的二踢脚示例代码”。这个示例代码指的是一种前端界比较流行的效果:当用户点击按钮时,页面会有翻转效果,将页面上方的内容翻转成另一张图片。 如何使用CSS3实现“一根心爱的二踢脚示例代码”? 接下来,我们具体介绍…

    css 2023年6月10日
    00
  • JS库之Highlight.js的用法详解

    JS库之Highlight.js的用法详解 Highlight.js 是一个轻量级、易于使用且支持语法高亮的 JavaScript 库。它适用于各种开发语言,并且内置大量的代码样式和主题,用户可以自定义自己需要的样式。 安装 安装 Highlight.js 非常简单,可以通过 CDN 或者直接下载源代码来引用。可以在 HTML 文件中直接引用 Highlig…

    css 2023年6月9日
    00
  • css position: absolute、relative详解

    CSS Position: Absolute和Relative详解 在CSS中position属性用于定义元素的定位类型。在position属性中有四个值:static(默认)、relative、absolute 和 fixed。 本篇攻略将详细介绍position属性中的absolute和relative,帮助您更好地理解和应用这两个定位类型。 Relat…

    css 2023年6月9日
    00
  • 原生javascript实现简单的datagrid数据表格

    请看下面的攻略: 一、什么是DataGrid数据表格 DataGrid数据表格是Web应用程序中常见的一种显示和编辑数据的方式。它通常由多个数据列和若干行组成,每一个单元格可以编辑文本、选项、日期等不同类型的数据。 二、实现DataGrid数据表格的基本思路 我们可以借助HTML的<table>标签来实现数据表格的显示和基本布局,然后用原生Jav…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部