【学术论文投稿】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…

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

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

如何在算家云搭建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…

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

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

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

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

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

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

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

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

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

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

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的下…

springBoot 自动配置与starter

目录 一、自动配置 Springboot实现自动配置的核心机制 Conditional的作用是什么&#xff1f; 如何自定义自动配置&#xff1f; 步骤 例子分析 自动配置的优先级 如何禁用特定的自动配置&#xff1f; 二、starter 如何理解Spring Boot中的starter&#xff1f; 如何自…

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

java后端工程师转行AI大模型岗,工作、自我提升两不误!

随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域&#xff0c;如Java&#xff0c;转向人工智能领域&#xff0c;今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

Rust-宏编程

巴山楚水凄凉地&#xff0c;二十三年弃置身。 怀旧空吟闻笛赋&#xff0c;到乡翻似烂柯人。 沉舟侧畔千帆过&#xff0c;病树前头万木春。 今日听君歌一曲&#xff0c;暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

leetcode912.排序数组的题解

题目描述&#xff1a; 题目要求在不使用任何内置函数的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))。 笔者使用了快速排序&#xff0c;但是直接使用最原始的快速排序&#xff0c;有些特殊的测试用例会超时。 1&#xff09;如果数组本身基本有序&#xff0c;则使用原始…

TikTok品牌出海:从“流量为王”到“价值为王”

随着市场竞争的加剧&#xff0c;品牌逐渐意识到&#xff0c;仅仅依靠流量已不足以在海外市场立足&#xff0c;必须实现从“流量为王”到“价值为王”的转变。本文Nox聚星将和大家探讨品牌如何与TikTok达人合作&#xff0c;在海外市场中建立长期稳定的品牌形象。 一、品牌出海的…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…