【学术论文投稿】React全攻略:构建高性能前端应用的黄金法则

 

第六届国际科技创新学术交流大会暨管理科学信息化与经济创新发展学术会议(MSIEID 2024)_艾思科蓝_学术一站式服务平台

更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3

目录

引言

1. React简介

2. React的三大核心概念

2.1 JSX

2.2 组件

2.3 状态和生命周期

3. React Hooks

4. 高阶组件和Context

5. 性能优化

6. 路由和导航

7. 状态管理

8. 构建大型应用

9. 测试

10. 部署和生产优化

11. 性能优化策略

11.1 使用React.memo进行组件 memorization

11.2 利用PureComponent减少不必要的渲染

11.3 代码分割与懒加载

11.4 使用useCallback和useMemo避免不必要的计算

11.5 避免内联对象和箭头函数

11.6 使用React Profiler分析性能

11.7 服务端渲染(SSR)

11.8 使用服务端渲染(SSG)静态站点生成


引言

在前端开发的世界里,React以其声明式编程范式、组件化架构和虚拟DOM的特性,成为了开发者们的首选框架之一。本文将带你深入了解React的内部机制,并通过实际代码示例,让你掌握React的核心概念和最佳实践。无论你是前端新手还是资深开发者,这篇文章都将为你提供宝贵的知识和实用的技巧。

1. React简介

React是由Facebook开发的一个用于构建用户界面的JavaScript库。自2013年发布以来,它迅速成为最受欢迎的前端框架之一。React的核心思想是组件化,它允许开发者将UI分解成独立的、可复用的组件,每个组件管理自己的状态。

2. React的三大核心概念

2.1 JSX

JSX是一种JavaScript的语法扩展,它允许你在JavaScript代码中写类似HTML的标记。JSX在编译后会被转换成React的createElement()函数调用。

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

这段代码在构建之后会被转换成:

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

React组件是构成React应用的基本单位。组件可以是类组件或函数组件。

类组件:

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

函数组件:

function Greeting({ name }) {return <h1>Hello, {name}</h1>;
}
2.3 状态和生命周期

状态(state)是组件的私有数据,它可以让组件在渲染时有不同的表现。生命周期方法允许你在组件的不同阶段执行操作。

class Timer extends React.Component {constructor(props) {super(props);this.state = { seconds: 0 };}tick() {this.setState((prevState) => ({seconds: prevState.seconds + 1}));}componentDidMount() {this.interval = setInterval(() => this.tick(), 1000);}componentWillUnmount() {clearInterval(this.interval);}render() {return <h2>Seconds: {this.state.seconds}</h2>;}
}

3. React Hooks

Hooks是React 16.8引入的新特性,它允许你在不编写类的情况下使用状态和其他React特性。

useState:

function Example() {const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

useEffect:

import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {document.title = `You clicked ${count} times`;});return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

4. 高阶组件和Context

高阶组件(HOC)是一种基于React组合特性的高级技术。它是一个函数,它接受一个组件并返回一个新的组件。

function withAdminWarning(WrappedComponent) {return function(props) {return (<div>{"Note: Make sure you have admin permissions!"}<WrappedComponent {...props} /></div>);};
}

Context提供了一种通过组件树传递数据的方法,而不必在每个层级手动传递props。

const MyContext = React.createContext(defaultValue);<MyContext.Provider value={/* 某个值 */}><ChildComponent />
</MyContext.Provider>

5. 性能优化

React提供了多种性能优化手段,如shouldComponentUpdate、React.memo、PureComponent等。

React.memo:

const MyComponent = React.memo(function MyComponent(props) {/* 渲染逻辑 */
});

6. 路由和导航

React Router是一个用于React应用的声明式路由库。

import { BrowserRouter as Router, Route, Link } from 'react-router-dom';function App() {return (<Router><div><Link to="/">Home</Link><Link to="/about">About</Link><Route path="/" exact component={Home} /><Route path="/about" component={About} /></div></Router>);
}

7. 状态管理

虽然React自身提供了状态管理的能力,但在大型应用中,我们通常需要更强大的状态管理库,如Redux或MobX。

Redux:

import { createStore } from 'redux';function reducer(state = { count: 0 }, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };default:return state;}
}const store = createStore(reducer);

8. 构建大型应用

构建大型React应用时,我们需要考虑代码分割、懒加载、服务端渲染等技术。

代码分割:

import React, { Suspense } from 'react';
import { lazy } from 'react';const OtherComponent = lazy(() => import('./OtherComponent'));function MyComponent() {return (<div><Suspense fallback={<div>Loading...</div>}><OtherComponent /></Suspense></div>);
}

9. 测试

React提供了多种测试工具,如Jest、Enzyme、React Testing Library等。

import { render, screen } from '@testing-library/react';
import App from './App';test('renders learn react link', () => {render(<App />);const linkElement = screen.getByText(/learn react/i);expect(linkElement).toBeInTheDocument();
});

10. 部署和生产优化

部署React应用时,我们需要考虑构建优化、服务端渲染、静态站点生成等。

服务端渲染:

import React from 'react';
import ReactDOMServer from 'react-dom/server';const html = ReactDOMServer.renderToString(<App />);

11. 性能优化策略

在React应用的开发过程中,性能优化是一个不可忽视的环节。一个性能优异的应用不仅能提升用户体验,还能降低服务器负载,提高应用的可维护性。以下是一些优化React应用性能的策略。

11.1 使用React.memo进行组件 memorization

React.memo是一个高阶组件,它仅在组件的props发生变化时才会重新渲染。对于函数组件,它可以防止不必要的渲染。

const MyComponent = React.memo(function MyComponent(props) {/* 仅在props变化时重新渲染 */
});
11.2 利用PureComponent减少不必要的渲染

React.PureComponent与React.Component类似,但它内置了shouldComponentUpdate生命周期方法,通过浅比较props和state来避免不必要的渲染。

class MyComponent extends React.PureComponent {render() {/* 仅在props或state浅比较不同的情况下重新渲染 */}
}
11.3 代码分割与懒加载

代码分割可以将代码拆分成多个包,然后按需加载。React的懒加载可以通过React.lazy和Suspense实现。

import React, { Suspense } from 'react';
import { lazy } from 'react';const OtherComponent = lazy(() => import('./OtherComponent'));function MyComponent() {return (<div><Suspense fallback={<div>Loading...</div>}><OtherComponent /></Suspense></div>);
}
11.4 使用useCallback和useMemo避免不必要的计算

useCallback可以缓存函数,useMemo可以缓存计算结果,两者都可以用来避免不必要的计算和渲染。

const memoizedCallback = useCallback(() => {/* 你的回调函数逻辑 */},[deps], // 仅当依赖项改变时才重新创建
);const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
11.5 避免内联对象和箭头函数

内联对象和箭头函数可能会导致组件每次渲染时都创建新的函数或对象,这可以通过将它们提取到组件外部来避免。

// 坏的实践
function MyComponent() {return <div onClick={() => doSomething()}>{props.children}</div>;// 好的实践
function MyComponent() {const handleClick = useCallback(() => doSomething(), []);return <div onClick={handleClick}>{props.children}</div>;
}
11.6 使用React Profiler分析性能

React Developer Tools包含了一个Profiler工具,它可以帮助你识别哪些组件渲染最频繁,以及渲染耗时。

11.7 服务端渲染(SSR)

服务端渲染可以提升首屏加载速度,改善SEO,提高性能。Next.js和Gatsby等框架提供了React服务端渲染的支持。

// 使用Next.js进行服务端渲染
function MyPage() {return <div>Hello World</div>;
}// 在服务器上渲染MyPage组件
11.8 使用服务端渲染(SSG)静态站点生成

静态站点生成可以在构建时生成静态的HTML文件,这可以减少服务器的渲染负担,提高加载速度。

// 使用Gatsby进行静态站点生成
const data = useStaticQuery(graphql`query {site {siteMetadata {title}}}
`);function MySite() {return <h1>{data.site.siteMetadata.title}</h1>;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用App测试-专项测试(DevEco Testing)

注意&#xff1a;大家记得先学通用测试在学专项测试 鸿蒙应用App测试-通用测试-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&am…

【Android】Gradle 7.0+ 渠道打包配置

声明 该配置主要解决打包apk/aab需要动态修改渠道字段,方便区分渠道上架国内商店。 暂不支持批量打包(7.4版本无法通过只修改outputFileName的形式批量处理) 因为构建时需要拷贝/创建Output,然后修改outputFileName才能处理批量打包,但拷贝/创建在高版本中失效了。 目前的…

AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。

2024-10-31&#xff0c;由清华大学和北京大学共同创建的AndroidLab数据集&#xff0c;为安卓自主代理的训练和评估提供了一个包含操作环境、行动空间和可复现基准的系统框架&#xff0c;这对于推动安卓代理技术的发展具有重要意义。 数据集地址&#xff1a;Android Instruct|A…

HTTP请求和请求体Body

HTTP 请求体&#xff08;Request Body&#xff09;是 HTTP 请求的一个重要组成部分&#xff0c;它位于请求头&#xff08;Headers&#xff09;之后&#xff0c;用于向服务器发送数据。请求体通常用于 POST 和 PUT 请求中&#xff0c;但在某些情况下也可以用于其他类型的请求&am…

如何在算家云搭建Aatrox-Bert-VITS2(音频生成)

一、模型介绍 ‌ Aatrox - Bert -VITS2 模型是一种基于深度学习的语音合成系统&#xff0c;结合了 BERT 的预训练能力和 VITS2 的微调技术&#xff0c;旨在实现高质量的个性化语音合成。 二、模型搭建流程 1. 创建容器实例 进入算家云的“应用社区”&#xff0c;点击搜索找到…

OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放

环境准备 安装x11grab(用于捕获屏幕流)和libx264(用于编码) # 基础开发环境&x11grab sudo dnf install -y \autoconf \automake \bzip2 \bzip2-devel \cmake \freetype-devel \gcc \gcc-c \git \libtool \make \mercurial \pkgconfig \zlib-devel \libX11-devel \libXext…

深度学习:Masked Self-Attention 详解

Masked Self-Attention 详解 Masked Self-Attention 是 Transformer 架构中解码器的关键组件&#xff0c;特别用于处理自回归任务&#xff0c;如文本生成。该机制确保模型在生成一个序列的每个元素时只能利用之前元素的信息&#xff0c;防止未来信息的泄露。以下是对 Masked S…

QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)

文章目录 QCustomPlot初识和基本效果图实现步骤:详细代码示例:实现原理和解释:使用方法:其他参考要实现一个支持复选框来控制曲线显示和隐藏的自定义 QCPLegend 类,可以通过继承 QCPLegend 并重写绘制和事件处理方法来实现,同时发出信号通知曲线的状态变更。 QCustomPl…

聊一聊Elasticsearch的基本原理与形成机制

1、搜索引擎的基本原理 通常搜索引擎包括&#xff1a;数据采集、文本分析、索引存储、搜索等模块&#xff0c;它们之间的协作流程如下图&#xff1a; 数据采集模块负责采集需要搜索的数据源。 文本分析模块是将结构化数据中的长文本切分成有实际意义的词&#xff0c;这样用户…

《AI 大模型重塑软件开发:机遇与挑战》

《AI 大模型重塑软件开发&#xff1a;机遇与挑战》 在当今科技飞速发展的时代&#xff0c;AI 技术的不断进步正深刻地改变着各个领域&#xff0c;软件开发行业也不例外。AI 大模型的出现&#xff0c;正在重塑软件开发流程&#xff0c;为软件开发者、企业以及整个产业链带来了深…

PyCharm 导入本地包目录

PyCharm 是最新版 声明一下是野路子 现在我工程目录下有个 gen-py 文件夹&#xff0c;这是我 thrift 编译出来的 Python 依赖包 使用的话&#xff0c;我们可以在代码里加入系统路径 sys.path.append("./gen-py/") 但是这样写&#xff0c;PyCharm 没有提示&#…

80端口被进程 System PID=4 IIS导致的解决方法

是因为80端口被IIS占用。解决办法打开IIS管理器&#xff0c;然后停止&#xff1a;

Linux 有名管道

有名管道&#xff08;Named Pipe&#xff09;&#xff0c;也称为FIFO&#xff08;First In, First Out&#xff09;&#xff0c;是一种特殊的文件系统对象&#xff0c;它允许不相关的进程之间的通信。与无名管道不同&#xff0c;有名管道在文件系统中有一个路径名&#xff0c;因…

异步4位计数器(Quartus与Modelsim联合仿真)

异步计数器&#xff08;也称为ripple-through counter&#xff09;的特点是每一位触发器的输出作为下一位触发器的时钟输入&#xff0c;因此计数速度会因为级联触发器的传播延迟而受到限制。这种计数器的最大工作频率通常低于同步计数器。 一、电路符号 输入信号&#xff1a;时…

PS-基础学习(常用快捷键1.2-1.3)

常用快捷键 钢笔操作功能Alt 选择工具使用选择工具放到锚点上&#xff0c;按下alt&#xff0c;然后放到调整曲度的上面&#xff0c;可以修改一边的曲度可以修改出不平滑的转折点选择工具放到锚点上进行拖拽可以移动锚点的位置ctrl 选择工具使用选择工具&#xff0c;按住ctrl…

若依cloud版集成微信扫码登录-绑定篇

前言 集成微信扫码登录的话&#xff0c;需要把项目的账号和微信账号进行绑定&#xff0c;然后才可以进行扫码登录 本篇内容是项目绑定微信 还需要申请一个微信开放平台账号 微信公众平台申请&#xff08;测试平台&#xff09;-CSDN博客 平台的项目回调接口可以先不写&…

鸿蒙应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 鸿蒙应用App测试-专项测试&#xff08;DevEco Testing&#xff09;-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得…

Docker 容器网络模式详解

Docker 容器网络模式详解 1.1 引言 1.1.1 Docker 网络简介 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用和依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器采用沙箱机制&#xff0c;彼此…

100种算法【Python版】第53篇——无损压缩之LZW算法

本文目录 1 算法步骤2 算法示例3 算法应用3.1 压缩字符串3.1 压缩图像Lempel-Ziv-Welch (LZW) 是一种无损数据压缩算法,广泛应用于图像格式(如 GIF)和其他文件格式。LZW 通过查找输入数据中的重复子串,并使用短码替换这些子串,从而实现压缩。 1 算法步骤 (1)初始化字典…

Linux 配置JDK

文章目录 一、下载Oracle-JDK1.1、如何正确的下载JDK二、配置JDK环境变量2.1 环境变量配置2.1.1、修改vim /etc/profile 添加jdk的路径一、下载Oracle-JDK 1.1、如何正确的下载JDK 首先我要安装的是oracle-jdk,这个时候什么地方都不要去,就去oracle的官网,然后找到,jdk的下…