React进阶之React状态管理CRA
React状态管理&CRA
- 状态管理
- 理论讲解
- 案例
- context 上下文
- 结合状态来维护todoList
- index.js
- App.js
- TaskList.js
- TasksContext.js
- AddTask.js
- Escape 脱围机制
- ref
- forwardRef(不建议使用)
- CRA
状态管理
理论讲解
如何针对 effect -> 对action的触发 -> 影响到UI
怎么针对上述链路进行更好的抽象
还有,redux,mobx,vuex,pinia
重要的就是:state
不维护好就会造成:
- 冗余代码
- 预期之外的触发action
- 代码可维护性更差
有限状态自动机:各种各样的状态管理,通过事件触发一个行为,行为是固定的,相同的输入指向相同的输出,类似于纯函数
组件之间传达状态的方式:
状态提升,parent <=> childA,childB
reducer,类似触发器,是处理状态变更的,将不同组件中的不同状态合并起来
useReducerconst [type,dispatch]=useReducer(typeReducer,initType )payload //荷载 rest函数创建出来的对象 { ...rest }
案例
举例:
- src
- App.js
- AddTask.js
- TaskList.js
App.js
import React, { useReducer } from 'react';
import AddTask from './AddTask';
import TaskList from './TaskList';// 初始任务
const initialTasks = [{ id: 0, text: '参观卡夫卡博物馆', done: true },{ id: 1, text: '看木偶戏', done: false },{ id: 2, text: '列依墙图片', done: false }
];// 任务Reducer
function tasksReducer(tasks, action) {switch (action.type) {case 'added':return [...tasks,{ id: action.id, text: action.text, done: false }];case 'changed':return tasks.map(t => t.id === action.task.id ? action.task : t);case 'deleted':return tasks.filter(t => t.id !== action.id);default:throw new Error('未知操作: ' + action.type);}
}export default function App() {// 状态维护的核心const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);// 添加任务function handleAddTask(text) {const newTask = { id: Date.now(), text }; // 使用时间戳作为IDdispatch({ type: 'added', ...newTask });}// 修改任务function handleChangeTask(task) {dispatch({ type: 'changed', task });}// 删除任务function handleDeleteTask(taskId) {dispatch({ type: 'deleted', id: taskId });}return (<div><h1>布拉格行程</h1><AddTask onAddTask={handleAddTask} /><TaskList tasks={tasks} onChangeTask={handleChangeTask}onDeleteTask={handleDeleteTask}/></div>);
}
AddTask.js
import React, { useState } from 'react';export default function AddTask({ onAddTask }) {const [text, setText] = useState('');// 处理输入框变化function handleChange(event) {setText(event.target.value);}// 提交表单function handleSubmit(event) {event.preventDefault();if (text.trim() !== '') {onAddTask(text);setText(''); // 清空输入框}}return (<div><input type="text" value={text} onChange={handleChange} placeholder="请输入任务" /><button onClick={handleSubmit}>添加任务</button></div>);
}
TaskList.js
import React, { useState } from 'react';export default function TaskList({ tasks, onChangeTask, onDeleteTask }) {return (<ul>{tasks.map(task => (<li key={task.id}><Tasktask={task}onChange={onChangeTask}onDelete={onDeleteTask}/></li>))}</ul>);
}function Task({ task, onChange, onDelete }) {const [isEditing, setIsEditing] = useState(false);const [newText, setNewText] = useState(task.text);let taskContent;if (isEditing) {taskContent = (<><inputtype="text"value={newText}onChange={e => setNewText(e.target.value)}/><button onClick={() => { onChange({ ...task, text: newText });setIsEditing(false);}}>保存</button></>);} else {taskContent = (<><inputtype="checkbox"checked={task.done}onChange={() => onChange({ ...task, done: !task.done })}/><span>{task.text}</span><button onClick={() => onDelete(task.id)}>删除</button><button onClick={() => setIsEditing(true)}>编辑</button></>);}return <div>{taskContent}</div>;
}
initType初始值,像是tasks列表,需要去维护的状态
,是状态集
的概念,不会区分谁是哪个状态
需要去修改这个数组的时候,才会去通过动作或者手段选取其中某条执行,这时候需要借助于action,通过action去找到某一条处理这个task
上述是比较简单的例子,如果在复杂情况的话,需要区分文件,那么文件列表可能是这样:
- src
- reducer
- dispatch.js
- action.js
- state.js
- reducer
context 上下文
在vdom中树状结构就是通过上下文去维护的
本质:递归
通过一个参数,parentId 传递给下面的child,他们之间有一个关联的脐带:contextId,找到roots之间的关联方式
在实际开发中,props层级超过一层的话,就不能再通过props来传递了,除非是一些特殊的情况
举例:
- src
- index.js
- App.js
- Section.js
- Heading.js
- LevelContext.js
- index.css
index.js
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App";const root = createRoot(document.getElementById("root"));
root.render(<StrictMode><App /></StrictMode>
);
App.js
import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section>{/* 当前层级下的level,根据最近层级下的provider去获取的 */}{/* level+1 => LevelContext.Provider value=1 */}<Heading>大标题</Heading><Section>{/* level+1 => LevelContext.Provider value=2 */}<Heading>二级标题</Heading><Heading>二级标题</Heading><Heading>二级标题</Heading><Section>{/* level+1 => LevelContext.Provider value=3 */}<Heading>三级标题</Heading><Heading>三级标题</Heading><Heading>三级标题</Heading></Section></Section></Section>);
}
Heading.js
import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';export default function Heading({ children }) {const level = useContext(LevelContext);switch(level) {case 0:throw new Error('标题必须在 section 内!');case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw new Error('未知级别:' + level);}
}
Section.js
import { useContext } from "react";
import { LevelContext } from './LevelContext.js';export default function Section({ children }) {const level = useContext(LevelContext);return (<section className="section"><LevelContext.Provider value={level + 1}>{children}</LevelContext.Provider></section>);
}
LevelContext.js
import { createContext, useState } from "react";export const LevelContext = createContext(0);
index.css
body {margin: 0;font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen','Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
}code {font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',monospace;
}.section{padding: 10px;margin: 10px;border: 1px solid #ccc;border-radius: 5px;
}
- 日常开发中,这里的reducer是和context并行去维护的
结合状态来维护todoList
- src
- index.js
- App.js
- TaskList.js
- TasksContext.js
- AddTask.js
index.js
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App";const root = createRoot(document.getElementById("root"));
root.render(<StrictMode><App /></StrictMode>
);
App.js
import AddTask from './AddTask.js';
import Tasklist from './TaskList.js';
import { TasksProvider } from './TasksContext.js';export default function App() {return (<TasksProvider><h1>在京都休息一天</h1><AddTask /><Tasklist /></TasksProvider>);
}
TaskList.js
import { useState, useContext } from 'react';
import { useTasks, useTasksDispatch } from "./TasksContext";export default function TaskList() {const tasks = useTasks();return (<ul>{tasks.map(task => (<li key={task.id}><Task task={task} /></li>))}</ul>);
}function Task({ task }) {const [isEditing, setIsEditing] = useState(false);const dispatch = useTasksDispatch();let taskContent;if (isEditing) {taskContent = (<><inputvalue={task.text}onChange={e => {dispatch({ type: 'changed', task: { ...task, text: e.target.value } });}}/><button onClick={() => setIsEditing(false)}>保存</button></>);} else {taskContent = (<>{task.text}<button onClick={() => setIsEditing(true)}>编辑</button></>)}return (<label><inputtype="checkbox"checked={task.done}onChange={e => {dispatch({ type: 'changed', task: { ...task, done: e.target.checked } });}}/>{taskContent}<button onClick={() => {dispatch({ type: 'deleted', id: task.id });}}>删除</button></label>);}
TasksContext.js
import { createContext, useContext, useReducer } from 'react';// 创建两个 context
const TasksContext = createContext(null);
const TasksDispatchContext = createContext(null);// 初始任务数据
const initialTasks = [{ id: 0, text: '哲学家之路', done: true },{ id: 1, text: '参观寺庙', done: false },{ id: 2, text: '喝抹茶', done: false }
];// 任务 reducer (用于更新任务状态)
function tasksReducer(tasks, action) {switch (action.type) {case 'added':return [...tasks,{id: action.id,text: action.text,done: false}];case 'changed':return tasks.map((t) => {if (t.id === action.task.id) {return action.task;} else {return t}});case 'deleted':return tasks.filter(t => t.id !== action.id);default:throw new Error('未知操作: ' + action.type);}
}// TasksProvider 组件,提供任务和 dispatch
export function TasksProvider({ children }) {const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);return (// 嵌套 Provider是非常常见的<TasksContext.Provider value={tasks}><TasksDispatchContext.Provider value={dispatch}>{children}</TasksDispatchContext.Provider></TasksContext.Provider>);
}// 自定义 Hook 用于获取任务数据
export function useTasks() {return useContext(TasksContext);
}// 自定义 Hook 用于获取 dispatch 函数
export function useTasksDispatch() {return useContext(TasksDispatchContext);
}
AddTask.js
import { useState } from 'react';
import { useTasksDispatch } from './TasksContext'; // 导入 dispatchexport default function AddTask({onAddTask}) {const [text, setText] = useState(''); // 管理输入框的文本状态const dispatch = useTasksDispatch(); // 获取 dispatch 函数const handleAddClick = () => {if (text.trim() === '') return; // 防止添加空任务setText(''); // 清空输入框dispatch({type: 'added', // 确保与 reducer 中的 action type 一致id: nextId++, // 使用 nextIdtext: text,});};return (<><inputplaceholder="添加任务"value={text}onChange={(e) => setText(e.target.value)} // 修正了 onChange 的语法错误/><button onClick={handleAddClick}>添加</button></>);
}let nextId = 3; // 初始 id,从 3 开始
// 嵌套 Provider是非常常见的
<TasksContext.Provider value={tasks}><TasksDispatchContext.Provider value={dispatch}>{children}</TasksDispatchContext.Provider>
</TasksContext.Provider>
场景:
ToB:微应用
- 全局注入:从主应用下发的,mainAppContext,包含 主应用的currentSubApp,当前子应用的信息,主应用注入到全局上的数据
- 当前应用/用户信息:user,permissions,menu菜单,针对当前登录用户的鉴权,权限处理,这里也会创建 PermissionContext状态/RBACContext 权限管理的状态,不同用户的权限看到不同的内容,使用前面说的Context维护
- 当前运行时态:主题包,i18n语法,pc/mobile runtimeContext运行时态下的
createModel:就是provider,只不过是封装了一层
状态库 hox
飞冰
飞冰状态管理
Hox 根节点不需要创建多个provider,只需要一个就够了,可以看看源码
Redux store就是state,provider就是通过useReducer创建的provider
Escape 脱围机制
ref
ref:值更新了,组件没更新。不会更新重新渲染,一般是在与视图更新无关的时候使用
尽量避免使用与交互无关的
可以通过 useRef 去创建一些新的 ref
const ref = useRef(123)
使用:ref.current
ref 的使用:
import { useRef } from 'react';export default function App() {let ref = useRef(0);// 使用useState创建的话,需要使用setState来触发,会导致重新渲染re-renderfunction handleClick() {//这里是js原生的,这块更新不会触发组件的更新,值更新了,组件没更新// ref能够脱逃到当前的状态下的,也就是说,不会导致重新渲染re-renderref.current = ref.current + 1alert('你点击了 ' + ref.current + ' 次!');}return (<button onClick={handleClick}>点击我!</button>)
}
state的使用:
// state使用
import { useState } from "react";export default function App() {const [count, setCount] = useState(0);function handleClick() {setCount(count + 1);}return (<button onClick={handleClick}>你点击了 {count} 次!</button>)
}
ref 和 state的区别:
-
ref 不会重新渲染,与视图无关的时候使用,如果与视图相关的使用ref,则不会达到想要的效果
// ref作与视图相关的 import { useRef } from "react";export default function App() {const count = useRef(0);//这里也可以使用useState,使用useState创建的话,需使用setState触发function handleClick() {count.current=count.current+1;}// 这里点击后触发,只是值更新了,组件没更新。setState会导致重新渲染re-render,但是ref不会return (<button onClick={handleClick}>你点击了 {count.current} 次!</button>) }
-
ref一般用来存储大对象
-
ref绑定到dom节点上
-
ref使用在,timeoutId定时器绑定
拓展:
在react 19中,ref 已经作为props参数去传递了
例如,操作dom的时候// ref 用作 props import { useRef } from "react"; export default function App() {const inputRef = useRef(null)function handleClick() {inputRef.current.focus()}return (<><input ref={inputRef} /><button onClick={handleClick}>聚焦输入框</button></>) }
scrollIntoView,打开某个页面后,翻到某个位置,重新刷新后,还能够定位到上次翻到的那个位置上,实现锚点效果
这里注意:img上绑定的ref必须在外层定义,这样才能使用到,如果在map等函数内部定义的ref,是不能使用的
export default function App() { const firstCatRef = useRef(null); const secondCatRef = useRef(null); const thirdCatRef = useRef(null);function handleScrollToFirstCat() {firstCatRef.current.scrollIntoView({behavior: 'smooth',block: "nearest",inline: "center"}); }function handleScrollToSecondCat() {secondCatRef.current.scrollIntoView({behavior: 'smooth',block: "nearest",inline: 'center'}); }function handleScrollToThirdCat() {thirdCatRef.current.scrollIntoView({behavior: 'smooth',block: 'nearest',inline: "center"}); }return (<><nav><button onClick={handleScrollToFirstCat}>Neo</button><button onClick={handleScrollToSecondCat}>Millie</button><button onClick={handleScrollToThirdCat}>Bella</button></nav><div style={{ overflowX: 'auto', whiteSpace: 'nowrap' }}><ul style={{ display: 'inline-flex', listStyle: 'none', padding: 0, margin: 0 }}><li style={{ marginRight: '10px' }}><imgsrc="https://placecats.com/neo/300/200"alt="Neo"ref={firstCatRef}/></li><li style={{ marginRight: '10px' }}><imgsrc="https://placecats.com/millie/300/200"alt="Millie"ref={secondCatRef}/></li><li><imgsrc="https://placecats.com/bella/300/200"alt="Bella"ref={thirdCatRef}/></li></ul></div></> ); }
在react整个执行机制中会有两个阶段:
- render 内存中渲染判断我们需要展示哪些节点
- commit 缓存,缓存给dom,告诉dom这次需要更新哪些东西。
因此,需要添加ref,必须保证是在commit阶段去添加的。ref必须关联在真实的节点上的,像这种,在物理空间中还没有存在真实的节点,ref是绑定不上的。
错误示例:
export function App(){xxxxxconst list=[1,2,3]return list.map((item)=>{const ref=useRef(item);console.log(ref.current)return <div ref={ref}>{item}</div>})
}
避免react副作用
react 性能优化:
re-render 减少re-render 减少setState触发,escape useState
类似 useMemo,useCallback,保证不会导致depends变化,
在react中,没有必要的状态更新就不要加在状态更新中
React 19中,React Compiler 平常代码中 useMemo,memo,useCallback就不用写了,自己实现了
尽可能保证当前状态和其他状态解耦,并不是所有场景都需要使用effect
forwardRef(不建议使用)
React 19中已经被废弃掉了,
官网
类似于HOC的方式
能够通过ref进行传参
如果在不同目录下,ref真正关联组件的节点是不清楚的
使用forwardRef可以,但是目录层级不能超过两层
新的项目不建议直接使用 mobx 和 redux,使用 reducer 和 useContext 这两个足够了
CRA
国内一般使用的是 CRA 和 vite 这两种
没有人用,没有人维护
怎样去做一套自己的脚手架?
- commander
- inquirer
CLI 使用命令行的交互方式,获取到 config,拿到config交由给node脚本执行
pnpx/npx create-react-app my-app
pnpm create vite vite-react
awesome vite
里面有 react 的各种模板,这是社区的模板,就不是官方内的模板
类似使用react里的的这个:
后台管理模板
CRA现在用的少了,大部分使用的是 vite
vite源码
相关文章:

React进阶之React状态管理CRA
React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef(不建议使用) CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...
攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...
前端开发环境
vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西,就说明好了 …...

Web自动化测试—测试用例流程设计
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...

HTML全局属性与Meta元信息详解:优化网页的灵魂
目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签:网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中,有一些属性和标签是全局性的,能够影响网页的多个方面,比如页面的…...

day001 折半查找/二分查找
day001 折半查找/二分查找 适用场景顺序表或者顺序数组 时间复杂度:log2N 算法思路 pre: 下限为0,上限为数组长度-1, 下限小于等于上限进行循环 if 比较目标值和中间值,if 大于: 则下限中间值索引1else: 小于: 则上限中间值索…...

Linux 资源监控:优化与跟踪系统性能
在 Evoxt,我们深知有效的 Linux 资源监控对于优化服务器性能至关重要。本指南将介绍关键工具和策略,帮助您监控 CPU、内存、磁盘和网络使用情况,确保您的 Linux 系统始终保持高效运行。 实时系统监控 使用 top(交互式系统监控&am…...

java安全中的类加载
java安全中的类加载 提前声明: 本文所涉及的内容仅供参考与教育目的,旨在普及网络安全相关知识。其内容不代表任何机构、组织或个人的权威建议,亦不构成具体的操作指南或法律依据。作者及发布平台对因使用本文信息直接或间接引发的任何风险、损失或法律纠…...
Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
在人工智能快速发展的今天,如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用,它通过调用硅基流动(SiliconFlow)的API接口,实现了与DeepSeek模型的智能对话…...

分布式服务框架 如何设计一个更合理的协议
1、概述 前面我们聊了如何设计一款分布式服务框架的问题,并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制,以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…...
Unity使用iTextSharp导出PDF-02基础结构及设置中文字体
基础结构 1.创建一个Document对象 2.使用PdfWriter创建PDF文档 3.打开文档 4.添加内容,调用文档Add方法添加内容时,内容写入到输出流中 5.关闭文档 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…...
Kafka因文件句柄数过多导致挂掉的排查与解决
一、问题现象 在k8s集群中部署了多个服务,包括Kafka、TDengine集群和Java等。这些服务使用NFS作为持久化存储方案。最近遇到了一个问题:Kafka频繁报错并最终挂掉。错误日志如下: 2025-02-09T09:39:07,022] INF0 [LogLoader partition__cons…...
【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离
多维动态规划 机器人路径问题思路代码实现 最小路径和问题动态规划思路状态转移方程边界条件 代码实现 最长回文子串思路代码实现 最长公共子序列(LCS)题目描述解决方案 —— 动态规划1. 状态定义2. 状态转移方程3. 初始化4. 代码实现 编辑距离ÿ…...
PRC框架-Dubbo
RPC框架 RPC(Remote Procedure Call,远程过程调用)框架是一种允许客户端通过网络调用服务器端程序的技术。以下是常见的RPC框架及其特点: 1. 基于HTTP/REST的RPC框架 特点:简单易用,与Web开发无缝集成&am…...

智能检测摄像头模块在客流统计中的应用
工作原理 基于视频分析技术:智能检测摄像头模块通过捕捉监控区域内的视频画面,运用图像识别算法对视频中的人体进行检测、跟踪和分析。可以识别出人体的轮廓、姿态等特征,进而区分不同的个体,实现对客流的统计。 基于红外感应技…...

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别
一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语(input prompt)以获得更优模型效果的技术。举个例子,如果我们想将一条英语句子翻译成德语,可以采用多种不同的方式向模型提问,如下图所示…...

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS
本篇,将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手,实现效果: U盘,识别效果: 一、简述 上…...
在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame)还有什么?
在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame),还有其他一些与方法调用相关的重要信息。栈的主要作用是存储方法调用的执行过程中的上下文信息,栈帧是其中最关键的组成部分。 栈的组成 栈帧&am…...
# 解析Excel文件:处理Excel xlsx file not supported错误 [特殊字符]
解析Excel文件:处理Excel xlsx file not supported错误 🧩 嘿,数据分析的小伙伴们!👋 我知道在处理Excel文件的时候,很多人可能会遇到这样一个错误:Excel xlsx file not supported。别担心&…...
图片下载不下来?即便点了另存为也无法下载?两种方法教你百分之百下载下来
前言,我要讲的是网站没有禁鼠标右键,可以右键,也可以打开控制台,图片也不用付费这种。 一、用鼠标按住图片直接往桌面拖动,也可以打开开发者工具,在里面往外拖。 二、这个方法很有意思,在电脑的…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...