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日

相关文章

  • javascript高仿热血传奇游戏实现代码

    下面是“javascript高仿热血传奇游戏实现代码”的完整攻略。 简介 热血传奇是一个经典的网游,我们可以通过使用 JavaScript 和 HTML5 技术来实现一个类似的网页游戏。在这个游戏中,我们可以实现玩家角色的创建、地图的绘制、怪物的生成和战斗系统等。下面将分几个步骤来实现这个游戏。 步骤 第一步:创建地图和角色 我们可以使用 canvas 元素…

    css 2023年6月10日
    00
  • 详解Vue中过度动画效果应用

    详解Vue中过渡动画效果应用攻略 Vue.js提供了内置的过渡动画特性,可以通过简单的标准HTML和CSS样式语法,实现复杂的过渡动画效果。本文将详细介绍Vue中如何应用过渡动画效果。 Vue中过度动画的基本原理 Vue中的过渡动画在真实DOM元素插入或从DOM元素中移除时触发。Vue将插入或移除元素包裹在一个容器元素中,比如<transition&g…

    css 2023年6月11日
    00
  • 使用css的background:url设置背景图方法

    下面是关于“使用css的background:url设置背景图方法”的完整攻略: 1. 准备背景图 首先,你需要准备一张背景图,可以是jpg、png、gif等格式的图片。为了避免图片失真,最好选择高清图片。 2. 使用background:url属性 接下来,在CSS中使用background:url属性来设置背景图。这个属性有多个子属性,如下所示: bac…

    css 2023年6月9日
    00
  • 标记语言——打印样式

    标记语言是一种用于描述文档结构和内容的编程语言,常用于网页设计和排版。其中,打印样式即指对文档进行打印时所需要的样式设定。 在Markdown中,打印样式可以通过CSS(Cascading Style Sheets,层叠样式表)来统一设置文档中的格式。以下是两条示例说明: 在Markdown中使用CSS CSS可以通过在Markdown文件中插入<st…

    css 2023年6月9日
    00
  • asp中去除html中style,javascript,css代码

    针对ASP中去除HTML中style、javascript、css代码的问题,可以采用以下方式: 方法一:正则表达式 可以使用正则表达式去除HTML中的style、javascript、css代码,具体步骤如下: 1.导入正则表达式命名空间 using System.Text.RegularExpressions; 2.编写正则表达式 string patt…

    css 2023年6月9日
    00
  • iscroll动态加载数据完美解决方法

    iScroll的概念和使用场景 iScroll是针对web移动端开发的一个JavaScript插件,可以模拟原生的滚动效果,解决了移动端滚动效果卡顿和不流畅的问题。iScroll的使用场景比较广泛,如移动端的下拉刷新、无限滚动等功能都可以使用iScroll来实现,让页面交互更加流畅。 iScroll动态加载数据的解决方法 步骤一:初始化iScroll 使用i…

    css 2023年6月10日
    00
  • Photoshop 制作苹果导航栏效果教程

    Photoshop 制作苹果导航栏效果教程 简介 本教程将介绍如何使用 Photoshop 制作苹果导航栏效果。该效果在现代 Web 设计中非常常见,因此学习如何创建这类效果是非常有帮助的。 步骤 1. 创建新文档 打开 Photoshop,点击“文件”>“新建”,输入文档名称、宽度、高度和分辨率,然后点击“创建”。 2. 填充背景色 选择“矩形工具”…

    css 2023年6月10日
    00
  • vue组件 keep-alive 和 transition 使用详解

    关于“vue组件 keep-alive 和 transition 使用详解”的攻略,我们可以从以下几个方面进行详细讲解: keep-alive transition keep-alive 与 transition 的结合应用 示例说明 1. keep-alive keep-alive 是 Vue2.0 中的一个内置组件,它可以用来缓存组件。在组件第一次渲染后…

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