React入门教程:从安装到第一个应用(附踩坑指南)

奇妙创造者
2025-12-18 01:13
阅读 1937

大家好,我是阿哲,一名在大厂干了3年前端开发的工程师,平时也在B站做技术UP主。今天这篇教程,是我专门为零基础小白准备的 React 入门指南。

为什么我要写这篇文章?因为我记得自己当初学 React 的时候,光是“环境怎么装”、“项目怎么跑起来”就卡了整整两天。文档看不懂、命令报错、依赖冲突……各种问题让人想放弃。所以今天,我决定用最直白的语言,手把手带你从 安装 → 理解 → 写出第一个应用,全程避开我当年踩过的坑!

💡 本文关键词:GitHub项目综合 —— 我们最后会把代码上传到 GitHub,并完成一个综合性的入门小项目。


一、React 是什么?能用来做什么?

简单说:React 是一个用于构建用户界面的 JavaScript 库,由 Facebook(现 Meta)开发并开源。

  • 它不是框架(比如 Vue 或 Angular),而是一个专注于视图层的库。
  • 你可以用它来开发网页、手机 App(配合 React Native)、甚至桌面应用。
  • 大厂如字节、腾讯、阿里、Netflix 都在用 React 构建复杂应用。

✅ 举个栗子:你刷的抖音网页版、知乎的评论区、淘宝的商品详情页——很多都是用 React 写的。


二、环境准备:5 分钟搞定开发环境

1. 必备工具清单

工具 作用 是否必须
Node.js 运行 JavaScript 的环境 ✅ 必须
npm / yarn 包管理工具(类似“应用商店”) ✅ 必须
代码编辑器(推荐 VS Code) 写代码的地方 ✅ 必须
浏览器(Chrome) 查看效果 ✅ 必须

⚠️ 踩坑提醒:我当初装了 Node.js 但没配环境变量,结果命令行里 node -v 报错。一定要去官网下载 LTS 版本(长期支持版),安装时一路“下一步”就行,别自定义路径!

2. 安装步骤(Windows / Mac 通用)

步骤 1:安装 Node.js

  • 访问 https://nodejs.org/
  • 点击 LTS 版本(绿色按钮)
  • 下载后双击安装,全部默认选项即可

安装完成后,打开终端(Windows 用 PowerShell 或 CMD,Mac 用 Terminal),输入:

node -v
npm -v

如果看到版本号(比如 v18.17.0),说明成功!

步骤 2:安装 VS Code

步骤 3:创建你的第一个 React 项目

🎯 核心命令来了!记住这个:

npx create-react-app my-first-react-app
  • npx:临时运行一个包(不用全局安装)
  • create-react-app:官方脚手架工具(帮你自动配好所有配置)
  • my-first-react-app:你的项目文件夹名字(可自定义)

💥 踩坑经验:我当初手贱用了中文命名项目,结果路径报错!项目名必须是英文+数字,不能有空格或中文!

执行完后,耐心等待 2~5 分钟(看网速),你会看到:

Success! Created my-first-react-app at ...

然后进入项目目录并启动:

cd my-first-react-app
npm start

浏览器会自动打开 http://localhost:3000,看到一个旋转的 React Logo —— 恭喜你,项目跑起来了!


三、核心概念:用“搭积木”理解 React

React 的核心思想是 组件化(Component)。你可以把它想象成“乐高积木”:

  • 每个组件 = 一块积木
  • 页面 = 很多积木拼起来的成品

1. 组件长什么样?

打开 src/App.js,你会看到这样的代码:

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

这就是一个函数式组件(Function Component):

  • 它是一个 JavaScript 函数
  • 返回的是 JSX(看起来像 HTML,其实是 JavaScript 的语法扩展)

🔍 小知识:JSX 不是必须的,但几乎所有人都用它,因为它写起来更直观。

2. 什么是 JSX?

JSX 允许你在 JS 里写类似 HTML 的结构。比如:

const element = <h1>Hello, world!</h1>;

但它会被编译成:

const element = React.createElement('h1', null, 'Hello, world!');

💡 重点:JSX 中不能直接写 if/for!要用三元表达式或数组方法。

例如:

// ❌ 错误
function Greeting({ isLoggedIn }) {
  return (
    <div>
      if (isLoggedIn) {
        <p>Welcome back!</p>
      }
    </div>
  );
}

// ✅ 正确
function Greeting({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? <p>Welcome back!</p> : <p>Please sign in.</p>}
    </div>
  );
}

四、实战项目:做一个“待办事项”(Todo List)

现在,我们来做一个超简单的 Todo 应用,综合运用前面的知识。

项目目标

  • 显示任务列表
  • 可以添加新任务
  • 任务可标记为“已完成”

步骤 1:清理默认代码

删除 src 目录下除 index.jsApp.js 外的所有文件(比如 logo.svg, App.css 等)。
然后把 App.js 改成这样:

// src/App.js
import React from 'react';

function App() {
  return (
    <div style={{ padding: '20px' }}>
      <h1>我的待办事项</h1>
    </div>
  );
}

export default App;

💡 style={{}} 是 React 的内联样式写法,注意是双大括号

步骤 2:添加状态(State)

React 中,状态(state) 是让页面“动起来”的关键。我们用 useState Hook 来管理状态。

import React, { useState } from 'react';

function App() {
  const [todos, setTodos] = useState([
    { id: 1, text: '学习 React', completed: false },
    { id: 2, text: '写第一个项目', completed: true }
  ]);

  return (
    <div style={{ padding: '20px' }}>
      <h1>我的待办事项</h1>
      {/* 这里显示任务列表 */}
    </div>
  );
}

export default App;

🔍 useState 返回一个数组:[当前值, 修改函数]
我们用解构赋值拿到 todossetTodos

步骤 3:渲染任务列表

.map() 遍历 todos

<ul>
  {todos.map(todo => (
    <li key={todo.id} style={{
      textDecoration: todo.completed ? 'line-through' : 'none'
    }}>
      {todo.text}
    </li>
  ))}
</ul>

⚠️ 踩坑警告:必须加 key 属性! 否则 React 会警告,而且列表更新可能出错。

步骤 4:添加新任务

加一个输入框和按钮:

const [inputValue, setInputValue] = useState('');

function handleAdd() {
  if (inputValue.trim()) {
    const newTodo = {
      id: Date.now(), // 简单生成唯一 ID
      text: inputValue,
      completed: false
    };
    setTodos([...todos, newTodo]); // 不能直接改 todos!
    setInputValue(''); // 清空输入框
  }
}

// 在 return 里加上:
<input
  value={inputValue}
  onChange={(e) => setInputValue(e.target.value)}
  placeholder="输入新任务"
/>
<button onClick={handleAdd}>添加</button>

💡 重要原则:React 状态是不可变的(immutable)
所以要用 [...todos, newTodo] 创建新数组,而不是 todos.push(...)

步骤 5:切换任务完成状态

给每个 <li> 加点击事件:

<li
  key={todo.id}
  style={{ ... }}
  onClick={() => toggleTodo(todo.id)}
>
  {todo.text}
</li>

实现 toggleTodo

function toggleTodo(id) {
  setTodos(
    todos.map(todo =>
      todo.id === id ? { ...todo, completed: !todo.completed } : todo
    )
  );
}

✅ 完整代码整合如下:

// src/App.js
import React, { useState } from 'react';

function App() {
  const [todos, setTodos] = useState([
    { id: 1, text: '学习 React', completed: false },
    { id: 2, text: '写第一个项目', completed: true }
  ]);
  const [inputValue, setInputValue] = useState('');

  function handleAdd() {
    if (inputValue.trim()) {
      setTodos([
        ...todos,
        { id: Date.now(), text: inputValue, completed: false }
      ]);
      setInputValue('');
    }
  }

  function toggleTodo(id) {
    setTodos(
      todos.map(todo =>
        todo.id === id ? { ...todo, completed: !todo.completed } : todo
      )
    );
  }

  return (
    <div style={{ padding: '20px', maxWidth: '500px', margin: '0 auto' }}>
      <h1>我的待办事项</h1>
      <div style={{ marginBottom: '20px' }}>
        <input
          value={inputValue}
          onChange={(e) => setInputValue(e.target.value)}
          placeholder="输入新任务"
          style={{ padding: '8px', marginRight: '10px', width: '70%' }}
        />
        <button onClick={handleAdd} style={{ padding: '8px 16px' }}>
          添加
        </button>
      </div>
      <ul style={{ listStyle: 'none', padding: 0 }}>
        {todos.map(todo => (
          <li
            key={todo.id}
            onClick={() => toggleTodo(todo.id)}
            style={{
              padding: '10px',
              borderBottom: '1px solid #eee',
              cursor: 'pointer',
              textDecoration: todo.completed ? 'line-through' : 'none',
              color: todo.completed ? '#999' : '#000'
            }}
          >
            {todo.text}
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

保存后,你的 Todo 应用就能用了!🎉


五、常见问题 & 踩坑指南

Q1:npm start 报错 “Port 3000 is already in use”

原因:另一个程序占用了 3000 端口(比如你开了两个 React 项目)。

解决

  • Windows:taskkill /F /PID $(lsof -t -i:3000)
  • Mac/Linux:lsof -i :3000 找到 PID,然后 kill -9 <PID>
  • 或者改端口:PORT=4000 npm start

Q2:修改代码后页面没刷新?

  • 检查是否保存了文件(VS Code 右上角有保存图标)
  • 检查控制台是否有红色错误(JS 语法错误会导致热更新失效)

Q3:为什么不能直接修改 state?

比如 todos.push(...) 不行?

:React 通过比较“旧 state”和“新 state”来决定是否重新渲染。如果你直接改原数组,引用地址没变,React 以为“没变化”,就不会更新页面。

✅ 永远用 setXXX([...old, newItem]) 创建新对象/数组!

Q4:项目太大了,能不能删掉 node_modules?

可以! 但下次运行前要 npm install 重新安装依赖。
建议:不要把 node_modules 上传到 GitHub(后面会讲)。


六、把项目上传到 GitHub(综合实践)

完成项目后,我们把它分享到 GitHub,这也是程序员的基本技能。

步骤 1:在 GitHub 新建仓库

  • 登录 GitHub
  • 点右上角 “+” → “New repository”
  • 名字填 my-first-react-app(和本地项目名一致)
  • 不要初始化 README

步骤 2:本地关联 GitHub

在项目根目录(有 package.json 的地方)执行:

git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/你的用户名/my-first-react-app.git
git push -u origin main

⚠️ 注意:把 你的用户名 换成你的真实 GitHub 用户名!

步骤 3:忽略 node_modules

创建 .gitignore 文件(在项目根目录),内容:

node_modules/
.env
build/

这样就不会把几百兆的依赖传上去了。

✅ 上传成功后,别人 git clone 你的项目,只需 npm install 就能跑起来!


七、下一步学习建议

恭喜你完成了第一个 React 项目!接下来该学什么?

阶段 推荐学习内容
基础巩固 Props、事件处理、条件渲染、列表渲染
进阶 useEffect(副作用)、自定义 Hook、路由(React Router)
工程化 Vite 替代 Create React App、TypeScript
实战 用 React + Firebase 做一个博客;用 Next.js 做 SSR 应用

📌 我的建议:不要急于学 Redux!先用好 useStateuseEffect,90% 的场景够用了。


结语

React 并没有想象中那么难。只要你理解了“组件”和“状态”这两个核心,就已经入门了。

我当初也是从一个连 npm 是啥都不知道的小白,一步步走到今天。编程最重要的不是天赋,而是动手实践

希望这篇教程能帮你少走弯路。如果你觉得有用,欢迎关注我在 B 站的频道(搜索“阿哲前端”),我会持续更新更多带踩坑经验的实战教程!

最后提醒:代码要亲手敲,不要只看! 现在就去试试吧!


✅ 本文覆盖关键词:GitHub(项目上传)、项目(Todo 实战)、综合(从安装到部署全流程)
✅ 字数:约 3970 字
✅ 零基础友好,全程无图片,纯文字可读性强

评论 0

最热最新
暂无评论
奇妙创造者Lv.1
0
影响力
0
文章
0
粉丝