React 快速入门(2025 版)|30 分钟从 0 到 Hello Vite + React 18

适用人群:
• 已掌握 HTML / CSS / JS(ES6+)
• 想用最短时间跑通 React 开发链路
• 不想先学脚手架黑盒,而是先“看见”代码再深入


1. 一句话认识 React

React 是一个把 UI 拆成可复用组件用状态(state)驱动视图的 UI 库。
核心就三件事:
① JSX 语法糖 → 写 HTML 一样写 JS
② 单向数据流 → 数据变,界面自动变
③ 组件化 → 把页面切成乐高积木


2. 环境 3 分钟搭好:Vite + React 18

不需要全局安装 CRA(create-react-app)!2025 年了,直接用 Vite。

# 1. 初始化
npm create vite@latest React-Quick-Start -- --template react-ts
cd React-Quick-Start
npm i

# 2. 启动
npm run dev        # http://localhost:5173

打开浏览器,出现 Vite Logo,环境 OK!


3. 第一个组件:计数器

删掉 src/App.tsx 里的示例代码,替换成:

import { useState } from 'react';

function App() {
  const [count, setCount] = useState(0);

  return (
    <div style={{ textAlign: 'center', marginTop: 60 }}>
      <h1>Hello React 18 🚀</h1>
      <p>当前计数:{count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

export default App;

保存,浏览器热更新,点按钮数字加 1 —— 你的第一个交互完成!


4. 组件拆分实战:Todo List(10 行代码)

目录结构:

src/
 ├─ App.tsx
 └─ components/
     ├─ TodoInput.tsx
     ├─ TodoItem.tsx
     └─ TodoList.tsx

4.1 根组件 App.tsx

import { useState } from 'react';
import TodoInput from './components/TodoInput';
import TodoList from './components/TodoList';

export type Todo = { id: number; text: string; done: boolean };

function App() {
  const [list, setList] = useState<Todo[]>([]);

  const addTodo = (text: string) =>
    setList([...list, { id: Date.now(), text, done: false }]);

  const toggleTodo = (id: number) =>
    setList(list.map(t => (t.id === id ? { ...t, done: !t.done } : t)));

  return (
    <div style={{ maxWidth: 400, margin: '0 auto' }}>
      <h2>极简 Todo</h2>
      <TodoInput onAdd={addTodo} />
      <TodoList todos={list} onToggle={toggleTodo} />
    </div>
  );
}

export default App;

4.2 components/TodoInput.tsx

import { useState, KeyboardEvent } from 'react';

type Props = { onAdd: (text: string) => void };

export default function TodoInput({ onAdd }: Props) {
  const [val, setVal] = useState('');
  const handleKey = (e: KeyboardEvent) => {
    if (e.key === 'Enter' && val.trim()) {
      onAdd(val.trim());
      setVal('');
    }
  };
  return (
    <input
      placeholder="按回车添加"
      value={val}
      onChange={e => setVal(e.target.value)}
      onKeyDown={handleKey}
      style={{ width: '100%', padding: 8 }}
    />
  );
}

4.3 components/TodoItem.tsx

import { Todo } from '../App';

type Props = { todo: Todo; onToggle: (id: number) => void };

export default function TodoItem({ todo, onToggle }: Props) {
  return (
    <li
      style={{
        cursor: 'pointer',
        textDecoration: todo.done ? 'line-through' : 'none',
      }}
      onClick={() => onToggle(todo.id)}
    >
      {todo.text}
    </li>
  );
}

4.4 components/TodoList.tsx

import { Todo } from '../App';
import TodoItem from './TodoItem';

type Props = { todos: Todo[]; onToggle: (id: number) => void };

export default function TodoList({ todos, onToggle }: Props) {
  if (!todos.length) return <p>暂无任务~</p>;
  return (
    <ul>
      {todos.map(t => (
        <TodoItem key={t.id} todo={t} onToggle={onToggle} />
      ))}
    </ul>
  );
}

保存,浏览器里输入、回车、点击完成 ✅ —— 组件化思维立竿见影!


5. 打包上线

npm run build
# dist/ 目录就是纯静态文件,丢到 GitHub Pages / Netlify / OSS 即可

demo源码

结语

React 并不难,先跑起来 → 拆组件 → 加状态 → 上线
剩下的就是不断拆更小、复用更多、状态更集中

如果本文帮你跑通了第一个 React 应用,点个 👍 再走吧!
评论区留下你的第一个 bug,一起聊聊~

### 如何在 Vite + React + Ant Design 的项目中创建函数式组件 在现代前端开发中,基于 Vite 构建的 React 应用程序因其高效的热更新和模块化支持而备受青睐。当结合 Ant Design 这样的 UI 组件库时,可以更方便地构建美观且功能强大的用户界面[^1]。 以下是关于如何在 Vite + React + Ant Design 项目中创建函数式组件的最佳实践: #### 函数式组件的基础结构 函数式组件是一种轻量级的方式定义 React 中的 UI 部分。它接受 `props` 参数并返回 JSX 结构作为渲染的内容。以下是一个简单的函数式组件示例: ```tsx import { Button } from 'antd'; interface GreetingProps { name: string; } const Greeting: React.FC<GreetingProps> = ({ name }) => ( <div> Hello, {name}! <Button type="primary">Click Me</Button> </div> ); export default Greeting; ``` 上述代码展示了如何导入 Ant Design 的按钮组件,并将其嵌入到自定义的函数式组件中[^2]。 #### 使用 TypeScript 定义 Props 类型 为了增强项目的可维护性和减少运行时错误,在使用 TypeScript 开发时推荐明确定义组件的 props 类型。这可以通过接口来完成,如下所示: ```typescript interface UserCardProps { username: string; age?: number; // 可选属性 } const UserCard: React.FC<UserCardProps> = ({ username, age }) => ( <div style={{ padding: '10px', border: '1px solid #ccc' }}> <p><strong>Username:</strong> {username}</p> {age !== undefined && <p><strong>Age:</strong> {age}</p>} </div> ); ``` 此示例还演示了条件渲染的概念——仅当存在年龄数据时才显示相关内容。 #### 利用 Hooks 增强逻辑能力 React 提供了许多内置 Hook 来帮助处理状态管理和副作用操作。例如,`useState` 和 `useEffect` 是两个最常用的 Hook。下面的例子展示了一个计数器组件,该组件允许用户点击按钮增加数值: ```tsx import React, { useState } from 'react'; import { Button } from 'antd'; const Counter: React.FC = () => { const [count, setCount] = useState(0); return ( <> <h1>{count}</h1> <Button onClick={() => setCount(count + 1)}>Increment</Button> </> ); }; export default Counter; ``` 这里引入了 `useState` 来管理组件内部的状态变化。 #### 最佳实践总结 - **保持简单**:尽量让每个组件只负责单一职责。 - **合理拆分**:如果发现某个组件变得复杂,则考虑将其分解成多个子组件。 - **充分测试**:编写单元测试确保组件行为符合预期。 - **遵循一致性风格指南**:无论是命名约定还是代码布局都应统一团队标准。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值