适用人群:
• 已掌握 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 即可
结语
React 并不难,先跑起来 → 拆组件 → 加状态 → 上线,
剩下的就是不断拆更小、复用更多、状态更集中。
如果本文帮你跑通了第一个 React 应用,点个 👍 再走吧!
评论区留下你的第一个 bug,一起聊聊~