React类组件基础丨青训营笔记

43 阅读5分钟

使用create-react-app创建和学习 React 项目

1. 安装 Node.js

首先,确保电脑上安装了 Node.jsnpm(Node 包管理器)。您可以在 Node.js 官网 下载并安装。

安装完成后,在终端中运行以下命令确认安装成功:

 node -v
 npm -v

2. 创建 React 应用

使用 create-react-app 快速创建 React 项目。

  1. 使用 npx 创建应用

    打开终端,进入想要创建项目的目录,执行以下命令:

 npx create-react-app my-app

其中 my-app 是项目名称,可以根据需要更改。

  1. 等待安装完成

    create-react-app 会自动安装所需的依赖并设置项目结构,这个过程可能需要几分钟。

3. 启动开发服务器

完成安装后,进入项目文件夹并启动开发服务器:

 cd my-app
 npm start

这将启动本地开发服务器,浏览器会自动打开 http://localhost:3000,显示 React 应用的默认页面。

4. 项目结构概览

创建完成后,my-app 目录下的文件结构如下:

  • node_modules:存放项目依赖。
  • public:存放公共资源文件(如 HTML 模板和图标)。
  • src:存放源码文件,主要编写和修改的内容。
  • package.json:项目的依赖和脚本信息。

5. 编辑代码并刷新

src 文件夹中编辑代码(如 App.js)。保存后,浏览器会自动刷新,立即查看修改效果。

React 的 JSX 语法

在使用 create-react-app 创建项目后,你会发现 React 代码中出现了类似 HTML 的语法,这就是 JSX。下面会详细解释 JSX 是什么,以及 Babel 如何解析 JSX。

6. 什么是 JSX?

  1. JSX 简介
  • JSX 是 JavaScript XML 的缩写,是一种在 JavaScript 中编写类似 HTML 的语法扩展,适用于描述 UI 结构。
  • React 推荐使用 JSX,因为它使代码更加直观。
  • JSX 的特点
  • JSX 支持嵌入 JavaScript 表达式(通过 {} 包裹)。
  • 需要 Babel 转译才能被浏览器识别。
  • 示例
  • 打开 Babel 在线编译器,在左侧的编辑器中输入以下代码:
       let names = ['zhangsan','lisi'];
 ​
       //这里封装了一个Hello组件
       function Hello(){
          return (
          <h1>hello</h1>
          )
       }
 ​
       <div>
          this is div
          {/*这里引用了Hello这个组件,打上大括号就可以写js表达式,
          切记是js表达式,不是js语句,比如if、switch、const、let
          这些都是不可以写的,这个注释内容babel就编译不出来*/}
          <Hello/>
          <h1>this is h1</h1>
          <h2>this is h2</h2>
          <p>
             this is p<span>this is span</span>
          </p>
          <ul>
             {/*这里使用数组的map方法循环数组,每次返回<li>{item}</li>,
             返回的整体内容就是<li key='name0' >zhangsan</li><li key='name1'>lisi</li>*/}
             {names.map((item,index)=> <li key={'name'+index}>{item}</li>)}
          </ul>
       </div>

编译器右侧会显示转换后的 JavaScript 代码,通常类似于以下内容:

       import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
       let names = ['zhangsan', 'lisi'];
 ​
       //这里封装了一个Hello组件
       function Hello() {
       return /*#__PURE__*/_jsx("h1", {
          children: "hello"
       });
       }
       /*#__PURE__*/_jsxs("div", {
       children: ["this is div", /*#__PURE__*/_jsx(Hello, {}), /*#__PURE__*/_jsx("h1", {
          children: "this is h1"
       }), /*#__PURE__*/_jsx("h2", {
          children: "this is h2"
       }), /*#__PURE__*/_jsxs("p", {
          children: ["this is p", /*#__PURE__*/_jsx("span", {
             children: "this is span"
          })]
       }),  /*#__PURE__*/_jsx("ul", {
          children: names.map((item, index) => /*#__PURE__*/_jsx("li", {
             children: item
          }, 'name' + index))
       })]
       });

7. JSX 的使用注意事项

  • 必须有一个根元素:每个 JSX 表达式只能返回一个根节点。可以使用 <div> 包裹,或使用 Fragment(即 <></>)避免不必要的 div 嵌套。
 return (
   <>
     <h1>Title</h1>
     <p>Content</p>
   </>
 );
  • 表达式与语句的区别:JSX 只能嵌入表达式而非语句。可以使用三元运算符或短路操作符来替代语句。
 <div>
   {condition ? <p>True</p> : <p>False</p>}
   {names.map((name) => <li key={name}>{name}</li>)}
 </div>

8. 使用 Babel 编译 JSX

Babel 是 JavaScript 的编译器,create-react-app 已自动配置 Babel 将 JSX 转换为纯 JavaScript,因此不需要额外安装。您也可以使用 Babel 在线编译器 来查看 JSX 的转译效果。

虚拟 DOM 与 React 的key 属性

9. 什么是虚拟 DOM?为什么使用它?

  1. 虚拟 DOM 简介
  • 虚拟 DOM(Virtual DOM)是 React 用于提升页面渲染性能的技术。
  • 它是一个轻量级的 JavaScript 对象树结构,模拟了真实 DOM 树结构。
  • 虚拟 DOM 的作用
  • 每次状态或数据更新时,React 会生成新的虚拟 DOM,并与旧的虚拟 DOM 进行比较。这种“diffing”算法可以高效地确定需要更新的部分,而非重新渲染整个 DOM 树。
  • 最后,React 使用最小化更新的方式将变动应用到真实 DOM 中,大幅减少了实际 DOM 操作的开销,提高了性能。

10. React 中的key 属性

  1. key 属性的作用
  • 在 React 中遍历和渲染列表时,每个元素需要有一个唯一的 key 属性,以便 React 能准确判断哪些元素被添加、移除或重排。
  1. 为什么需要 key 属性?
  • key 帮助 React 快速定位和更新列表中的元素。例如,若 key 不唯一或缺失,React 可能会误判,从而导致不必要的重新渲染或错误的数据绑定。
 const items = ['Apple', 'Banana', 'Cherry'];
 return (
   <ul>
     {items.map((item, index) => (
       <li key={index}>{item}</li>
     ))}
   </ul>
 );

以上代码中,key 使用 index(索引值)作为唯一标识,通常更建议使用数据中的唯一 ID,而不是索引。

React 组件的生命周期

11. 组件生命周期概述

React 组件有一个完整的生命周期,分为三个阶段:挂载更新卸载。每个阶段都有不同的生命周期方法。

12. 挂载(Mounting)

挂载阶段是组件被创建并插入 DOM 的阶段。常用方法包括:

  • constructor:用于初始化组件的状态。

  • componentDidMount:组件第一次渲染完成后调用,适合执行网络请求或订阅等副作用操作。

13. 更新(Updating)

当组件的 stateprops 发生变化时,组件进入更新阶段。常用方法有:

  • shouldComponentUpdate:在组件重新渲染前调用,返回布尔值,用于控制是否重新渲染。

  • componentDidUpdate:组件更新完成后调用,可执行更新后的操作。

14. 卸载(Unmounting)

当组件从 DOM 中移除时,会调用以下生命周期方法:

  • componentWillUnmount:在组件被卸载前调用,适合清理定时器、取消网络请求等。