深入了解 React:从入门到高级应用

深入了解 React:从入门到高级应用

React 是由 Facebook 开发并维护的一个开源 JavaScript 库,用于构建用户界面。自2013年发布以来,React 在前端开发领域迅速崛起,成为最受欢迎的 UI 构建工具之一。无论是小型的单页应用(SPA)还是复杂的大型企业级应用,React 都能提供高效、灵活的解决方案。本文将全面、详细地介绍 React,包括其核心概念、工作原理、最佳实践以及生态系统。

目录:

  • 深入了解 React:从入门到高级应用
    • React 简介
      • React 的特点:
    • React 核心概念
      • 组件(Component)
        • 函数组件
        • 类组件
      • JSX
      • Props 和 State
        • Props
        • State
      • 生命周期
      • Hooks
    • React 渲染机制
      • 虚拟 DOM
      • React Fiber
    • React 生态系统
      • React Router
      • Redux
      • React Query
    • React 性能优化
    • React 测试
    • React 与其他框架的对比
      • React vs Angular
      • React vs Vue
    • React 进阶话题
      • Context API
      • Suspense 和 Concurrent Mode
      • 服务端渲染(SSR)
    • 总结

React 简介

React 是一个用于构建用户界面的 JavaScript 库。它通过组件化的思想将 UI 拆分成独立、可复用的模块,提升了开发效率并增强了应用的可维护性。React 不仅仅是一个视图层的框架,它还通过 React DOM 和 React Native 提供了跨平台的开发能力。

React 的特点:

  • 组件化:React 强调 UI 的组件化,组件是构建 React 应用的核心。每个组件管理自己的一部分 UI 和状态,可以在多个地方复用。
  • 声明式 UI:React 通过声明式的编程方式让 UI 随状态变化而自动更新。开发者不需要手动操作 DOM,React 会自动高效地更新视图。
  • 单向数据流:React 提供单向数据流的模式,数据从父组件流向子组件,避免了双向数据绑定可能引发的复杂性和性能问题。

React 核心概念

组件(Component)

React 的基本构建块是组件,组件可以是函数组件或类组件。函数组件是 React 中推荐的写法,使用起来更加简洁、灵活,并且可以通过 Hooks 实现更多功能。

函数组件
import React from 'react';

const Greeting = ({ name }) => {
  return <h1>Hello, {name}!</h1>;
};

export default Greeting;
类组件

虽然函数组件已经成为主流,但类组件依然被广泛使用,尤其是在处理生命周期或某些旧的 React 项目中。

import React, { Component } from 'react';

class Greeting extends Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}

export default Greeting;

JSX

JSX(JavaScript XML)是 React 推荐使用的语法扩展,它允许在 JavaScript 中直接书写类似 HTML 的标记。JSX 并不是一个新的语言,它只是 JavaScript 的语法糖。通过 Babel 等工具,JSX 最终会被转换为 React.createElement 函数调用。

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

Props 和 State

Props

Props 是“属性”的缩写,表示组件外部传递给组件的数据。Props 是只读的,不能在组件内部修改。Props 的作用类似于函数的参数。

const Welcome = ({ name }) => {
  return <h1>Hello, {name}!</h1>;
};

<Welcome name="React" />;
State

State 是组件内部的数据,通常用于保存用户交互或生命周期变化的结果。State 是可变的,改变 State 会触发组件重新渲染。

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
};

生命周期

React 类组件有生命周期方法,分别在组件挂载、更新和卸载时调用。在函数组件中,通过 useEffect Hook 来模拟生命周期行为。

class MyComponent extends React.Component {
  componentDidMount() {
    console.log('Component mounted');
  }

  componentDidUpdate() {
    console.log('Component updated');
  }

  componentWillUnmount() {
    console.log('Component will unmount');
  }

  render() {
    return <div>My Component</div>;
  }
}

对于函数组件,可以使用 useEffect 来模拟生命周期方法:

import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    console.log('Component mounted');
    return () => {
      console.log('Component will unmount');
    };
  }, []); // 空数组表示只在挂载和卸载时执行

  return <div>My Component</div>;
};

Hooks

React 16.8 引入了 Hooks,函数组件可以通过 Hooks 实现更多的功能,最常用的 Hooks 包括:

  • useState:用于管理组件状态
  • useEffect:用于处理副作用(如数据获取、DOM 操作等)
  • useContext:用于访问上下文(Context)
  • useReducer:用于更复杂的状态管理
  • useMemouseCallback:用于性能优化
import React, { useState, useEffect } from 'react';

const Example = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }, [count]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
};

React 渲染机制

虚拟 DOM

React 使用虚拟 DOM 来提高性能。虚拟 DOM 是 React 对真实 DOM 的一种抽象,它在内存中模拟了 UI 的结构。当组件的 state 或 props 改变时,React 会首先在虚拟 DOM 中计算出变化,然后将最小的差异更新到真实 DOM。这样可以避免不必要的 DOM 操作,从而提高性能。

React Fiber

React Fiber 是 React 16 引入的一种新的渲染引擎,主要用于优化 React 渲染的性能,尤其是大规模应用中的渲染过程。它将渲染任务切割成小块,分批次处理,这样可以提高 UI 响应速度,避免长时间的 UI 卡顿。


React 生态系统

React Router

React Router 是 React 的官方路由库,用于处理 SPA(单页应用)的路由。通过 React Router,可以在应用中创建不同的页面组件,并根据 URL 的变化来切换不同的视图。

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

const App = () => (
  <Router>
    <Switch>
      <Route path="/" exact component={Home} />
      <Route path="/about" component={About} />
    </Switch>
  </Router>
);

Redux

Redux 是一个流行的状态管理库,适用于需要跨多个组件共享状态的应用。它通过统一的 store 管理全局状态,并通过 dispatch 分发 action 来改变状态。

// Redux 示例代码
const initialState = { count: 0 };

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    default:
      return state;
  }
};

const store = createStore(reducer);

React Query

React Query 是一个强大的数据获取库,专门用于处理与服务器的数据交互,它支持缓存、自动重试、分页等功能。

import { useQuery } from 'react-query';

const fetchData = async () => {
  const response = await fetch('https://api.example.com/data');
  return response.json();
};

const DataFetchingComponent = () => {
  const { data, isLoading } = useQuery('data', fetchData);

  if (isLoading) return <div>Loading...</div>;
  return <div>Data: {JSON.stringify(data)}</div>;
};

React 性能优化

  1. PureComponentReact.PureComponentReact.Component 的一个优化版,它通过浅比较 props 和 state 来决定是否需要重新渲染加载组件,从而减少不必要的渲染。
import React, { PureComponent } from 'react';

class MyComponent extends PureComponent {
  render() {
    return <div>{this.props.name}</div>;
  }
}
  1. React.memo:对于函数组件,可以使用 React.memo 来实现类似于 PureComponent 的效果,即通过浅比较 props 来优化性能。
const MyComponent = React.memo(({ name }) => {
  return <div>{name}</div>;
});
  1. useMemo 和 useCallback:这两个 Hook 可以用来优化性能,避免不必要的计算和函数重建。
  • useMemo 用于缓存计算结果,避免每次渲染时都进行昂贵的计算。
import React, { useMemo } from 'react';

const MyComponent = ({ data }) => {
  const expensiveCalculation = useMemo(() => {
    return data.reduce((acc, item) => acc + item, 0);
  }, [data]);

  return <div>{expensiveCalculation}</div>;
};
  • useCallback 用于缓存函数,避免每次渲染时都创建新的函数引用,适用于传递给子组件的回调函数。
import React, { useCallback } from 'react';

const MyComponent = ({ onClick }) => {
  const handleClick = useCallback(() => {
    console.log('Button clicked');
    onClick();
  }, [onClick]);

  return <button onClick={handleClick}>Click me</button>;
};
  1. Lazy Loading(懒加载):使用 React.lazySuspense 可以实现组件的懒加载,只有当组件需要渲染时才加载相关代码,减少初始加载时间。
import React, { Suspense, lazy } from 'react';

const MyComponent = lazy(() => import('./MyComponent'));

const App = () => {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
};

React 测试

React 提供了多种测试工具和方法,用于保证代码的质量和稳定性。

  1. Jest:Jest 是 React 推荐的测试框架,支持单元测试、集成测试和快照测试等功能。
// Counter.js
import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default Counter;
// Counter.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Counter from './Counter';

test('increments counter', () => {
  const { getByText } = render(<Counter />);
  const button = getByText(/Increment/i);
  fireEvent.click(button);
  getByText('1');
});
  1. React Testing Library:React Testing Library 是一个专门用于 React 组件测试的库,强调从用户交互的角度进行测试,避免关注实现细节。
import { render, fireEvent } from '@testing-library/react';
import MyComponent from './MyComponent';

test('button click updates state', () => {
  const { getByText } = render(<MyComponent />);
  fireEvent.click(getByText('Click me'));
  getByText('You clicked 1 times');
});

React 与其他框架的对比

React vs Angular

  • 学习曲线:Angular 是一个完整的前端框架,内置了很多功能(如路由、表单验证、HTTP 请求等),学习曲线较陡。而 React 是一个库,专注于 UI 构建,学习起来相对简单。
  • 架构:Angular 使用 MVVM(Model-View-ViewModel)架构,适合大型应用开发。React 使用组件化的方式,开发者可以根据需求自由选择工具,如路由、状态管理等。
  • 双向数据绑定:Angular 提供了双向数据绑定,而 React 则是单向数据流,数据从父组件流向子组件,这使得 React 更易于调试和维护。

React vs Vue

  • 学习曲线:Vue 的学习曲线通常被认为比 React 更平缓,特别是对于初学者。Vue 结合了模板和组件的思想,适合渐进式开发。
  • 灵活性:React 提供了更多的灵活性和自由度,开发者可以根据需求选择合适的工具链,而 Vue 提供了更多的默认约定,使得开发过程更加简洁。
  • 生态系统:React 拥有更庞大的社区和生态系统,支持更多的第三方库。Vue 的生态也在迅速发展,但总体上相对较小。

React 进阶话题

Context API

React Context 提供了一种方式,能够让我们在组件树中传递数据,而不需要通过 props 层层传递。它特别适用于全局状态(如主题、语言等)管理。

import React, { createContext, useContext } from 'react';

const ThemeContext = createContext();

const ThemedComponent = () => {
  const theme = useContext(ThemeContext);
  return <div style={{ background: theme.background }}>Hello, World!</div>;
};

const App = () => {
  const theme = { background: 'lightblue' };
  
  return (
    <ThemeContext.Provider value={theme}>
      <ThemedComponent />
    </ThemeContext.Provider>
  );
};

Suspense 和 Concurrent Mode

React 16.6 引入了 Suspense,它允许你将异步加载的组件包装起来,React 会在组件加载时显示一个备用内容。Concurrent Mode 是 React 在 18 中的实验性特性,它通过并发渲染来提升 React 应用的响应速度和用户体验。

import React, { Suspense, lazy } from 'react';

const LazyComponent = lazy(() => import('./LazyComponent'));

const App = () => (
  <Suspense fallback={<div>Loading...</div>}>
    <LazyComponent />
  </Suspense>
);

服务端渲染(SSR)

React 支持服务端渲染(SSR),即在服务器端生成 HTML 页面,然后将其发送到客户端,这样可以提高页面加载速度和 SEO(搜索引擎优化)。Next.js 是一个基于 React 的流行框架,它提供了开箱即用的 SSR 支持。

import React from 'react';

const HomePage = () => <div>Hello from SSR!</div>;

export default HomePage;

在 Next.js 中,您只需要将页面文件放在 pages 目录下,框架会自动为您处理 SSR 和路由。


总结

React 是一个功能强大且灵活的前端库,它通过组件化的方式帮助开发者高效地构建用户界面。随着 React 生态系统的不断发展,它已成为现代前端开发的主流选择。通过掌握 React 的核心概念、生命周期、Hooks、性能优化等技术,开发者能够构建出高效、可维护的前端应用。同时,借助 React 的生态工具(如 React Router、Redux、React Query 等),开发者能够更轻松地处理路由、状态管理和数据请求等任务。

希望本文能帮助您更好地理解和掌握 React,为您未来的开发之路提供支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上&#xff0c;欢迎参考使用&#xff0c;Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明&#xff1a;对手动拍照的问卷图片进行统计分数&#xff08;对应分数…

flask后端开发(2):URL与视图

目录 URL定义request获取请求参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git URL定义 from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!app.route(/profile) def profile():return 我是个人…

基于Sentinel的服务保护方案的三种方式(请求限流、线程隔离、服务熔断)超详细讲解

目录 1、三种方式介绍 1.1请求限流 1.2 线程隔离方案 1.3 服务熔断 2、基于sentinel实现 2.1 启动sentinel 2.2 基于springboot整合sentinel 2.2.1请求限流 2.2.2请求隔离 2.2.2.1 OpenFeign整合Sentinel 2.2.3 服务熔断 2.2.3.1 编写降级代码 2.2.3.2 服务熔断 1、…

小程序基础 —— 02 微信小程序账号注册

微信小程序账号注册 小程序开发与网页开发不一样&#xff0c;在开始微信小程序开发之前&#xff0c;需要访问微信公众平台&#xff0c;注册一个微信小程序账号。 有了小程序的账号以后&#xff0c;才可以开发和管理小程序&#xff0c;后续需要通过该账号进行开发信息的设置、…

箭头函数与普通函数的区别

箭头函数&#xff08;Arrow Functions&#xff09;是ES6&#xff08;ECMAScript 2015&#xff09;引入的一种新的函数定义方式&#xff0c;它提供了更简洁的语法和一些与传统函数表达式不同的行为。 以下是箭头函数与普通函数的主要区别&#xff1a; 语法上的简化&#xff1a; …

uniapp实现APP、小程序与webview页面间通讯

需求&#xff1a; 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页&#xff0c;需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。&#xff08;其实跟使用uniapp开发H5一样&#xff09; 实现步骤&#xff1a; 1、首先需要兼容多端和App端&#xff0c;因…

iPhone 17 :史诗级大改,120Hz 全面普及

资深果粉应该都听过一个说法&#xff1a;“iPhone 买单不买双”。这个“规律”似乎在iPhone 16上也得到了印证。 近段时间&#xff0c;各方消息都在指明一点&#xff1a;iPhone 16 只是大餐前的小菜&#xff0c;iPhone 17才是真正带来革命性提升的一代神机。下一代 iPhone 17&…

逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略

困厄铸剑心&#xff0c;逆袭展锋芒。 寒苦凝壮志&#xff0c;腾跃绘华章。 我要逆袭。 目录 一、引言 二、网络爬虫的基本原理 &#xff08;一&#xff09;网络请求与响应 &#xff08;二&#xff09;网页解析 &#xff08;三&#xff09;爬行策略 三、网络爬虫的应用领…

关系数据库

一些关系数据模型的常见概念->数据库概论-CSDN博客 目录 1、关系数据结构 1.1 笛卡尔积 1.2 关系的定义 1.3 关系的性质 2、关系代数 2.1 传统的集合运算 1. 并(union) 2. 交(intersection) 3. 差(difference) 4. 广义笛卡尔积(extended cartesian product) 2.2…

Unity中实现人物残影效果

今天火柴人联盟3公测了&#xff0c;看到一个残影的效果&#xff0c;很有意思&#xff0c;上网查询了一下实现方式&#xff0c; 实现思路&#xff1a; 将角色的网格复制出来&#xff0c;然后放置到新建的物体的MeshFilter组件上&#xff0c;每隔几十毫秒在玩家的位置生成一个&a…

计算机网络习题(第1章 概论 第2章 数据通信基础)

第1章 概论 1、计算机网络 2、互联网 3、计算机网络体系结构 分层模型 OSI/RM 7层模型 TCP/IP 5层模型 协议、PDU、SDU、SAP等术语 数据封装&#xff08;计算&#xff09; 第2章 数据通信基础 1、数据通信系统组成 2、主要性能指标 数据传输速率 码元速率 时延 3…

【连续学习之随机初始化算法 】2024Nature期刊论文Loss of plasticity in deep continual learning

1 介绍 年份&#xff1a;2024 期刊&#xff1a;Nature Dohare S, Hernandez-Garcia J F, Lan Q, et al. Loss of plasticity in deep continual learning[J]. Nature, 2024, 632(8026): 768-774. 本文提出的算法是“持续反向传播”&#xff08;continual backpropagation&a…

Android Studio | 连接手机设备后,启动App时出现:Waiting For DebuggerApplication (App名)...

在这种情况下&#xff0c;打开目录文件&#xff0c;出现 Is:/storage/emulated/: Permission denied 问题分析&#xff1a; 以上两种情况表明应用程序试图访问Android设备的存储空间中的/storage/emulated/目录&#xff0c;但是没有足够的权限去执行这个操作。 解决办法&…

NodeRed使用心得,实现增删改查等

使用场景介绍 在VUE中使用nodeRed实现对节点的 增删改查等功能&#xff0c;且储存成功之后下点击时启动对应流程 安装与配置 1.安装NodeRed npm install -g --unsafe-perm node-red 安装完成后&#xff0c;你可以通过运行以下命令来启动Node-RED node-red-start2. 配置文件 N…

金仓数据库安装-Kingbase v9-centos

在很多年前有个项目用的金仓数据库&#xff0c;上线稳定后就没在这个项目了&#xff0c;只有公司的开发环境还在维护&#xff0c;已经好多年没有安装过了&#xff0c;重温一下金仓数据库安装&#xff0c;体验一下最新版本&#xff0c;也做一个新版本的试验环境&#xff1b; 一、…

“AI考训分析系统:让考试和训练更智能、更高效

大家好&#xff0c;我是你们的老朋友&#xff0c;一个资深的产品经理。今天咱们来聊聊一个教育领域的新宠儿——AI考训分析系统。这个系统可是个厉害角色&#xff0c;它不仅能帮学生提高学习效率&#xff0c;还能让老师们的工作变得更加轻松。下面我就跟大家伙儿分享一下这个系…

UE5 丧尸类杂兵的简单AI

A、思路 1、关卡初始化时&#xff0c;自动产生随机巡逻点&#xff0c;小兵到达后&#xff0c;去另一个随机巡逻点。 2、加入视力&#xff0c;发现主角后&#xff0c;不再巡逻&#xff0c;而开始追击主角并攻击。条件循环。 3、加入听力。主角的奔跑与射击会产生噪音&#xf…

【Compose multiplatform教程11】【组件】TextField组件

查看全部组件​编辑https://blog.csdn.net/b275518834/article/details/144751353 TextField 功能说明&#xff1a;提供用户输入文本的功能&#xff0c;可设置默认文本、提示文本以及文本样式&#xff0c;方便获取用户输入的内容&#xff0c;常用于数据采集场景。示例场景&am…

C# 将图片转换为PDF文档

将图片&#xff08;JPG、PNG&#xff09;转换为PDF文件可以帮助我们更好地保存和分享图片。此外&#xff0c;PDF文件还具有强大的安全特性&#xff0c;将图片转换为PDF后&#xff0c;我们可以通过设置密码来文件内容不被泄露。本文将介绍如何将JPG/PNG图片转换为PDF文档。 文章…

计算机的错误计算(一百九十三)

摘要 用两个大模型化简计算 其中有关数字取弧度&#xff0c;结果保留5位有效数字。一个大模型进行了一次化简&#xff0c;另外一个大模型没有化简。两个大模型​​​​​均给出错误结果。 例1. 化简计算 其中有关数字取弧度&#xff0c;结果保留5位有效数字。 下面是与一个…