当前位置: 首页 > article >正文

React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术

React设计模式:提升代码架构的艺术

引言

在React开发中,设计模式是构建可维护、可扩展和高性能应用的关键。随着应用复杂性的增加,掌握高级设计模式不仅是技术上的挑战,更是打造优雅架构的艺术。对于有经验的开发者而言,设计模式不仅是工具,更是解决复杂问题的利器。

本文将深入探讨React的高级特性、性能优化和设计模式,涵盖高阶组件(HOC)、Render Props、Compound Components等核心模式,以及状态管理和模块化设计的最佳实践。通过一个可复用的Modal组件库案例和一个自定义表单组件库的练习,您将学会如何将这些模式应用于实际项目。此外,我们将对比各模式的优缺点,并展望2025年的技术趋势。希望这篇内容丰富、技术深入的文章能为您提供实用且前瞻性的指导!


1. 高阶组件(HOC)

高阶组件(HOC)是一种函数,它接受一个组件并返回一个增强后的新组件,用于封装可复用的逻辑,如认证、数据获取或日志记录。

1.1 概念和基本用法

HOC的核心是将通用逻辑从组件中抽离出来,增强组件功能而无需修改其内部代码。

function withLogging(WrappedComponent) {return function LoggingComponent(props) {console.log('Props:', props);return <WrappedComponent {...props} />;};
}function MyComponent({ name }) {return <div>你好,{name}</div>;
}const EnhancedComponent = withLogging(MyComponent);// 使用
<EnhancedComponent name="张三" />
  • withLogging:在组件渲染前记录props。
  • WrappedComponent:被增强的原始组件。

1.2 应用场景和示例

场景1:用户认证

假设我们需要限制某些组件仅对已登录用户可见:

function withAuth(WrappedComponent) {return function AuthComponent(props) {const isAuthenticated = useAuth(); // 假设useAuth返回认证状态return isAuthenticated ? <WrappedComponent {...props} /> : <div>请登录</div>;};
}const ProtectedPage = withAuth(({ data }) => <div>受保护的内容:{data}</div>);
场景2:数据获取

为组件添加数据加载逻辑:

function withDataFetching(WrappedComponent) {return function DataFetchingComponent(props) {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {fetch('/api/data').then(res => res.json()).then(setData).finally(() => setLoading(false));}, []);return loading ? <div>加载中...</div> : <WrappedComponent data={data} {...props} />;};
}const DataDisplay = withDataFetching(({ data }) => <div>{data.name}</div>);

1.3 优缺点分析

  • 优点
    • 逻辑复用:将认证或数据加载等逻辑集中在一个地方。
    • 解耦:原始组件无需关心增强逻辑。
  • 缺点
    • 嵌套地狱:多个HOC组合可能导致组件树复杂。
    • 命名冲突:props可能被意外覆盖。

2. Render Props

Render Props通过一个prop(通常是函数)动态决定组件的渲染内容,提供对UI组合的细粒度控制。

2.1 概念和基本用法

Render Props的核心是“渲染即函数”,允许组件消费者决定如何使用共享状态。

function MouseTracker({ render }) {const [position, setPosition] = useState({ x: 0, y: 0 });useEffect(() => {const handleMouseMove = (e) => setPosition({ x: e.clientX, y: e.clientY });window.addEventListener('mousemove', handleMouseMove);return () => window.removeEventListener('mousemove', handleMouseMove);}, []);return render(position);
}function App() {return (<MouseTrackerrender={(position) => <div>鼠标位置: {position.x}, {position.y}</div>}/>);
}
  • render:接收鼠标位置并返回自定义UI。

2.2 应用场景和示例

场景1:动态列表渲染

共享数据并自定义渲染:

function DataList({ items, render }) {return <ul>{items.map((item, index) => render(item, index))}</ul>;
}function App() {const items = ['苹果', '香蕉', '橙子'];return (<DataListitems={items}render={(item, index) => <li key={index}>{index + 1}. {item}</li>}/>);
}
场景2:表单验证

封装验证逻辑并暴露值:

function FormField({ initialValue, validator, render }) {const [value, setValue] = useState(initialValue);const error = validator(value);return render({ value, setValue, error });
}function App() {return (<FormFieldinitialValue=""validator={(val) => (val.length < 3 ? '至少3个字符' : '')}render={({ value, setValue, error }) => (<div><input value={value} onChange={(e) => setValue(e.target.value)} />{error && <span>{error}</span>}</div>)}/>);
}

2.3 优缺点分析

  • 优点
    • 灵活性:消费者完全控制渲染逻辑。
    • 扁平结构:避免HOC的嵌套问题。
  • 缺点
    • 回调嵌套:多个Render Props可能导致复杂性。
    • 学习曲线:对新手不够直观。

3. Compound Components

Compound Components通过隐式状态共享,使一组组件协同工作,模仿HTML的自然组合。

3.1 概念和基本用法

使用React的children API和上下文机制实现组件间的状态共享。

function Tabs({ children }) {const [activeTab, setActiveTab] = useState(0);return (<div>{React.Children.map(children, (child, index) =>React.cloneElement(child, { isActive: index === activeTab, onSelect: () => setActiveTab(index) }))}</div>);
}function Tab({ isActive, onSelect, children }) {return (<button onClick={onSelect} style={{ fontWeight: isActive ? 'bold' : 'normal' }}>{children}</button>);
}function App() {return (<Tabs><Tab>标签 1</Tab><Tab>标签 2</Tab><Tab>标签 3</Tab></Tabs>);
}
  • Tabs:管理状态并传递给子组件。
  • Tab:根据状态渲染并触发事件。

3.2 应用场景和示例

场景1:下拉菜单

实现一个可复用的菜单系统:

function Dropdown({ children }) {const [isOpen, setIsOpen] = useState(false);return (<div>{React.Children.map(children, child => React.cloneElement(child, { isOpen, toggle: () => setIsOpen(!isOpen) }))}</div>);
}function Trigger({ toggle, children }) {return <button onClick={toggle}>{children}</button>;
}function Content({ isOpen, children }) {return isOpen ? <div>{children}</div> : null;
}function App() {return (<Dropdown><Trigger>点击我</Trigger><Content>下拉内容</Content></Dropdown>);
}
场景2:表单组

组合输入和标签:

function FormGroup({ children }) {const [values, setValues] = useState({});return (<div>{React.Children.map(children, child => React.cloneElement(child, { values, setValues }))}</div>);
}function Input({ name, values, setValues }) {return (<inputvalue={values[name] || ''}onChange={(e) => setValues({ ...values, [name]: e.target.value })}/>);
}function App() {return (<FormGroup><Input name="username" /><Input name="email" /></FormGroup>);
}

3.3 优缺点分析

  • 优点
    • 直观性:类似HTML的声明式用法。
    • 状态共享:简化父子通信。
  • 缺点
    • 依赖性:子组件依赖父组件上下文。
    • 灵活性有限:不适用于非父子关系。

4. 状态管理模式

状态管理是React应用的核心。以下探讨两种常见模式:状态机和单向数据流。

4.1 状态机

状态机通过有限状态和明确转换规则管理复杂逻辑。

基本用法
import { useReducer } from 'react';const initialState = { status: 'idle', data: null, error: null };function reducer(state, action) {switch (action.type) {case 'fetch':return { ...state, status: 'loading' };case 'success':return { ...state, status: 'success', data: action.payload };case 'error':return { ...state, status: 'error', error: action.payload };default:return state;}
}function DataFetcher() {const [state, dispatch] = useReducer(reducer, initialState);const fetchData = () => {dispatch({ type: 'fetch' });fetch('/api/data').then(res => res.json()).then(data => dispatch({ type: 'success', payload: data })).catch(err => dispatch({ type: 'error', payload: err.message }));};return (<div><button onClick={fetchData}>获取数据</button>{state.status === 'loading' && <div>加载中...</div>}{state.status === 'success' && <div>数据: {state.data.name}</div>}{state.status === 'error' && <div>错误: {state.error}</div>}</div>);
}
  • reducer:定义状态转换逻辑。
  • dispatch:触发状态变更。
应用场景
  • 异步操作:如数据获取或文件上传。
  • 多步骤流程:向导或注册流程。
  • 复杂UI:如游戏状态管理。
优缺点
  • 优点
    • 可预测性:状态转换明确。
    • 调试性:易于追溯问题。
  • 缺点
    • 复杂性:需要设计状态图。
    • 冗余代码:简单场景下显得繁琐。

4.2 单向数据流

React的单向数据流通过props向下传递数据,事件向上触发更新。

基本用法
function Parent() {const [count, setCount] = useState(0);return <Child count={count} onIncrement={() => setCount(count + 1)} />;
}function Child({ count, onIncrement }) {return (<div><div>计数: {count}</div><button onClick={onIncrement}>递增</button></div>);
}
  • count:父组件状态通过props传递。
  • onIncrement:子组件通过回调更新状态。
应用场景
  • 受控组件:表单输入。
  • 列表渲染:动态数据展示。
  • 事件处理:用户交互。
优缺点
  • 优点
    • 简单性:数据流向清晰。
    • 一致性:状态更新可追踪。
  • 缺点
    • props穿透:深层组件需逐级传递。
    • 扩展性:复杂应用需额外工具。

5. 模块化设计:构建组件库

模块化设计通过创建可复用的组件库提升开发效率和代码质量。

5.1 设计原则

  • 单一职责:每个组件专注于一个功能。
  • 可组合性:组件易于组合使用。
  • 可定制性:支持主题和样式扩展。
  • 文档化:提供清晰的API说明。

5.2 案例:可复用的Modal组件库

需求
  • 支持打开/关闭。
  • 可定制标题、内容和按钮。
  • 包含遮罩和动画。
实现
import { useState } from 'react';function Modal({ isOpen, onClose, title, children, footer }) {if (!isOpen) return null;return (<div className="modal-overlay" onClick={onClose} style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, background: 'rgba(0,0,0,0.5)' }}><div className="modal" onClick={(e) => e.stopPropagation()} style={{ background: 'white', padding: '20px', margin: 'auto', maxWidth: '500px' }}><h2>{title}</h2><div>{children}</div><div>{footer || <button onClick={onClose}>关闭</button>}</div></div></div>);
}function App() {const [isOpen, setIsOpen] = useState(false);return (<div><button onClick={() => setIsOpen(true)}>打开模态框</button><ModalisOpen={isOpen}onClose={() => setIsOpen(false)}title="欢迎"footer={<button onClick={() => setIsOpen(false)}>确认</button>}><p>这是模态框内容。</p></Modal></div>);
}
  • Modal:根据isOpen渲染,包含遮罩和内容。
  • App:控制模态框的显示状态。
增强功能
  • 动画:使用CSS过渡效果。
  • 键盘支持:监听Esc键关闭。
  • 主题化:通过props传入样式。

5.3 实践意义

  • 复用性:在多个项目中重用Modal。
  • 维护性:集中管理模态框逻辑。

6. 练习:打造自定义表单组件库

通过构建一个表单组件库,实践模块化设计。

6.1 需求

  • 组件:Form、Input、Select、Button。
  • 功能:验证、提交处理。

6.2 实现

Form组件
function Form({ onSubmit, children }) {const handleSubmit = (e) => {e.preventDefault();onSubmit();};return <form onSubmit={handleSubmit}>{children}</form>;
}
Input组件
function Input({ name, value, onChange, validator }) {const [error, setError] = useState('');const handleChange = (e) => {const newValue = e.target.value;onChange(newValue);if (validator) setError(validator(newValue));};return (<div><input name={name} value={value} onChange={handleChange} />{error && <span style={{ color: 'red' }}>{error}</span>}</div>);
}
Select组件
function Select({ name, value, onChange, options }) {return (<select name={name} value={value} onChange={(e) => onChange(e.target.value)}>{options.map(opt => (<option key={opt.value} value={opt.value}>{opt.label}</option>))}</select>);
}
集成
function App() {const [formData, setFormData] = useState({ name: '', type: 'fruit' });const handleSubmit = () => console.log('提交:', formData);return (<Form onSubmit={handleSubmit}><Inputname="name"value={formData.name}onChange={(val) => setFormData({ ...formData, name: val })}validator={(val) => (val ? '' : '名称必填')}/><Selectname="type"value={formData.type}onChange={(val) => setFormData({ ...formData, type: val })}options={[{ value: 'fruit', label: '水果' },{ value: 'vegetable', label: '蔬菜' },]}/><button type="submit">提交</button></Form>);
}

6.3 分析

  • 复用性:组件可独立使用。
  • 扩展性:易于添加新字段。
  • 用户体验:实时验证提升交互。

7. 对比和选择模式

7.1 HOC vs. Render Props

  • HOC:适合逻辑复用,但可能导致嵌套问题。
  • Render Props:适合自定义UI,但回调可能复杂。
选择建议
  • 逻辑优先:用HOC。
  • 渲染优先:用Render Props。

7.2 Compound Components vs. 传统Props

  • Compound Components:适合UI套件,但依赖父组件。
  • 传统Props:更灵活,但可能冗长。
选择建议
  • 紧密协作:用Compound Components。
  • 独立组件:用传统Props。

8. 未来趋势:2025年展望

  • AI辅助:自动生成和优化模式。
  • Server Components:服务端渲染提升性能。
  • 微前端:模块化设计支持分布式开发。
  • 无代码:设计模式融入可视化工具。

结语

React设计模式为开发者提供了强大的工具,从高阶组件到模块化设计,每种模式都有其独特价值。通过案例和练习,您可以将理论转化为实践。希望本文能助您打造优雅、高效的React应用!

相关文章:

React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术

React设计模式&#xff1a;提升代码架构的艺术 引言 在React开发中&#xff0c;设计模式是构建可维护、可扩展和高性能应用的关键。随着应用复杂性的增加&#xff0c;掌握高级设计模式不仅是技术上的挑战&#xff0c;更是打造优雅架构的艺术。对于有经验的开发者而言&#xf…...

【GitHub开源AI精选】WhisperX:70倍实时语音转录、革命性词级时间戳与多说话人分离技术

系列篇章&#x1f4a5; No.文章1【GitHub开源AI精选】LLM 驱动的影视解说工具&#xff1a;Narrato AI 一站式高效创作实践2【GitHub开源AI精选】德国比勒费尔德大学TryOffDiff——高保真服装重建的虚拟试穿技术新突破3【GitHub开源AI精选】哈工大&#xff08;深圳&#xff09;…...

【leetcode】459.重复的子字符串

文章目录 题目题解枚举 题目 459.重复的子字符串 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入…...

华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《文件目录大小》: 目录 题…...

【Java】mybatis-plus乐观锁与Spring重试机制

上一篇【Java】mybatis-plus乐观锁-基本使用 讲到了mybatis-plus的基本使用&#xff0c;简单的使用Version和一个基础配置类即可实现乐观锁。 但是mybatis-plus本身并没有自带重试机制。 即当我们带上版本号去更新数据&#xff0c;但是由于另一个线程已经将版本号修改了&#x…...

Linux 与 Windows:哪个操作系统适合你?

Linux vs Windows:系统选择的关键考量 在数字化转型浪潮中,操作系统作为底层基础设施的重要性日益凸显。Linux与Windows作为主流选择,其差异不仅体现在技术架构上,更深刻影响着开发效率、运维成本与安全性。本文将从​​7个核心维度​​展开对比分析,并提供典型应用场景建…...

C#委托的概念与使用方法

一、委托的基本概念 委托是一种引用类型&#xff0c;它允许将方法作为参数进行传递。简单来说&#xff0c;委托就像是对方法的引用&#xff0c;可以通过委托来调用对应的方法。 委托具有类型安全性&#xff0c;它会检查方法的签名是否与委托的签名匹配&#xff0c;这有助于避免…...

消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径

摘要&#xff1a;在信息爆炸与消费理性化趋势下&#xff0c;消费者从被动接受转向主动筛选&#xff0c;企业营销模式面临重构挑战。本文提出开源AI智能名片与链动21模式S2B2C商城小程序的协同创新框架&#xff0c;通过AI驱动的精准触达、链动裂变机制与S2B2C生态赋能&#xff0…...

软考 系统架构设计师系列知识点之杂项集萃(78)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;77&#xff09; 第139题 以下关于软件测试工具的叙述&#xff0c;错误的是&#xff08;&#xff09;。 A. 静态测试工具可用于对软件需求、结构设计、详细设计和代码进行评审、走查和审查 B. 静…...

解决MyBatis参数绑定中参数名不一致导致的错误问题

前言 作为一名Java开发者&#xff0c;我在实际项目中曾多次遇到MyBatis参数绑定的问题。其中最常见的一种情况是&#xff1a;在Mapper接口中定义的参数名与XML映射文件中的占位符名称不一致&#xff0c;导致运行时抛出Parameter xxx not found类异常。这类问题看似简单&#x…...

如何解决MySQL Workbench中的错误Error Code: 1175

错误描述&#xff1a; 在MySQL Workbench8.0中练习SQL语句时&#xff0c;执行一条update语句&#xff0c;总是提示如下错误&#xff1a; Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnTo disab…...

Docker 镜像(或 Docker 容器)中查找文件命令

在 Docker 镜像&#xff08;或 Docker 容器&#xff09;中运行如下两个命令时&#xff1a; cd / find . -name generate.py它们的含义如下&#xff0c;我们来一行一行详细拆解&#xff0c;并结合例子讲解&#xff1a; ✅ 第一行&#xff1a;cd / ✅ 含义 cd 是“change dire…...

MySQL进阶篇(存储引擎、索引、视图、SQL性能优化、存储过程、触发器、锁)

MySQL进阶篇 存储引擎篇MySQL体系结构存储引擎简介常用存储引擎简介存储引擎的选择 索引篇索引简介索引结构(1)BTree索引(2)hash索引 索引分类索引语法SQL性能分析指标(1)SQL执行频率(2)慢查询日志(3)profile详情(4)explain或desc执行计划 索引使用引起索引的失效行为SQL提示覆…...

python批量解析提取word内容到excel

# 基于Python实现Word文档内容批量提取与Excel自动化存储 ## 引言 在日常办公场景中&#xff0c;常需要从大量Word文档中提取结构化数据并整理到Excel表格中。传统手动操作效率低下&#xff0c;本文介绍如何通过Python实现自动化批处理&#xff0c;使用python-docx和openpyxl…...

BugKu Web渗透之game1

启动场景&#xff0c;打开网页如下&#xff1a; 是一个游戏。 步骤一&#xff1a; 右键查看源代码也没有发现异常。 步骤二&#xff1a; 点击开始游戏来看看。 结果他是这种搭高楼的游戏。我玩了一下子&#xff0c;玩到350分就game over。 之后就显示游戏结束&#xff0c;如…...

使用Composer创建公共类库

概述 如果多个项目中存在使用相同类库、模块的情况&#xff0c;此时可以考虑将类库或者模块单独抽取出来&#xff0c;形成独立类库&#xff0c;通过composer 来进行依赖管理&#xff0c;这样可以更方便维护&#xff0c;大大提升开发效率。 优势 可以对特定模块进行统一维护和…...

Axure设计案例——科技感渐变柱状图

想让你的数据展示瞬间脱颖而出&#xff0c;成为众人瞩目的焦点吗&#xff1f;快来看看这个 Axure 设计的科技感渐变柱状图案例&#xff01;科技感设计风格以炫酷的渐变色彩打破传统柱状图的单调&#xff0c;营造出一种令人惊叹的视觉盛宴。每一个柱状体都仿佛蕴含着无限能量&am…...

LeetCode 热题 100 394. 字符串解码

LeetCode 热题 100 | 394. 字符串解码 大家好&#xff01;今天我们来探讨一道非常有趣的算法题目——LeetCode 394. 字符串解码。这道题考察了我们对栈这种数据结构的理解和应用能力&#xff0c;同时也涉及到了字符串的处理技巧。接下来&#xff0c;我将详细地为大家解析这道题…...

互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台

互联网大厂 字节扣子、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台 体验 开始动手 了解 智能体&#xff0c;发现已经落后时代太远 光头部互联网大厂对开 公开的平台就已经这么多&#xff0c;可以学习和了解&#xff0c;相关的信息 整理了对应的平台地址…...

深入解析ReactJS中JSX的底层工作原理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应

亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应 如果说我们之前讨论的安全措施(如 IAM、网络策略、密钥管理、漏洞补丁)是为我们的“数字城堡”修筑坚固的城墙、设置精密的门锁、定期检查和修补潜在的裂缝,那么安全日志就像是遍布城堡内外的监控摄像头和出入登记簿,…...

NodeMediaEdge任务管理

NodeMediaEdge任务管理 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 在未使用NodeMediaServer的情况下&#xff0c;或是对部分视频流需要单独推送的需求&#xff0c;也可…...

LIMIT 和 OFFSET 在大数据量下的性能问题分析与优化方案

LIMIT 和 OFFSET 在大数据量下的性能问题分析与优化方案 一、基础概念与工作原理 1.1 LIMIT/OFFSET 语法解析 LIMIT和OFFSET是SQL中用于分页查询的关键子句: Ai专栏:https://duoke360.com/tutorial/path/ai-lm SELECT * FROM large_table ORDER BY id LIMIT 10 OFFSET 1…...

SpringBoot集成第三方jar的完整指南

原文地址&#xff1a;https://blog.csdn.net/weixin_43826336/article/details/141640152?ops_request_misc%257B%2522request%255Fid%2522%253A%25227d4118ef2d572ba4428caf83f1d2bb28%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id7d4118…...

登高架设作业实操考试需要注意哪些安全细节?

在登高架设作业实操考试中&#xff0c;安全细节是考官重点考察的内容&#xff0c;任何疏忽都可能导致扣分甚至直接判定不合格。以下是必须注意的关键安全细节&#xff0c;按考试流程分类整理&#xff1a; 一、个人防护装备&#xff08;PPE&#xff09;检查与穿戴 安全带 必须…...

前端基础之《Vue(18)—路由知识点》

一、两种路由模式 1、hash路由 &#xff08;1&#xff09;url中有#号&#xff0c;背后是监听onhashchange事件 &#xff08;2&#xff09;hash路由部署上线不会出现404问题&#xff0c;背后是基于history api实现的 2、history路由 &#xff08;1&#xff09;url中没有#号 &a…...

014校园管理系统技术解析:构建智慧校园管理平台

校园管理系统技术解析&#xff1a;构建智慧校园管理平台 在教育信息化快速发展的当下&#xff0c;校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块&#xff0c;面向管理员、用户和院内管理员三种角色&#xff0c;通过…...

微服务各个部分的作用

微服务架构将复杂应用拆分为多个独立、可部署的小型服务&#xff0c;每个服务实现特定业务功能。以下是微服务架构中核心组成部分及其作用&#xff1a; 一、服务层&#xff08;微服务本身&#xff09; 作用&#xff1a; 实现独立业务逻辑&#xff1a;每个微服务专注于单一业…...

SQLite详细解读

一、SQLite 是什么&#xff1f; SQLite 是一个嵌入式关系型数据库管理系统&#xff08;RDBMS&#xff09;。它不是像 MySQL 或 PostgreSQL 那样的客户端-服务器数据库引擎&#xff0c;而是一个自包含的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 核心特点 嵌入式/库…...

LRC and VIP

//首先排除所有数相等的情况,再把最大值放在一个组&#xff0c;那么最大值的gcd就等于其本身&#xff0c;再判断剩下的gcd是否等于最大值就可以了 #include<bits/stdc.h> using namespace std;const int N1e3100; int a[N]; map<int,int>mapp; int main(){int t;ci…...