React 入门指南 – wiki基地


React 入门指南:从零开始构建现代用户界面

欢迎来到 React 的世界!如果你对构建交互式、高效的 Web 用户界面充满兴趣,那么 React 绝对是你值得学习的强大工具。作为 Facebook(现更名为 Meta)开发并维护的一个 JavaScript 库,React 已经成为前端开发领域最流行、最重要的技术之一。

这篇指南将带你从零开始,逐步了解 React 的核心概念,学习如何搭建开发环境,并亲手写出你的第一个 React 应用。无论你之前是否有使用过其他前端框架的经验,只要你具备 HTML、CSS 和 JavaScript 的基础知识,你就能轻松踏上 React 之旅。

让我们开始吧!

第一部分:认识 React

1.1 什么是 React?

简单来说,React 是一个用于构建用户界面的 JavaScript 库。注意,它是一个“库”,而不是一个完整的“框架”。这意味着 React 主要关注视图层(UI)的构建,你可以很方便地将其嵌入到现有的项目中,或者与其他库(如用于路由的 React Router、用于状态管理的 Redux/Zustand 等)结合使用,构建功能完善的单页应用(SPA)或复杂网站。

1.2 React 的核心思想

React 之所以流行,得益于它的一些核心思想:

  • 声明式 (Declarative): 你只需要告诉 React 你希望 UI 在特定状态下看起来是什么样子,而无需关心如何一步一步地改变 DOM 来达到这个状态。React 会负责高效地更新和渲染 UI。这使得代码更易于理解和维护。
  • 组件化 (Component-Based): 将 UI 拆分成独立、可复用的组件是 React 的核心。每个组件都有自己的逻辑和外观,可以像乐高积木一样组合起来构建复杂的 UI。这种模式极大地提高了代码的组织性、可维护性和复用性。
  • 一次学习,随处编写 (Learn Once, Write Anywhere): React 不仅可以用于 Web 开发(React DOM),还有 React Native 可以用于构建原生移动应用(iOS 和 Android)。学习了 React 的核心概念,你就可以轻松地跨平台开发。
  • 虚拟 DOM (Virtual DOM): 为了提高性能,React 在内存中维护一个虚拟的 UI 结构(Virtual DOM)。当组件状态发生变化时,React 首先更新 Virtual DOM,然后通过 Diffing 算法比较 Virtual DOM 和真实 DOM 的差异,最后只更新真实 DOM 中需要改变的部分。这比直接操作真实 DOM 更高效。

1.3 为什么选择 React?

  • 社区庞大且活跃: 遇到问题很容易找到解决方案,有大量的第三方库和工具可用。
  • 性能优秀: 虚拟 DOM 带来的高效更新机制。
  • 强大的生态系统: 围绕 React 发展起来的路由、状态管理、UI 库等非常丰富。
  • 可维护性高: 组件化让代码结构清晰,易于管理和测试。
  • 就业机会多: React 是前端招聘中最受欢迎的技能之一。

第二部分:准备工作

在开始编写 React 代码之前,你需要准备好开发环境。

2.1 前置知识

确保你掌握以下基础知识:

  • HTML: 了解标签、结构等基础。
  • CSS: 了解样式、布局等基础。
  • JavaScript:
    • 变量(let, const
    • 函数(包括箭头函数 =>
    • 对象和数组
    • 模块化(import, export
    • Promises/Async/Await (用于处理异步操作,如数据请求)
    • ES6+ 新特性会很有帮助,React 代码大量使用了这些特性。

2.2 安装必要的工具

你需要在你的计算机上安装以下工具:

  1. Node.js 和 npm/yarn/pnpm:

    • React 的开发需要 Node.js 环境来运行构建工具和服务。npm (Node Package Manager) 是 Node.js 默认的包管理器,用于安装各种 JavaScript 库和工具。yarn 和 pnpm 是另外两种流行的包管理器,功能类似,性能可能更好。推荐安装 Node.js 的最新LTS (长期支持) 版本。
    • 访问 Node.js 官网 (https://nodejs.org/) 下载并安装适合你操作系统的版本。安装 Node.js 时会自带 npm。
    • 安装完成后,打开终端或命令行工具,输入以下命令检查是否安装成功:
      bash
      node -v
      npm -v
      # 或者如果你安装了 yarn:
      yarn -v
      # 或者如果你安装了 pnpm:
      pnpm -v
  2. 代码编辑器:

    • 一个好的代码编辑器能极大提高开发效率。推荐使用 VS Code (https://code.visualstudio.com/),它有丰富的 React 插件(如 ESLint, Prettier, React Developer Tools 等)和良好的 JSX 支持。

第三部分:创建你的第一个 React 项目

React 代码通常不会直接在浏览器中运行,因为它们包含 JSX (一种语法扩展) 和现代 JavaScript 特性,需要通过构建工具(如 Webpack, Rollup 或 esbuild)进行转换和打包。

为了让你快速开始,我们将使用现代的构建工具 Vite 来创建一个 React 项目模板。Vite 基于原生 ES 模块,开发服务器启动和热更新非常快。

3.1 使用 Vite 创建项目

打开你的终端或命令行工具,切换到你想创建项目的目录,然后运行以下命令:

“`bash

使用 npm

npm create vite@latest my-react-app –template react

或者使用 yarn

yarn create vite my-react-app –template react

或者使用 pnpm

pnpm create vite my-react-app –template react

“`

  • npm create vite@latest: 运行 Vite 的创建工具。
  • my-react-app: 这是你的项目文件夹名称,你可以改成任何你喜欢的名字。
  • --template react: 指定使用 React 模板。

命令执行后,Vite 会在当前目录下创建一个名为 my-react-app 的文件夹,包含一个基础的 React 项目结构。

3.2 安装依赖并运行项目

进入新创建的项目文件夹:

bash
cd my-react-app

然后安装项目所需的依赖:

“`bash

使用 npm

npm install

或者使用 yarn

yarn install

或者使用 pnpm

pnpm install

“`

安装完成后,运行开发服务器:

“`bash

使用 npm

npm run dev

或者使用 yarn

yarn dev

或者使用 pnpm

pnpm dev

“`

你的终端会显示开发服务器的地址,通常是 http://localhost:5173/ (端口号可能不同)。在浏览器中打开这个地址,你应该能看到一个 React 的欢迎页面。

恭喜!你已经成功创建并运行了你的第一个 React 应用。

3.3 项目文件结构概览

让我们看一下 my-react-app 文件夹里的主要文件:

my-react-app/
├── node_modules/ # 项目依赖的库文件
├── public/ # 静态资源文件夹 (例如 favicon.ico)
├── src/ # 存放项目源码
│ ├── assets/ # 存放静态资源 (图片等)
│ ├── App.css # App 组件的样式文件
│ ├── App.jsx # 项目的主要组件文件
│ ├── index.css # 全局样式文件
│ ├── main.jsx # 项目入口文件
│ └── react.svg # React Logo 图片
├── .eslintrc.cjs # ESLint 配置文件 (代码规范检查)
├── .gitignore # Git 忽略文件列表
├── index.html # 项目的 HTML 入口文件
├── package.json # 项目配置文件,记录依赖和脚本命令
├── vite.config.js # Vite 配置文件
└── README.md # 项目说明文件

  • index.html: 这是浏览器加载的唯一 HTML 文件。注意 <div id="root"></div> 这个元素,React 应用将挂载到这里。
  • src/main.jsx: 这是 React 应用的入口文件。它使用 ReactDOM.createRoot 将根组件 (<App />) 渲染到 index.html 中的 #root 元素里。
  • src/App.jsx: 这是一个示例的 React 组件,你看到的欢迎页面就是由它渲染的。你将大部分时间花在 src 目录下的组件文件中。

第四部分:React 核心概念详解

现在,让我们深入了解构建 React 应用所必需的核心概念。我们将主要关注函数式组件Hooks,因为它们是现代 React 的主流用法。

4.1 组件 (Components)

组件是 React 应用的基石。它们是独立、可复用的 UI 单元。一个组件就是一个函数(或类),它接收输入(称为 props),并返回描述 UI 的 React 元素。

函数式组件 (Functional Components):

这是现代 React 中推荐的组件创建方式。它们是简单的 JavaScript 函数。

“`javascript
// src/components/WelcomeMessage.jsx
import React from ‘react’; // 在使用 JSX 的文件中通常需要导入 React

function WelcomeMessage(props) {
return (

Hello, {props.name}!

{/ 使用 props 接收数据 /}

This is your first React component.

);
}

export default WelcomeMessage; // 导出组件以便在其他地方使用
“`

使用组件:

你可以在其他组件或入口文件中像 HTML 标签一样使用你定义的组件:

“`javascript
// src/App.jsx
import React from ‘react’;
import WelcomeMessage from ‘./components/WelcomeMessage’; // 导入组件

function App() {
return (

{/ 使用 WelcomeMessage 组件,并通过 name 属性传递数据 /}

{/ 可以多次使用同一组件 /}

Learning React is fun!

);
}

export default App;
“`

4.2 JSX (JavaScript XML)

你在上面的代码中看到了类似 HTML 的语法,比如 <h1>Hello, {props.name}!</h1>。这不是普通的 HTML,而是 JSX

  • JSX 是 JavaScript 的语法扩展,它允许你在 JavaScript 代码中书写类似 HTML 的结构。
  • React 推荐使用 JSX 来描述 UI 的外观。构建工具(Vite 在底层使用 Esbuild 或 Babel)会将 JSX 转换成标准的 JavaScript 函数调用(如 React.createElement()),浏览器才能理解。
  • JSX 使得 UI 结构更直观,与组件的逻辑紧密结合,提高了代码的可读性。

JSX 的一些规则:

  1. 必须有一个根元素: 相邻的 JSX 元素必须包裹在一个父元素中(如 <div>, <span>, 或者使用 React 的 Fragment <>)。

    “`javascript
    // ✅ 正确
    return (

    Element 1

    Element 2

    );

    // ✅ 正确 (使用 Fragment)
    return (
    <>

    Element 1

    Element 2

    );

    // ❌ 错误
    // return (
    //

    Element 1

    //

    Element 2

    // );
    “`

  2. 标签必须闭合: 无论是 HTML 标签(如 <img>, <input>) 还是自定义组件,都必须正确闭合。自闭合标签使用 /

    “`javascript
    // ✅ 正确
    ...

    // ❌ 错误
    //
    //
    //
    “`

  3. 在 JSX 中嵌入 JavaScript 表达式: 使用花括号 {} 在 JSX 中插入 JavaScript 变量、函数调用或任何表达式。

    “`javascript
    const name = ‘React’;
    const element =

    Hello, {name}!

    ; // 嵌入变量

    function formatName(user) {
    return user.firstName + ‘ ‘ + user.lastName;
    }
    const user = { firstName: ‘Harper’, lastName: ‘Perez’ };
    const greeting = (

    Hello, {formatName(user)}! {/ 嵌入函数调用 /}

    );

    // 嵌入表达式
    const sum = 1 + 2;
    const result =

    The sum is: {sum}

    ; // The sum is: 3
    “`

  4. JSX 属性 (Attributes): 大多数 HTML 属性在 JSX 中可以直接使用,但有一些例外和约定:

    • 使用驼峰命名法 (camelCase) 代替 kebab-case,例如 className 代替 class (因为 class 是 JavaScript 的保留字),htmlFor 代替 for
    • 如果属性值是字符串常量,使用双引号 "
    • 如果属性值是 JavaScript 表达式(变量、数字、对象等),使用花括号 {}

    “`javascript
    const myId = ‘myElement’;
    const imageUrl = ‘logo.png’;

    {/ 动态 id, 静态 class /}
    Logo {/ 动态 src, 静态 alt /}
    {/ 属性值是函数 /}
    {/ 属性值是布尔值 /}

    {/ 属性值是对象 /}
    Styled text

    ``
    注意
    style` 属性的值是一个 JavaScript 对象,对象的属性名是驼峰命名法。

4.3 Props (属性)

Props 是组件之间传递数据的方式。它是从父组件向子组件传递数据的一种机制。Props 是只读的,子组件不应该修改接收到的 props。

  • 父组件通过属性的方式将数据传递给子组件。
  • 子组件通过其函数签名的第一个参数 props 对象来接收这些数据。

“`javascript
// 父组件 (ParentComponent.jsx)
import React from ‘react’;
import ChildComponent from ‘./ChildComponent’;

function ParentComponent() {
const greetingText = “Hello from Parent!”;

return (

Parent Component

{/ 将 greetingText 作为一个名为 ‘message’ 的 prop 传递给 ChildComponent /}

{/ 传递其他类型的数据,比如数字、布尔值、数组、对象、甚至函数 /}

);
}

export default ParentComponent;

// 子组件 (ChildComponent.jsx)
import React from ‘react’;

function ChildComponent(props) {
// props 对象将包含所有父组件传递的属性
// console.log(props); // 输出: { message: “Hello from Parent!”, count: 10, isActive: true, items: [‘A’, ‘B’] }

return (

Child Component

Received message: {props.message}

{/ 访问 message prop /}

Count: {props.count}

{/ 访问 count prop /}
{/ … 可以访问其他 props … /}

);
}

export default ChildComponent;
“`

解构 Props:

在函数式组件中,通常使用 JavaScript 的对象解构语法来更方便地访问 props:

“`javascript
// 子组件 (ChildComponent.jsx) – 使用解构
import React from ‘react’;

function ChildComponent({ message, count }) { // 直接解构 props 对象
return (

Child Component

Received message: {message}

{/ 直接使用变量名 /}

Count: {count}

);
}

export default ChildComponent;
“`

4.4 State (状态)

State 是组件用来管理其内部数据的一种机制。与 props 不同,state 是组件自己管理的数据,并且这些数据可能会随着时间的推移而发生变化,例如用户的输入、计时器的更新、数据的加载状态等。当 state 发生变化时,React 会重新渲染组件。

在函数式组件中,我们使用 useState Hook 来管理 state。

useState Hook:

  • useState 是 React 提供的一个函数,用于在函数组件中添加状态。
  • 调用 useState() 会返回一个包含两个元素的数组:
    1. 当前的 state 值。
    2. 一个用于更新 state 的函数。
  • useState() 接受一个参数,作为 state 的初始值。

“`javascript
// src/components/Counter.jsx
import React, { useState } from ‘react’; // 导入 useState Hook

function Counter() {
// 声明一个名为 “count” 的 state 变量,并初始化为 0
// setCount 是用于更新 count 的函数
const [count, setCount] = useState(0);

// 定义一个点击事件处理函数
const handleButtonClick = () => {
// 使用 setCount 函数更新 count 的值
// React 会检测到 state 变化并重新渲染 Counter 组件
setCount(count + 1);
};

return (

You clicked {count} times

{/ 显示当前的 count 值 /}

);
}

export default Counter;
“`

Counter 组件添加到 App.jsx 中,运行应用,点击按钮,你会看到数字增加。

State 的不可变性 (Immutability):

在 React 中更新 state 时,尤其是更新对象或数组类型的 state,绝不能直接修改原有的 state 值。你必须创建一个新的对象或数组来替换旧的 state。

“`javascript
// ❌ 错误: 直接修改对象属性,React 可能无法检测到变化
// const [user, setUser] = useState({ name: ‘Alice’, age: 30 });
// const updateUserAge = () => {
// user.age += 1; // ❌ 错误! 直接修改了 user 对象
// setUser(user); // ❌ 错误! 虽然调用了 setter,但传入的是同一个对象引用
// };

// ✅ 正确: 创建新的对象
const [user, setUser] = useState({ name: ‘Alice’, age: 30 });
const updateUserAge = () => {
setUser({ …user, age: user.age + 1 }); // ✅ 正确! 使用展开运算符创建新对象并修改 age
};

// ❌ 错误: 直接修改数组
// const [items, setItems] = useState([‘A’, ‘B’]);
// const addItem = (newItem) => {
// items.push(newItem); // ❌ 错误! 直接修改了 items 数组
// setItems(items); // ❌ 错误! 传入的是同一个数组引用
// };

// ✅ 正确: 创建新的数组
const [items, setItems] = useState([‘A’, ‘B’]);
const addItem = (newItem) => {
setItems([…items, newItem]); // ✅ 正确! 使用展开运算符创建新数组并添加 newItem
};
“`

理解并遵循 state 的不可变性对于 React 的性能优化和正确更新至关重要。

4.5 事件处理 (Event Handling)

在 React 中处理事件与在普通 HTML 中类似,但有一些 React 特有的语法:

  • 事件名称使用驼峰命名法,例如 onClick, onChange, onSubmit
  • 事件处理函数作为属性值传递,用花括号 {} 包裹。
  • 你传递的是函数本身,而不是函数调用的结果。

“`javascript
// src/components/EventHandlerDemo.jsx
import React from ‘react’;

function EventHandlerDemo() {
// 事件处理函数
const handleClick = (event) => {
// 事件对象 (event) 与原生 DOM 事件对象类似,但经过 React 封装 (SyntheticEvent)
console.log(‘Button clicked!’, event);
};

const handleChange = (event) => {
console.log(‘Input value changed:’, event.target.value);
};

const handleFormSubmit = (event) => {
event.preventDefault(); // 阻止表单默认提交行为,避免页面刷新
console.log(‘Form submitted!’);
// 在这里处理表单数据
};

return (

{/ 传递函数本身 /}

  <input type="text" onChange={handleChange} placeholder="Type something..." />

  <form onSubmit={handleFormSubmit}>
    <button type="submit">Submit Form</button>
  </form>

  {/* ❌ 错误:这是函数调用的结果,会在渲染时立即执行 */}
  {/* <button onClick={handleClick()}>Click Me (Incorrect)</button> */}

  {/* ✅ 如果需要传递参数给事件处理函数,可以使用箭头函数或 bind */}
  <button onClick={() => handleClick('Extra Arg')}>Click with Arg</button>
  {/* <button onClick={handleClick.bind(this, 'Extra Arg')}>Click with Arg (Bind)</button> */}
</div>

);
}

export default EventHandlerDemo;
“`

4.6 条件渲染 (Conditional Rendering)

根据不同的条件渲染不同的元素或组件是常见的需求。在 React 中,你可以使用标准的 JavaScript 控制流语句或逻辑运算符来实现条件渲染:

  1. if / else 语句: 在 JSX 外部使用,用于控制返回哪个 JSX 结构。

    javascript
    function Greeting({ isLoggedIn }) {
    if (isLoggedIn) {
    return <h1>Welcome back!</h1>;
    } else {
    return <h1>Please sign up.</h1>;
    }
    }

  2. 三元运算符 (condition ? true : false): 在 JSX 内部使用,根据条件选择渲染两个表达式中的一个。

    javascript
    function Greeting({ isLoggedIn }) {
    return (
    <div>
    {isLoggedIn ? ( // 如果 isLoggedIn 为 true
    <h1>Welcome back!</h1>
    ) : ( // 否则
    <h1>Please sign up.</h1>
    )}
    </div>
    );
    }

  3. 逻辑与运算符 (&&): 如果条件为真,则渲染 && 后面的元素;如果条件为假,则不渲染。适用于只有一种情况下需要渲染元素的情况。

    “`javascript
    function Mailbox({ unreadMessages }) {
    return (

    Hello!

    {unreadMessages.length > 0 && ( // 如果未读消息数量大于 0

    You have {unreadMessages.length} unread messages.

    )} {/ 否则不渲染 h2 /}

    );
    }

    // 使用示例:
    // // 显示: You have 2 unread messages.
    // // 不显示未读消息提示
    “`

4.7 列表渲染 (List Rendering)

渲染列表(例如数组中的数据项)是另一个常见任务。在 React 中,你可以使用 JavaScript 的 map() 方法来遍历数组,并为每个项返回一个 React 元素(通常是 JSX)。

“`javascript
// src/components/ItemList.jsx
import React from ‘react’;

function ItemList() {
const items = [
{ id: 1, text: ‘Apple’ },
{ id: 2, text: ‘Banana’ },
{ id: 3, text: ‘Cherry’ },
];

return (

    {/ 使用 map 方法遍历 items 数组 /}
    {items.map(item => (
    // 对于每个 item,返回一个

  • 元素
    // key 属性是必需的!

  • {item.text}
  • ))}

);
}

export default ItemList;
“`

key 属性的重要性:

当你渲染列表时,React 要求你为列表中的每个元素指定一个唯一的 key 属性。

  • key 的作用: 帮助 React 识别哪些列表项在变化、被添加或被删除。它用于优化列表的渲染性能。当列表更新时,React 使用 key 来决定如何高效地更新真实 DOM,而不是重新渲染整个列表。
  • key 的值: 应该是列表中每个项的稳定、唯一的标识符。理想情况下,使用数据的 ID (如果数据有 ID)。
  • 避免使用索引作为 Key: 如果列表项的顺序可能改变、添加或删除,使用数组索引作为 key 可能导致性能问题和潜在的 bug(如状态混乱)。只有在列表是静态的、不会改变、且没有稳定 ID 的情况下,才考虑使用索引作为 key。

“`javascript
// ❌ 避免在列表项顺序可能改变时使用 index 作为 key
// items.map((item, index) => (
//

  • {item.text}
  • // ))

    // ✅ 总是优先使用数据中的唯一 ID 作为 key
    items.map(item => (

  • {item.text}
  • ))
    “`

    4.8 useEffect Hook (副作用)

    在 React 组件中,执行“副作用”是很常见的,比如:

    • 数据获取 (fetching data from an API)
    • 订阅外部服务 (setting up subscriptions)
    • 手动修改 DOM (less common in React, but sometimes necessary)
    • 设置计时器 (timers)

    这些操作因为会影响到组件外部或在渲染过程中不应该直接发生,所以被称为“副作用”。在函数式组件中,我们使用 useEffect Hook 来处理这些副作用。

    useEffect 的基本用法:

    useEffect 接收一个函数作为第一个参数。这个函数包含了你要执行的副作用代码。

    “`javascript
    // src/components/EffectDemo.jsx
    import React, { useState, useEffect } from ‘react’;

    function EffectDemo() {
    const [count, setCount] = useState(0);
    const [data, setData] = useState(null);

    // 效果函数 (副作用代码)
    useEffect(() => {
    // 这个函数会在组件首次渲染后和每次更新后执行
    console.log(‘Effect ran!’);
    document.title = You clicked ${count} times; // 修改文档标题是一个副作用

    // 模拟数据获取
    // fetch('/api/some-data')
    //   .then(response => response.json())
    //   .then(data => setData(data));
    
    // 返回一个清理函数 (可选)
    return () => {
      // 清理函数会在组件卸载或 effect 重新运行之前执行
      console.log('Cleanup running...');
      // 取消订阅、清除计时器等
    };
    

    }); // 没有依赖数组,effect 会在每次渲染后运行

    // 带有空依赖数组 [] 的 useEffect
    useEffect(() => {
    console.log(‘Effect ran ONCE (on mount)’);
    // 只在组件首次渲染后执行一次,模拟 componentDidMount

    // 例如:只在组件加载时获取数据
    // fetch('/api/initial-data')
    //   .then(response => response.json())
    //   .then(data => setData(data));
    
    // 必须返回一个清理函数来清理副作用
    return () => {
      console.log('Cleanup running ONCE (on unmount)');
      // 例如:清除计时器、取消事件监听、取消订阅等
      // clearInterval(timerId);
    };
    

    }, []); // 空数组表示 effect 不依赖任何变量,只在挂载和卸载时运行

    // 带有依赖数组 [count] 的 useEffect
    useEffect(() => {
    console.log(‘Effect ran when count changed:’, count);
    // 这个 effect 会在组件首次渲染后和 count 变量改变时执行

    // 例如:当某个 state 或 prop 改变时执行特定操作
    // saveCountToLocalStorage(count);
    

    }, [count]); // 依赖数组包含 count 变量

    return (

    Count: {count}


    {data &&

    Data loaded: {JSON.stringify(data)}

    }

    );
    }

    export default EffectDemo;
    “`

    useEffect 的第二个参数:依赖数组 (Dependency Array):

    • useEffect(callback): 提供依赖数组。 effect 会在每次组件渲染后都执行(包括首次渲染和后续更新)。
    • useEffect(callback, []): 提供一个空数组 [] 作为依赖数组。 effect 只在组件首次渲染后执行一次(类似于类组件的 componentDidMount)。
    • useEffect(callback, [prop1, state1]): 提供一个包含变量的数组作为依赖数组。 effect 会在组件首次渲染后,以及数组中的任何变量值发生变化时执行。

    合理使用依赖数组可以控制 effect 的执行时机,避免不必要的副作用。

    第五部分:构建一个简单的 React 应用(示例)

    我们将把上面学到的概念组合起来,构建一个简单的应用:一个带计数器和可自定义消息的欢迎页面。

    “`javascript
    // src/App.jsx
    import React from ‘react’;
    import ‘./App.css’; // 导入样式

    // 导入之前创建的组件
    import WelcomeMessage from ‘./components/WelcomeMessage’;
    import Counter from ‘./components/Counter’;
    import ItemList from ‘./components/ItemList’;
    import EffectDemo from ‘./components/EffectDemo’;
    import EventHandlerDemo from ‘./components/EventHandlerDemo’;

    function App() {
    const userName = “Learner”;
    const itemsData = [
    { id: 1, text: ‘Learn React’ },
    { id: 2, text: ‘Build a Project’ },
    { id: 3, text: ‘Master Hooks’ },
    ];

    return (

    React 入门示例

      <section className="App-section">
        {/* 使用 WelcomeMessage 组件,通过 props 传递数据 */}
        <WelcomeMessage name={userName} />
      </section>
    
      <section className="App-section">
        <h2>计数器</h2>
        {/* 使用 Counter 组件 */}
        <Counter />
      </section>
    
      <section className="App-section">
        <h2>待办事项列表</h2>
        {/* 使用 ItemList 组件,通过 props 传递数据 (虽然 ItemList 自己定义了数据,这里可以修改它接收数据) */}
        {/* 假设我们修改 ItemList 接收 items 数组作为 prop */}
        {/* <ItemList items={itemsData} /> */}
        {/* 为了简化示例,我们还是使用 ItemList 内部数据的版本 */}
        <ItemList />
      </section>
    
      <section className="App-section">
        <h2>Effect Hook 示例</h2>
        {/* 使用 EffectDemo 组件 */}
        <EffectDemo />
      </section>
    
      <section className="App-section">
        <h2>事件处理示例</h2>
        {/* 使用 EventHandlerDemo 组件 */}
        <EventHandlerDemo />
      </section>
    
      <footer>
        <p>指南结束,开始实践吧!</p>
      </footer>
    </div>
    

    );
    }

    export default App;
    “`

    请确保你已经创建了 src/components 文件夹,并将前面示例中的 WelcomeMessage.jsx, Counter.jsx, ItemList.jsx, EffectDemo.jsx, EventHandlerDemo.jsx 文件放在其中。你也可以简化 App.css 内容或使用你自己的样式。

    运行 npm run dev,你将在浏览器中看到一个包含了这些组件的基本页面。这是一个将不同功能模块化为独立组件,并在父组件 App 中组装起来的例子。

    第六部分: आगे 的路 (Beyond the Basics)

    恭喜你已经掌握了 React 的核心基础!这只是一个开始。 आगे 你可以深入学习:

    • 组件通信: 除了父子组件通过 props 传递数据,兄弟组件或不相关的组件如何通信?了解状态提升 (State Lifting) 和 Context API。
    • 路由: 构建多页面应用需要路由。React Router 是最流行的选择。
    • 状态管理: 对于大型复杂应用,可能需要更强大的状态管理库,如 Redux, Zustand, MobX 等。
    • 数据获取: 学习在 React 中如何优雅地从 API 获取数据,处理加载和错误状态,可以使用 useEffect 结合 useState,或者使用专门的数据请求库/Hook,如 SWR 或 React Query。
    • Hooks 的更多用法: 学习其他内置 Hooks (如 useContext, useReducer, useRef, useMemo, useCallback) 以及如何创建自定义 Hooks。
    • 性能优化: 了解 React.memo, useMemo, useCallback, 代码分割 (Code Splitting) 等技术。
    • 测试: 学习如何测试你的 React 组件 (单元测试、集成测试)。
    • CSS Modules / Styled Components / Tailwind CSS: 学习如何在 React 项目中更好地组织和管理样式。
    • TypeScript: 学习如何在 React 中使用 TypeScript 增强代码的可维护性和健壮性。
    • Next.js / Remix: 学习基于 React 的全栈框架,它们提供了服务器端渲染 (SSR)、静态网站生成 (SSG)、路由、API 路由等更多功能,适用于构建更大型、更优化的应用。

    结语

    本指南带你认识了 React,搭建了开发环境,并详细讲解了组件、JSX、Props、State、事件处理、条件渲染、列表渲染和 useEffect 等核心概念。这些是构建任何 React 应用的基础。

    学习编程最好的方式就是实践。现在,尝试修改你创建的项目,实现一些小功能,比如:

    • 让欢迎消息的名字可以修改。
    • 给列表项添加删除按钮。
    • 创建一个表单,获取用户输入并显示出来。

    记住,官方文档永远是最好的学习资源:https://react.dev/

    同时,积极参与社区,阅读其他人的代码,多动手实践,你会越来越熟练。

    React 的世界充满可能性,希望这篇指南为你打开了这扇大门。祝你在 React 的学习旅程中一切顺利!


    发表评论

    您的邮箱地址不会被公开。 必填项已用 * 标注

    滚动至顶部