【热门主题】000067 React前端框架:探索高效Web开发之路
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕
目录
- 【热门主题】000067 React前端框架:探索高效Web开发之路
- 📚一、React 简介
- 📘(一)基本介绍
- 📘(二)特点
- 📘(三)示例
- 📘(四)虚拟 DOM
- 📘(五)Diff 算法
- 📘(六)创建 React 项目(导入资源型)
- 📘(七)JSX
- 📘(八)React 的优缺点
- 🔖优点:
- 🔖缺点:
- 📘(九)2024 年 React 生态系统一览
- 🔖1. 创建新项目
- 🔖2. 包管理
- 🔖3. 状态管理
- 🔖4. 数据获取
- 🔖5. 路由
- 📘(十)React 和其他框架生态系统的比较
- 🔖React 生态系统特点:
- 🔖Vue 生态系统特点:
- 🔖React 生态系统优势:
- 🔖Vue 生态系统优势:
- 🔖React 生态系统的发展趋势:
- 🔖Vue 生态系统的发展趋势:
- 📚二、React 的优势
- 📘1. 卓越的性能
- 📘2. 快速开发
- 📘3. 处理依赖关系
- 📘4. 插件生态系统
- 📚三、React 与其他前端框架对比
- 📘1. Vue.js
- 🔖优点:
- 🔖缺点:
- 📘2. React.js
- 🔖优点:
- 🔖缺点:
- 📘3. Angular
- 🔖优点:
- 🔖缺点:
- 📚四、React 的常见问题及解决方案
- 📘1. 开发服务器无法启动
- 📘2. CSS 样式无法生效
- 📘3. 组件无法渲染
- 📚五、React 的应用场景
- 📘1. 单页应用(SPA)
- 📘2. 移动应用
- 📘3. 渐进式 Web 应用(PWA)
- 📘4. 静态站点生成
- 📘5. 组件库和设计系统
- 📘6. 实时数据展示
- 📘7. 服务器端渲染(SSR)
- 📚六、React 的学习教程
- 📘1. React 基础知识
- 📘2. 状态管理与响应式编程
- 📘3. 案例解析
📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始
⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣
【热门主题】000067 React前端框架:探索高效Web开发之路
📚一、React 简介
React 是一个由 Facebook 开发并维护的用于构建用户界面的 JavaScript 库。它以其高效的性能、组件化开发模式和丰富的生态系统,成为了前端开发领域的热门选择。
React 的出现为前端开发带来了革命性的变化。它起源于 Facebook 的内部项目,最初是为了构建 Instagram 的网站而开发的。在 2013 年 5 月开源后,React 很快就受到了广泛的欢迎和使用。
📘(一)基本介绍
由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。这个项目本身也越滚越大,从最早的 UI 引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用写 Web App 的方式去写 Native App。如果能够实现,整个互联网行业都会被颠覆,因为同一组人只需要写一次 UI,就能同时运行在服务器、浏览器和手机。
React 主要用于构建 UI。你可以在 React 里传递多种类型的参数,如声明代码,帮助你渲染出 UI、也可以是静态的 HTML DOM 元素、也可以传递动态变量、甚至是可交互的应用组件。
📘(二)特点
声明式设计:React 采用声明范式,可以轻松描述应用。
高效:React 通过对 DOM 的模拟,最大限度地减少与 DOM 的交互。
灵活:React 可以与已知的库或框架很好地配合。
JSX:JSX 代表 Javascript XML。它是 Javascript 和 Html 的融合。
📘(三)示例
下面这段代码将会在在页面容器中呈现出 “Hello Tom”:
/**@jsx React.DOM*/
var HelloMsg = React.createClass({
render: function() {
return {'Hello'+this.props.name};
}
});
React.renderComponent(, mountNode);
该例使用一个类似 XML 语法的 JSX 来构建组件,实现一个 render () 方法,并且根据输入的数据返回相应的结果。输入的数据作为 XML 属性传递给组件,render () 方法通过 this.props 访问这些输入的数据。
📘(四)虚拟 DOM
操作原生 DOM 是一件非常耗性能的事,操作虚拟 DOM 就不会那么耗性能了,操作虚拟 DOM 时采用 Different 算法,只更新变化的虚拟 DOM 部分;虚拟 DOM 指通过程序员手动模拟出来类似原生 DOM 的对象,如下面模拟一个带有链接的 p 元素:
var p = {
//定义一个对象
tagName:'p',
//标签名为:p
attrs:{
//定义属性:class:'font16'
},
children:[
//定义内容,相当于innerText
'跳转到:',
{
//在父标签的children中再定义以对象,其方法和定义p一样:
tagName:'a',
//标签名为:a
attrs:{
//属性:href:'https://www.baidu.com',
},
children:[
//定义内容:'百度'
]
}
]
}
📘(五)Diff 算法
Diff 算法用于对比新旧虚拟 DOM 的算法,其中有三部分:tree diff、component diff、element diff, 其区别:
tree diff : 新旧 DOM 树逐层对比的方式,对比所有层节点来找到被更新的节点后修改旧 DOM。
component diff:组件之间的对比,当对比组件的时候,如果两个组件的类型相同,则这个组件暂时不需要被更新,如果组件的类型不同,则立即移除旧组件,新建一个组件,替换到被移除的位置。
element diff: 组件中每个元素之间的对比。
📘(六)创建 React 项目(导入资源型)
使用 React 开发项目时,必须安装两个包:react、react-dom;react 是用来创建组件、组件生命周期等。react-dom 用来操作 DOM。
创建 react 项目步骤:
新建一个项目文件夹,并在文件夹打开终端键入:npm init -y初始化一个package.json文件。
终端输入:cnpm install react react-dom --save
安装 react 和 react-dom 到运行里,ReactNative 开发中不建议使用 cnpm 装包。
新建src文件夹并新建main.js文件并引入:react 和 react-dom:开始编写 react 中 js 主文件(并新建index.html文件,文件中留渲染的div)。
import React from 'react';
import ReactDOM from 'react-dom';
在main.js文件中使用 React 提供的 API 操作元素:
使用React.createElement()创建一个虚拟 DOM,接收至少三个参数:
参数 1:字符串(标签类型),
参数 2:对象(标签属性),
参数 3 开始:当前元素子节点,可放多个虚拟 dom,如:
var mydiv = React.createElement('div',{class:'mydiv',id:'box'},'这是一个div元素');
//<div class='mydiv' id='box'>这是一个div元素</div>
var spanp = React.createElement('span',{class:'spans'},'被span标签包裹的文本');
//<span class='spans'>被span标签包裹的文本</span>
var textp = React.createElement('p',{class:'tp'},'p标签文本中',spanp);
//<p class='tp'>p标签文本中<span class='spans'>被span标签包裹的文本</span></p>
使用ReactDOM.render()将虚拟 DOM 渲染到页面中,
参数 1:渲染 DOM 内容,
参数 2:渲染的 dom 元素位置(获取 DOM 的方式), 如:
ReactDOM.render(mydiv,document.getElementById('app'));
//这里app表示index.htlm文件中一个id值为app的标签,如<div id='app'></div>
webpack 打包构建后,在 dist 目录下的文件是正常可以访问的。
📘(七)JSX
不难发现使用 js 创建元素的方式是非常繁琐的,因此这里介绍一款可以解决这个问题语法:JSX;HTML 语言直接写在 JavaScript 语言中,不加任何引号,这就是 JSX 语法,它允许 HTML 与 JavaScript 的混写;它是一种 JavaScript 的语法扩展,我们推荐在 React 中使用 JSX 来描述用户界面,JSX 是在 JavaScript 内部实现的;元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素(底层实际就是通过上面 js 创建元素的)。
使用 JSX 语法时首先要安装:(cnpm install babel-preset-react -D)并配置在.babelrc文件中,babel-preset-react用来转换 JSX 代码。(注意新版本:babel-preset-react-app,此环境应该基于上面环境)。
与浏览器的 DOM 元素不同,React 当中的元素事实上是普通的对象,如:
// 注意:想要正常运行JSX语法:还需要以下两步:
//1.在项目目录下新建:.babelic文件,其配置代码如下:
{
"presets": ["env", "stage-0", "react"],
"plugins": ["transform-runtime"]
}
//2.cnpm i babel-preset-env babel-preset-stage-0 babel-plugin-transform-runtime --save ,下载上面配置依赖的包。
//3.配置完以上环境后,应该使用webpack打包后才可以以files的方式打正常访问react项目
import React from 'react';
import ReactDOM from 'react-dom';
var titles = '这是一个提示';
var elements = <div>
{/* JSX语法中允许有一个根节点,根节点中可以嵌套其它元素 */}
<p title={titles}>hello</p>
{/*JSX中使用变量用{}包裹,实际指使用js语法时用{}包裹*/}
<a href="#">hello</a>
<p className='textp'>hello</p>
{/*在JSX中使用className代替class属性,因为class在js中只一个关键字*/}
</div>
📘(八)React 的优缺点
🔖优点:
速度很快:它并不直接对 DOM 进行操作,引入了一个叫做虚拟 DOM 的概念,安插在 javascript 逻辑和实际的 DOM 之间,性能好。
跨浏览器兼容:虚拟 DOM 帮助我们解决了跨浏览器问题,它为我们提供了标准化的 API,甚至在 IE8 中都是没问题的。
一切都是 component:代码更加模块化,重用代码更容易,可维护性高。
单向数据流:Flux 是一个用于在 JavaScript 应用中创建单向数据层的架构,它随着 React 视图库的开发而被 Facebook 概念化。
同构、纯粹的 javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是 JavaScript 的执行,预渲染你的应用有助于搜索引擎优化。
兼容性好:比如使用 RequireJS 来加载和打包,而 Browserify 和 Webpack 适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。
🔖缺点:
React 只是视图层的一个框架,如果需要做其他事情,需要依赖它的生态系统;如处理单页面路由使用 Router, 处理数据使用 Redux。
变动频繁。
📘(九)2024 年 React 生态系统一览
对于初学 React 的开发者,首先要面临的问题就是如何搭建一个 React 项目。市面上的工具众多,目前最受 React 社区欢迎的是 Vite。Vite 不仅支持多种库(如 React)与 TypeScript 的结合使用,还具备出色的性能。
🔖1. 创建新项目
如果已经对 React 有所了解,可以考虑使用 Next.js 或 Remix 等其他(元)框架作为 Vite 的替代方案。
Next.js 最初主要用于服务端渲染,但如今也支持静态站点生成以及其他渲染模式。2023 年,Next.js 引入了新的功能 ——React Server Components,这一功能将 React 组件从客户端迁移到了服务端,从而实现了重大的范式转变。
如果寻求性能卓越的静态内容框架,那么 Astro 是一个理想的选择。它不仅与各种框架兼容,而且能与 React 协同工作。在将内容发送到浏览器时,Astro 仅包含 HTML 和 CSS,即使使用了如 React 这样的框架来创建组件。只有当这些组件变得交互式时,才会请求必要的 JavaScript。
如果是 React 老手,并希望尝试新的技术,Nitro 或 Waku 都是不错的选择。Waku 由 Zustand 的创造者开发,并支持 React Server Components。
建议:
Vite:适用于客户端渲染的 React 应用。
Next.js:适用于服务端渲染的 React 应用。
Astro:适用于静态生成的 React 应用。
🔖2. 包管理
如果正在寻找在 JavaScript 生态系统中(尤其是 React)包管理工具,npm 无疑是首选,因为它与 Node.js 安装捆绑在一起。然而,yarn 和 pnpm 也是值得考虑的优秀替代方案。特别是 pnpm,它提供了更高的性能。
如果有多个相互依赖或共享通用 UI 组件的 React 应用,monorepo 的概念可能值得探索。所有上述包管理器都支持使用其内部工作区功能创建 monorepo,但使用 yarn 或 pnpm 时可以获得更好的开发体验。结合诸如 Turborepo 之类的 monorepo 管道工具,可以使整个体验更加顺畅。
建议:
选择一个包管理器并坚持使用它。
默认和最广泛使用的 -> npm。
性能提高,但相对较新,不那么流行 -> pnpm。
如果需要 monorepo,使用 Turborepo。
🔖3. 状态管理
React 提供了两个用于管理本地状态的内置 Hooks:useState和useReducer。
若要进行全局状态管理,可以利用 React 的useContextHook,它能够将属性从顶级组件安全地传递至其子组件,从而避免了属性传递的问题。
如果频繁地使用 React 的Context进行全局状态管理,那么 Zustand 可能会是你需要的工具。Zustand 允许管理全局应用状态,任何与 Zustand 存储连接的 React 组件都可以读取和修改这些状态。
尽管 Zustand 已成为社区中的主流选择,但当需要状态管理库时,Redux 仍然是市场上最受欢迎的 React 状态管理工具库。若你选择使用 Redux,推荐你一并查看 Redux Toolkit。
如果对状态机有特别的兴趣,XState 和 Zag 也是不错的选择。
如果需要一个全局存储,但不满意 Zustand 或 Redux,Jotai、Recoil 或 Nano Stores 等本地状态管理解决方案值得考虑。
建议:
对于协同定位或共享状态,使用使用内置的useState /useReducer。
若需全局状态管理,考虑使用内置的useContext。
对于大量的全局状态,考虑使用 Zustand 或其替代方案。
🔖4. 数据获取
在处理 UI 状态时,React 的内置 Hook 是非常适用的。然而,当涉及到远程数据的状态管理(包括数据获取和缓存)时,建议使用专门的数据获取库,比如 TanStack Query(前身为 React Query)。
如果在 React 中需要更专用的 GraphQL 库,除了 TanStack Query,还可以考虑使用 Apollo Client(流行)、urql(轻量级)或 Relay(由 Facebook 开发)。
如果希望在 Redux 中集成数据获取和状态管理功能,那么可以考虑使用 RTK Query,它能够将数据获取功能与 Redux 无缝集成,简化状态管理流程。
如果同时开发前端和后端(并且两者都使用 TypeScript),那么 tRPC 是一个值得考虑的选项。tRPC 提供端到端的类型安全 API,可显著提高开发效率和用户体验。当需要从前端调用后端时,可以使用类型化的函数。
建议:
TanStack Query(适用于 REST API 或 GraphQL API),结合 axios 或 fetch 使用。
Apollo Client(适用于 GraphQL API)。
tRPC(适用于紧密耦合的客户端 - 服务端架构)。
🔖5. 路由
如果使用 Next.js 这样的 React 框架,路由已经处理好了。
如果使用的是没有框架的 React,仅用于客户端渲染(例如 Vite 无 SSR),那么最强大和最受欢迎的路由库是 React Router。
另一个新的选择是 TanStack Router,它特别考虑了 TypeScript 的支持。
当在 React 中通过 React Router 使用客户端路由时,在路由级别上引入代码分割并不复杂。如果进行此类优化,可以使用 @loadable/component 替换 React.lazy ()。
📘(十)React 和其他框架生态系统的比较
React 和 Vue 的生态系统比较:
🔖React 生态系统特点:
社区活跃度高:React 拥有庞大的开发者社区,社区成员数量众多,教程、博客、插件和工具等资源丰富。
生态系统丰富:React 周边有很多优秀的第三方库和插件,例如 React Router、Redux、Material UI 等,可以帮助开发人员更好地构建应用程序。
灵活性强:React 本身只关注 UI 层,开发者可以自由选择其他库和工具来搭配使用,灵活性高。
适用于大型应用:React 在处理大规模应用和复杂数据流时表现出色,其状态管理库 Redux 也备受推崇。
🔖Vue 生态系统特点:
学习曲线低:Vue 采用了基于模板的语法,类似于传统的 HTML 和 CSS,初学者更容易上手。
生态系统简洁:Vue 的官方插件和库相对较少,但质量较高,例如 Vue Router、Vuex、Element UI 等,可以满足大部分开发需求。
文档和工具完善:Vue 提供了清晰而详细的官方文档,以及 Vue CLI 等工具,使开发流程更加简化和高效。
渐进式框架:Vue 的设计理念是渐进式增强,可以根据项目需求灵活选择使用不同的特性和工具。
🔖React 生态系统优势:
庞大的社区支持:React 拥有庞大而活跃的社区,开发者可以从社区中获取丰富的资源、解决方案和支持。
成熟的第三方库和插件:由于 React 的广泛应用,有很多成熟的第三方库和插件可供选择,可以极大地提高开发效率。
强大的状态管理:Redux 作为 React 的官方状态管理库,可以帮助开发者更好地管理应用程序的状态,尤其适用于大型应用。
🔖Vue 生态系统优势:
简单易学:Vue 采用了直观的模板语法,更易于初学者上手,降低了学习曲线。
渐进式增强:Vue 的设计理念是渐进式增强,可以根据项目需求选择性地引入不同的特性和工具,提供了更灵活的开发方式。
官方文档和工具完善:Vue 提供了清晰而详细的官方文档,以及 Vue CLI 等工具,使得开发者能够快速搭建项目,提高开发效率。
🔖React 生态系统的发展趋势:
更好的 TypeScript 支持:React 在 TypeScript 方面的支持已经逐渐增强,未来将进一步提升,提供更好的类型检查和工具支持。
更丰富的 React 生态:随着 React 的不断发展,预计会有更多的第三方库和插件涌现,为开发者提供更多选择。
更高级的状态管理方案:虽然 Redux 在状态管理方面表现出色,但也存在复杂性较高的问题。未来可能会出现更高级、更简化的状态管理方案。
🔖Vue 生态系统的发展趋势:
继续简化和增强开发体验:Vue 将继续致力于提供更简单、更直观的开发体验,进一步简化 API 和工具,提高开发效率。
更多的官方插件和库:Vue 的官方插件和库相对较少,未来可能会有更多的官方支持插件和库出现,以满足不同的开发需求。
更好的性能优化和渲染性能:Vue 将继续优化
📚二、React 的优势
📘1. 卓越的性能
React 最初是为 Facebook 建造的,这意味着其工程师以各种方式对其进行了优化。即使在网络繁忙的情况下,React 也能确保完美的性能。例如,在构建大型应用程序时,React 的性能优势尤为明显。它通过引入虚拟 DOM 的概念,安插在 JavaScript 逻辑和实际的 DOM 之间,最大限度地减少了与 DOM 的交互,从而提高了性能。
📘2. 快速开发
开始使用 React 比使用 Angular 或 Vue 等其他库要快得多。这主要得益于 JSX,它允许在 JavaScript 中编写 HTML,并且可以轻松地重用单独的组件。这使得开发人员能够更快地构建应用程序,节省开发成本。对于小企业和初创公司来说,React 是一个有吸引力的选择。
📘3. 处理依赖关系
使用 React 可以定义组件之间的依赖关系。Facebook 开发的组件依赖管理解决方案 Flux 可以处理这些依赖关系。当构建大型应用程序时,这一功能非常有用。它可以帮助开发人员独立地维护应用程序的不同部分,避免跨组件问题。
📘4. 插件生态系统
React 有一个巨大的插件生态系统,这意味着你可以找到任何东西的库。无论是表单验证、路由还是其他功能,都有相应的 npm 包可以实现。这使得将其他工具集成到应用程序中并获得所需的功能变得非常容易。例如,如果您希望添加表单验证,有一个简单的 npm 包可以实现;如果您想添加路由,也有一个简单的 npm 包。
📚三、React 与其他前端框架对比
📘1. Vue.js
🔖优点:
学习曲线较低:Vue 采用了基于模板的语法,类似于传统的 HTML 和 CSS,初学者更容易上手。例如,对于一些刚接触前端开发的人员来说,Vue 的语法直观易懂,能够快速构建出简单的页面。
渐进式框架:Vue 的设计理念是渐进式增强,可以根据项目需求灵活选择使用不同的特性和工具。这意味着开发者可以逐步引入 Vue 的功能,而不是一次性学习和使用整个框架。
丰富的生态:Vue 的官方插件和库相对较少,但质量较高,例如 Vue Router、Vuex、Element UI 等,可以满足大部分开发需求。同时,Vue 的社区也在不断发展,有很多第三方库可供选择。
🔖缺点:
社区资源相对较少:虽然 Vue 的社区在不断壮大,但与 React 相比,其社区资源相对较少。这可能导致在遇到一些复杂问题时,找到解决方案的难度较大。
企业支持较弱:相比 React 和 Angular,Vue 在企业级应用中的支持相对较弱。一些大型企业可能更倾向于使用 React 或 Angular,因为它们在企业级应用中有更成熟的解决方案和更多的支持。
📘2. React.js
🔖优点:
性能优秀:React 最初是为 Facebook 建造的,这意味着其工程师以各种方式对其进行了优化。即使在网络繁忙的情况下,React 也能确保完美的性能。它通过引入虚拟 DOM 的概念,安插在 JavaScript 逻辑和实际的 DOM 之间,最大限度地减少了与 DOM 的交互,从而提高了性能。
社区庞大:React 拥有庞大的开发者社区,社区成员数量众多,教程、博客、插件和工具等资源丰富。这使得开发者在遇到问题时能够更容易地找到解决方案,同时也促进了 React 生态系统的不断发展。
灵活性高:React 本身只关注 UI 层,开发者可以自由选择其他库和工具来搭配使用,灵活性高。例如,可以根据项目需求选择不同的状态管理库、路由库等。
🔖缺点:
学习曲线较陡:React 的学习曲线相对较陡,特别是对于不熟悉函数式编程和 JSX 的开发者来说。JSX 是一种 JavaScript 的扩展语法,需要一定的时间来适应。同时,React 的概念和 API 也相对较多,需要花费一定的时间来学习和理解。
工具链复杂:React 的工具链相对复杂,需要使用一些工具来进行开发、构建和测试。例如,需要使用 Webpack 或 Babel 来进行构建,使用 Jest 或 Enzyme 来进行测试。这对于一些新手开发者来说可能会有一定的难度。
📘3. Angular
🔖优点:
功能齐全:Angular 是一个全面的框架,提供了开发 SPA 所需的一切,如数据绑定、依赖注入、路由等。这使得开发者可以在一个框架内完成整个应用的开发,而不需要引入其他的库或工具。
类型安全:Angular 使用 TypeScript 进行开发,这为开发者提供了静态类型检查,可以提前发现和修复错误。这有助于提高代码的质量和可维护性。
企业支持强:Angular 由 Google 开发和维护,有强大的企业支持。这意味着在企业级应用中,Angular 有更成熟的解决方案和更多的支持。
🔖缺点:
学习难度大:对于新手来说,Angular 的学习曲线可能会比较陡峭,尤其是对于不熟悉 TypeScript 和 MVVM 的开发者。Angular 的概念和 API 相对较多,需要花费一定的时间来学习和理解。
性能问题:对于复杂的页面和大型项目,Angular 可能会遇到性能问题。这主要是因为 Angular 的框架本身比较庞大,同时也因为它的一些特性(如双向数据绑定)可能会导致性能下降。
📚四、React 的常见问题及解决方案
📘1. 开发服务器无法启动
如果遇到开发服务器无法启动的情况,可以尝试重新安装依赖项,参考官方文档故障排除指南。例如,在命令行中运行npm install重新安装项目的所有依赖。如果问题仍然存在,可以仔细检查项目的配置文件,确保没有错误的设置。同时,也可以查看系统环境变量是否正确配置,以及是否有其他软件与开发服务器产生冲突。
📘2. CSS 样式无法生效
当 CSS 样式无法生效时,可以采取以下措施。首先,确保使用className属性设置组件样式类,而不是传统的class属性。例如:
import styles from './styles.module.css';
// 在组件中使用 className
<div className={styles.container}>...</div>
同时,要确保正确引入 CSS 文件。如果使用 CSS 模块,需要将 CSS 文件的扩展名更改为.module.css,并在组件中正确导入。如果在 webpack 配置 “css/less” 文件的 loader 时,默认不开启模块化,这种模块化方式引入需要更改下 webpack 的 loader 配置,修改内容为 “modules:true”。另外,还可以使用一些工具来解决 CSS 样式组合时的问题,比如使用classnames中间件来组合静态样式和动态样式,避免样式失效的情况。
📘3. 组件无法渲染
如果组件无法渲染,可以从以下几个方面进行检查。首先,检查组件导入路径是否正确,确保路径与实际文件位置一致。例如:
import MyComponent from ‘./MyComponent’;
其次,检查组件名称拼写是否正确,避免因拼写错误导致无法找到组件。最后,检查 JSX 语法是否正确,包括标签的闭合、属性的设置等。如果仍然无法解决问题,可以查看控制台的错误信息,以便更准确地定位问题所在。
五、React 的应用场景
📚五、React 的应用场景
📘1. 单页应用(SPA)
React 在单页应用中具有显著优势,能够提供流畅的用户体验,减少页面刷新,提高响应速度。通过组件化的开发模式,React 可以将复杂的单页应用拆分成多个独立的组件,每个组件负责特定的功能和界面展示。这样不仅提高了代码的可维护性和可复用性,还使得开发过程更加高效。
例如,在一个电商单页应用中,商品列表、购物车、用户信息等部分都可以作为独立的组件进行开发。当用户在页面上进行操作时,React 能够快速更新相应的组件,而无需刷新整个页面,从而提供了更加流畅的用户体验。
📘2. 移动应用
React Native 是构建跨平台移动应用的强大工具。它允许开发者使用 JavaScript 和 React 的语法来开发移动应用,同时可以直接访问原生的 API,实现与原生应用类似的效果。
例如,使用 React Native 可以构建出类似于 Instagram、Discord 等知名移动应用。通过 React Native,开发者可以在 iOS 和 Android 两个平台上共享大部分代码,极大地提高了开发效率,降低了开发成本。同时,React Native 还提供了丰富的组件和 API,使得开发者可以轻松地实现各种功能,如相机、地理位置、推送通知等。
📘3. 渐进式 Web 应用(PWA)
React 可以利用现代 Web 技术,构建可离线使用的渐进式 Web 应用。通过 Service Worker 的支持,PWA 可以在用户首次访问时缓存应用的资源,使得在没有网络连接的情况下,用户仍然可以访问部分或全部功能。
例如,一些新闻阅读类的 PWA 应用,用户可以在有网络时下载新闻内容,在无网络时进行阅读。此外,PWA 还可以提供类似原生应用的体验,如添加到主屏幕、推送通知等功能。参考项目如 react-progressive-web-app,它是一个基于 React 的开源项目,旨在帮助开发者构建渐进式 Web 应用。该项目提供了离线阅读应用、电子商务平台等应用案例,展示了 PWA 的强大功能。
📘4. 静态站点生成
React 可以生成静态 HTML 文件,适合内容驱动的网站。通过静态站点生成,网站的性能得到了极大的提升,同时也降低了服务器的负载。
例如,一些博客、文档类的网站可以使用 React 进行静态站点生成。在构建过程中,开发者可以将网站的内容和结构作为 React 组件进行开发,然后通过静态站点生成工具将其转换为静态 HTML 文件。这样,用户在访问网站时可以快速加载页面,提高了用户体验。
📘5. 组件库和设计系统
React 非常适合构建可复用的 UI 组件库。通过组件化的开发模式,开发者可以将常用的 UI 元素封装成组件,然后在不同的项目中进行复用。
例如,可能是最详细的 React 组件库搭建总结中提到了构建 React 组件库的过程。通过使用 ESLint、Commit Lint、TypeScript 等工具进行代码规范和检测,确保组件库的质量。同时,使用 docz 进行开发调试以及文档编写,使得组件库的开发更加高效。Arco 设计系统 React 组件库搭建与使用指南中也介绍了 Arco Design 的项目目录结构和配置文件,为构建组件库提供了参考。
📘6. 实时数据展示
React 可以结合实时通信技术,实现数据即时更新。例如,通过使用 WebSocket 等技术,可以实现服务器与客户端之间的实时通信,当服务器端的数据发生变化时,客户端可以及时收到更新并更新界面。
在一些金融交易、实时监控等应用场景中,实时数据展示非常重要。React 的高效性能和组件化开发模式使得开发者可以轻松地实现实时数据展示功能。
📘7. 服务器端渲染(SSR)
服务器端渲染可以提高首屏加载速度和 SEO 性能。在服务器端将 React 组件渲染成 HTML 字符串,然后将其发送到客户端,使得用户在首次访问页面时可以更快地看到内容。
例如,Next.js 最初主要用于服务端渲染,如今也支持静态站点生成以及其他渲染模式。2023 年,Next.js 引入了 React Server Components 这一功能,将 React 组件从客户端迁移到了服务端,实现了重大的范式转变。在一些内容比较重要的网站中,服务器端渲染可以确保搜索引擎能够更好地抓取页面内容,提高网站的 SEO 性能。
📚六、React 的学习教程
📘1. React 基础知识
介绍 React 的基本组件创建、属性与状态的使用、JSX 语法的运用以及生命周期管理。
React 的基本组件创建方式有函数式和类式两种。函数组件通常以大写字母开头,其本质就是一个 JavaScript 函数,接收 props 对象并返回一个 React 元素。例如:
function Welcome(props) {
return <h1>Hello, {props.name}!</h1>;
}
类组件则通过继承 React.Component 创建,必须提供有返回值的 render 方法来表示组件结构。例如:
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
属性(props)是组件的外部信息,用于传入组件的数据,是只读的,不能被组件修改。组件在出生时就存在 props,通过父组件传递过来。例如,可以在调用组件时传入键值对作为属性:
<HelloWorld name="李明"/>
<HelloWorld name={123}/>
<HelloWorld name={"Tim"}/>
<HelloWorld name={[1,2,3]}/>
var variable = "some value";
<HelloWorld name={variable}/>
var props={one:"123",two:321,};
<HelloWorld {...props} />
状态(state)是组件内部的数据存储,用于保存组件的状态信息。状态可以改变,当状态发生变化时,组件会重新渲染以反映最新的状态。例如:
class Counter extends React.Component {
constructor() {
super();
this.state = {count: 0};
}
addNum() {
this.setState({count: this.state.count + 1});
}
render() {
return (<div>
<span>数据:{this.state.count}</span>
<button onClick={this.addNum}>+1</button>
</div>);
}
}
React 的生命周期管理包括多个阶段。例如,componentWillMount 在组件渲染之前调用;componentDidMount 在第一次渲染之后调用;componentWillReceiveProps 在组件接收到一个新的 props 时调用;shouldComponentUpdate 判断组件是否更新;componentWillUpdate 组件即将更新时调用;componentDidUpdate 在组件完成更新后立即调用;componentWillUnmount 在组件移除之前调用。不过需要注意的是,一些生命周期方法在新的 React 版本中已被标记弃用,如 componentWillMount 和 componentWillReceiveProps,被新的方法所取代,主要原因是性能问题和新的异步渲染架构的影响。
📘2. 状态管理与响应式编程
讲解 React Hooks 的使用,包括管理状态和生命周期逻辑。
React Hooks 是 React 16.8 版本引入的新特性,它们可以让你在函数式组件中使用状态和其他 React 功能,而不需要编写类组件。常用的 Hooks 包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef 等。
useState 用于在函数式组件中添加局部状态。例如:
import React, { useState } from 'react';
function Counter() {
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(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
}, [count]);
return (<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count +1)}>Click me</button>
</div>);
}
useContext 用于在多级嵌套的组件中传递数据。例如:
import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');
function ThemedButton(props) {
const theme = useContext(ThemeContext);
return (<button {...props} style={{backgroundColor: theme.background}} />);
}
function Toolbar(props) {
return (<div>
<ThemedButton onClick={props.changeTheme}>Change Theme</ThemedButton>
</div>);
}
useReducer 是一种替代 useState 的方式,用于管理复杂的本地状态。例如:
import React, { useReducer } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, {count: 0});
return (<>Count: {state.count}<button onClick={() => dispatch({type: 'decrement'})}>-</button><button onClick={() => dispatch({type: 'increment'})}>+</button></>);
}
📘3. 案例解析
通过构建一个简单的待办事项应用,展示 React 的实际应用。
以下是一个简单的待办事项应用的示例,展示了 React 的基本组件创建、状态管理和 JSX 语法的运用。
首先,创建一个函数组件 TodoList,用于展示待办事项列表和添加新事项的功能。
import React, { useState } from 'react';
function TodoList() {
const [todos, setTodos] = useState([]);
const [newTodo, setNewTodo] = useState('');
const addTodo = () => {
if (newTodo.trim()!== '') {
setTodos([...todos, newTodo]);
setNewTodo('');
}
};
return (
<div>
<input
type="text"
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
/>
<button onClick={addTodo}>Add Todo</button>
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
</div>
);
}
export default TodoList;
在这个组件中,使用 useState 来管理两个状态:todos 用于存储待办事项列表,newTodo 用于存储用户输入的新事项。当用户在输入框中输入内容并点击 “Add Todo” 按钮时,调用 addTodo 函数,将新事项添加到 todos 列表中,并清空输入框。
然后,可以在另一个组件中引入 TodoList 组件进行渲染。
import React from 'react';
import TodoList from './TodoList';
function App() {
return (
<div>
<h1>Todo App</h1>
<TodoList />
</div>
);
}
export default App;
通过这个简单的待办事项应用,我们可以看到 React 的组件化开发模式、状态管理和 JSX 语法的实际应用。可以根据实际需求进一步扩展这个应用,例如添加删除事项、标记完成状态等功能。
到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。
更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作