【React 进阶】掌握 React18 全部 Hooks
一、数据更新驱动
1. useState
1. 基础介绍
useState主要用于声明和操作状态变量,可以使函数组件像类组件一样拥有state
const [state, setState] = useState(initialState);
state:状态,作为渲染视图的数据源
setState:改变state的函数。可以直接传递新状态,也可以传递一个根据先前状态来计算新状态的函数(函数式更新)
initialState:初始化值。如果是函数,则将函数的返回值作为初始值
2. 直接传递新状态
点击按钮,count变为1
import { useState } from "react";function App() {const [count, setCount] = useState(0);return (<div>{count}<buttononClick={() => {setCount(1);}}>按鈕</button></div>);
}export default App;
3. 函数式更新
根据先前的state更新state。将按钮中的setCount调用方式改为:
setCount((prev) => prev + 1);
4. 使用场景:使用key重置状态
会有这么一种业务场景:在一系列筛选或输入后面,增加重置按钮
如果是受控组件,我们可以将值置空。如果是非受控组件,我们可以使用key重置组件的状态
import { useState } from "react";export default function App() {const [version, setVersion] = useState(0);const handleReset = () => {setVersion(version + 1);};return (<><button onClick={handleReset}>重置</button><Form key={version} /></>);
}const Form = () => {const hanlderSubmit = (e: React.FormEvent<HTMLFormElement>) => {e.preventDefault();console.log(e.target);};return (<><form onSubmit={hanlderSubmit}><input type="text" name="user" /><input type="password" name="password" /><button type="submit">提交</button></form></>);
};
5. 注意事项
(1)set函数是异步的,调用set函数后,不能立即获取最新的值
const handleClick = () => {setCount(count + 1); //setCount(0+1)console.log(count); //0
};
(2)获取的是渲染时候的值
即使2s后打印,但当时读取count的时候,count值为0,因此打印出来的结果也为0。可以理解为渲染快照
const handleClick = () => {setCount(count + 1); //setCount(0+1)setTimeout(() => {console.log(count); // 还是 0!}, 2000);
};
如果要获取最新的值,可以使用useRef
import { useRef} from "react";export default function App() {const countRef = useRef(0)const handleClick = () => {countRef.current += 1setTimeout(() => {console.log( countRef.current); // 1}, 2000);};return (<><button onClick={handleClick}>按钮</button></>);
}
(3)如果新值与当前state相同(由Object.is比较确定),将跳过重新渲染
点击按钮,因为对象info的引用地址还是指向同一个,因此不会再重新渲染
import { useState } from "react";export default function App() {const [info, setInfo] = useState({name: "张三",age: 20,});const handleClick = () => {setInfo(Object.assign(info, { age: info.age + 1 }));};console.log("渲染");return (<>{info.name}--{info.age}<button onClick={handleClick}>按钮</button></>);
}
要想触发渲染,需传递一个新对象:
setInfo(Object.assign({}, info, { age: info.age + 1 }));
//或使用扩展运算符
setInfo({ ...info, age: info.age + 1 });
(4)setState 自动批量处理
React 18 之前,setState 只在合成事件与钩子函数中自动批量处理,在promise、setTimeout或js原生事件中,都不会进行批处理
React 18中,默认所有的更新都将自动批量处理
import { useState } from "react";export default function App() {const [count, setCount] = useState(0);const handleClick = () => {setTimeout(() => {setCount(1);setCount(2);setCount(3);setCount(2);});};console.log("渲染");return (<>{count}<button onClick={handleClick}>按钮</button></>);
}
点击按钮,组件只会更新一次,并且值为最后一次调用set传入的值2
2. useReducer
1. 基础介绍
useReducer 是 react-hooks 提供的能够在无状态组件中运行类似redux功能的api
const [state,dispatch] = useReducer(reducer,initialState,init?);
state:状态state
dispatch:改变state的函数
reducer:与 redux 中的 reducer相同,一个函数,接收state与action,并返回一个新的state
initialState:初始值
init:将init函数作为useReducer的第三个参数传入,这样初始state将被设置为init(initialState)
2. 使用场景:状态管理
import { useReducer } from "react";const initialCount = {count: 0,
};type InitialCount = typeof initialCount;type ACTIONTYPE =| { type: "increment" }| { type: "decrement" }| { type: "reset"; payload: InitialCount };/* 对初始值进行处理 */
function init(initialCount: InitialCount) {/* 如果传入的count初始值小于0,则置为0 */if (initialCount.count < 0) {return { count: 0 };} else {return initialCount;}
}function reducer(state: InitialCount, action: ACTIONTYPE) {switch (action.type) {case "increment":return { count: state.count + 1 };case "decrement":return { count: state.count - 1 };case "reset":return init(action.payload || initialCount);default:throw new Error();}
}const App = () => {const [state, dispatch] = useReducer(reducer, initialCount, init);return (<>Count: {state.count}<buttononClick={() => dispatch({ type: "reset", payload: initialCount })}>Reset</button><button onClick={() => dispatch({ type: "decrement" })}>-</button><button onClick={() => dispatch({ type: "increment" })}>+</button></>);
};export default App;
useReducer 与 Context 配合使用,可以形成一个小范围的状态管理功能
3. useSyncExternalStore
1. 基础介绍
useSyncExternalStore 可以在外部数据源变化时,自动更新视图。一般是第三方状态管理库使用。
const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot?)
subscribe:订阅 store 的变化
getSnapshot:返回 store 当前值
getServerSnapshot:用于服务端渲染
2. 使用场景:订阅浏览器 API
订阅外部数据源,当外部数据源更新时,自动更新视图
import { useSyncExternalStore } from "react";export default function ChatIndicator() {//监听浏览器网络连接状态 const isOnline = useSyncExternalStore(subscribe, () => navigator.onLine);return <h1>{isOnline ? "Online" : "Disconnected"}</h1>;
}function subscribe(callback:any) {window.addEventListener("online", callback);window.addEventListener("offline", callback);return () => {window.removeEventListener("online", callback);window.removeEventListener("offline", callback);};
}
4. useTransition
useTransition 是一个帮助你在不阻塞 UI 的情况下更新状态的 React Hook
1. 基础介绍
const [ isPending , startTransition ] = useTransition ()
isPending :布尔值,表示是否正在等待;
startTransition:接收一个的函数,可以把里面的更新任务变成过渡任务
2. 使用场景:将状态更新标记为低优先级,先执行其他高优先级任务
页面会先显示list2的内容,之后再显示list1的内容
import { useState, useEffect, useTransition } from "react";const App = () => {const [list1, setList1] = useState<null[]>([]);const [list2, setList2] = useState<null[]>([]);const [isPending, startTransition] = useTransition();useEffect(() => {startTransition(() => {//将状态更新标记为 transition setList1(new Array(10000).fill(null));});}, []);useEffect(()=>{setList2(new Array(10000).fill(null));},[])return (<>{isPending ? "pending" : "nopending"}{list1.map((_, i) => (<div key={i}>{i}</div>))}-----------------list2{list2.map((_, i) => (<div key={i}>6666</div>))}</>);
};export default App;
5. useDeferredValue
1. 基础介绍
可以让我们延迟渲染不紧急的部分,类似于防抖但没有固定的延迟时间
const deferrredValue = useDeferredValue(value)
value:想延迟的值
deferrredValue:延迟值。只有当前没有紧急更新任务时,才会更新为最新值,否则返回旧值
2. useDeferredValue 和 useTransition 的区别
相同点:useDeferredValue 本质上和内部实现与 useTransition 一样都是标记成了过渡更新任务
不同点:useTransition是处理了一段逻辑,useDeferredValue是生产一个新的状态
3. 使用场景:受控输入框与长列表
将 input 更新作为紧急的部分优先处理,长列表更新作为不紧急的部分延迟处理。
import { useState, useDeferredValue, memo } from "react";export default function App() {const [value, setValue] = useState("");const deferredValue = useDeferredValue(value);const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {setValue(e.target.value);};return (<div><input value={value} onChange={handleChange} /><LongList deferredValue={deferredValue} /></div>);
}const LongList = memo(({ deferredValue }: { deferredValue: string }) => {return (<div className="container"><div className="list">{Array(10000).fill(null).map((_,i) => (<div key={i}>{deferredValue}</div>))}</div></div>);
});
注意点:
如果直接在父组件中展示1万个长列表节点,value更新,触发组件渲染,会去处理长列表节点,导致卡顿。
将长列表拆分成子组件,延迟的值传递给子组件,并使用memo包裹,这样只要等deferredValue的值更新,才会重新处理长列表的节点
二、生命周期
1. useEffect
1. 基础介绍
useEffect实现了 componentDidMount、componentDidUpdate 和 componentWillUnmount 三个API的功能
useEffect(fn, deps?)
fn:回调函数,会在初始化或依赖项变化时运行
deps:依赖项,是一个数组
2. 实现componentDidMount
第二个参数传空数组,只会在初始化时触发一次
useEffect(() => {//请求接口数据}, []);
3. 实现componentDidUpdate
在第二个参数传入依赖状态,当依赖状态改变时会重新渲染
useEffect(() => {//请求接口数据}, [props.name]);
内部是浅比较,源码中用for循环配合Object.is实现
4. 实现componentWillUnmount
return一个回调函数,用来清除副作用
import { useCallback, useEffect, useState } from "react";const App = () => {const [position, setPosition] = useState({ x: 0, y: 0 });const handleMouse = useCallback((e: MouseEvent) => {setPosition({x: e.pageX,y: e.pageY,});}, []);useEffect(() => {window.addEventListener("mousemove", handleMouse);return () => {//取消监听 window.removeEventListener("mousemove", handleMouse);};}, [handleMouse]);return (<div>x:{position.x} y:{position.y}</div>);
};export default App;
2. useLayoutEffect
1. 基础介绍
在浏览器layout之后,painting之前执行。回调函数中执行的代码可能会堵塞浏览器绘制。常用来在绘制之前获取DOM节点信息,修改DOM结构,这样浏览器只用绘制一次
useLayoutEffect(setup, deps?)
fn:回调函数,会在初始化或依赖项变化时运行
deps:依赖项
2. 使用场景:在浏览器绘制之前获取DOM节点信息
import { useState, useRef, useLayoutEffect } from "react";function App() {const ref = useRef<HTMLDivElement>(null);const [tooltipHeight, setTooltipHeight] = useState(0);useLayoutEffect(() => {const { height } = ref.current?.getBoundingClientRect() || { height: 0 };setTooltipHeight(height);}, []);return (<div ref={ref} style={{ height: 300 }}>容器的高:{tooltipHeight}</div>);
}export default App;
3. useInsertionEffect
1. 基础介绍
useInsertionEffect是一个专为CSS-in-JS 库的开发者打造的钩子,在DOM更新之前执行(比useLayoutEffect早)
useInsertionEffect(setup, deps?)
n:回调函数,会在初始化或依赖项变化时运行
deps:依赖项
2. 使用场景:提前注入style标签
import { useInsertionEffect } from "react";function App() {useInsertionEffect(() => {/* 动态创建 style 标签插入到 head 中 */const style = document.createElement("style");style.innerHTML = `.css-in-js{color: red;font-size: 20px;}`;document.head.appendChild(style);}, []);return <div className="css-in-js"> useInsertionEffect </div>;
}export default App;
三、状态保存
1. useMemo
1. 基础介绍
在每次重新渲染的时候能够缓存计算的结果
const cachedValue = useMemo(calculateValue, deps)
calculateValue:一个函数,函数的返回值作为缓存值
deps:一个数组,存放当前 useMemo 的依赖项。依赖项改变时,会运行calculateValue重新计算
cachedValue:返回值,如果 deps 中有依赖项改变,返回重新执行 calculateValue 产生的值,否则取上一次缓存值
2. 使用场景
(1)缓存计算结果
import { useState, useMemo } from "react";function App() {const [count, setCount] = useState(0);const memoizedValue = useMemo(() => {//创建1000位数组const list = new Array(1000).fill(null).map((_, i) => i);//对数组求和const total = list.reduce((res, cur) => (res += cur), 0);//返回计算的结果return count + total;//添加依赖项,只有count改变时,才会重新计算}, [count]);return (<div>{memoizedValue}<button onClick={() => setCount((prev) => prev + 1)}>按钮</button></div>);
}export default App;
(2)缓存渲染列表
import { useState, useMemo } from "react";function App() {const [list] = useState(["张三", "李四"]);const renderList = useMemo(() => (<div>{list.map((i, v) => (<span key={v}>{i}</span>))}</div>),[list]);return (<div>{renderList}</div>);
}export default App;
3. React.memo与useMemo的区别
React.memo:对外部传值props进行浅比较,避免不必要的重复渲染,相当于shouldComponentUpdate;
useMemo:对组件内部状态state进行浅比较,避免不必要的重复渲染
2. useCallback
1. 基础介绍
缓存函数的引用地址,仅在依赖项改变时才会更新
const cachedFn = useCallback(fn, deps)
fn:想要缓存的函数
deps:是否更新 fn 的所有响应式值的一个列表
2. 使用场景:避免子组件重复渲染
默认情况下,当一个组件重新渲染时, React 将递归渲染它的所有子组件。我们通常对于有props的子组件会使用React.memo进行包裹
import { useState, memo } from "react";const App = () => {const [count, setCount] = useState(0);const handleClick = () => {setCount((prev) => prev + 1);};return (<div>{count}<MyButton handleClick={handleClick} /></div>);
};interface Props {handleClick: () => void;
}const MyButton = memo(({ handleClick }: Props) => {console.log("子组件渲染");return <button onClick={handleClick}>按钮</button>;
});export default App;
点击按钮,可以发现即使子组件使用memo包裹了,但还是更新了,控制台打印出“子组件渲染”。这是因为父组件App每次更新时,函数handleClick每次都返回了新的引用地址,因此对于子组件来说每次传入的都是不一样的值,从而触发重渲染。
使用useCallback可以缓存函数的引用地址,将handleClick改为
const handleClick = useCallback(()=>{setCount(prev=>prev+1)
},[])
再点击按钮,会发现子组件不会再重新渲染
3. useMemo与useCallback的区别
useMemo常用来缓存计算结果,useCallback常用来缓存函数的引用地址
useMemo如果返回一个函数,同样能够做到缓存函数的引用地址,与useCallback等效
四、状态获取与传递
1. useContext
1. 基础介绍
向上查找最近的使用context Provider 提供的 value 值
const value = useContext(SomeContext)
SomeContext:由React.createContext创建的context
value:获取使用 Provider 提供的 value 值
2. 使用场景:向组件树深层传递数据
import {useState,useCallback,createContext,useMemo,useContext,
} from "react";const defaultValue = { count: 0, handleClick: () => {} };/* 1. 创建Context */
const MyContext = createContext(defaultValue);const App = () => {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount((prev) => prev + 1);}, []);//传递值和改变该值的方法给子组件const contextValue = useMemo(() => ({count,handleClick,}),[count, handleClick]);return (/* 2. 提供Context值 */<MyContext.Provider value={contextValue}><MyButton /></MyContext.Provider>);
};const MyButton = () => {/* 3. 获取Context值 */const { count, handleClick } = useContext(MyContext);return (<div>{count}<button onClick={handleClick}>按钮</button></div>);
};export default App;
2. useRef
1. 基础介绍
用来创建一个不需要渲染的值
const ref = useRef(initialValue)
initialValue:ref 对象的 current 属性的初始值。
ref:一个只有一个属性current的对象,在后续的渲染中,useRef 将返回同一个对象
2. 可以用来访问dom节点或子组件
import { useEffect, useRef } from "react";function App() {const domRef = useRef(null);useEffect(() => {console.log(domRef.current);}, []);return <div ref={domRef}>dom</div>;
}export default App;
3. 值的更改不会触发视图更新
import { useRef, useState } from "react";function App() {const countRef = useRef(0);const [count, setCount] = useState(0);console.log('组件渲染');return (<div>{countRef.current}{count}<buttononClick={() => {countRef.current += 1;}}>ref+1</button><button onClick={() => setCount((prev) => prev + 1)}>state+1</button></div>);
}export default App;
点击ref+1按钮,countRef值增加,但视图不会更新。点击state+1按钮,视图更新,组件重新渲染,打印出countRef最新的值
4. 返回的引用,在组件更新时不会被改变(返回同一个对象),可以用来清除定时器
import { useEffect, useRef } from "react";function App() {const timeRef = useRef<NodeJS.Timer>();useEffect(() => {timeRef.current = setInterval(() => {console.log("1");}, 1000);//在组件卸载时,清除定时器,防止内存泄漏return () => {clearInterval(timeRef.current);};}, []);return <div></div>;
}export default App;
3. useImperativeHandle
1. 基础介绍
与forwardRef配合,自定义暴露给父组件的实例值或函数
useImperativeHandle(ref, createHandle, [deps])
ref:接受forwardRef传递过来的ref
createHandle:处理函数,返回值作为暴露给父组件的ref对象
deps:依赖项deps,依赖项更改形成新的ref对象
2. 使用场景:组件通信中,父组件调用子组件
import { forwardRef, useRef, useImperativeHandle } from "react";/* 定义ref类型 */
interface ForwardObject {focus: () => void;
}function App() {const ref = useRef<ForwardObject>(null);return (<div><MyInput ref={ref} /><button onClick={() => ref.current?.focus()}>使输入框获取焦点</button></div>);
}/* 子组件 */
const MyInput = forwardRef((props, ref) => {const inputRef = useRef<HTMLInputElement>(null);useImperativeHandle(ref,() => ({focus: () => {inputRef.current?.focus();},}),[]);return <input ref={inputRef} />;
});export default App;
五、工具类
1. useDebugValue
1. 基础介绍
在 React 开发工具 中为自定义 Hook 添加标签
useDebugValue(value, format?)
value:在 React 开发工具中显示的值
format:一个格式化函数,将接收 value 作为参数,并返回格式化后的显示值
2. 使用场景:在 React 开发工具中为自定义 Hook 添加标签
import { useDebugValue, useState } from "react";const App = () => {useNetworkStatus();return <div></div>;
};function useNetworkStatus() {const [isOnline] = useState(false);// 在开发者工具中的这个 Hook 旁边显示标签// NetworkStatus:"Offline"useDebugValue(isOnline ? "Online" : "Offline");return isOnline;
}export default App;
2. useID
1. 基础介绍
生成唯一 ID。解决了在服务器渲染中,服务端和客户端产生 id 不一致的问题
const id = useId()
2. 使用场景:为属性生成唯一 ID
import { useId } from "react";export default function Form() {const id = useId();return (<div><label htmlFor={id}>chose</label><input type="checkbox" id={id} name="chose" /></div>);
}
点击chose,能够看到复选框被选中
提示:不要使用 useId 来生成列表中的 key,key 应该由你的数据生成
相关文章:
【React 进阶】掌握 React18 全部 Hooks
一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量,可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state:状态,作为渲染视图的数据源 setState:改变st…...
泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性
目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果,已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…...
用js实现点击抽奖
用原生的JS来完成的一个小游戏,进行了简单的点击触发以及判断 css: <style>* {margin: 0;padding: 0;}body {background-color: #f7f7f7;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {backg…...
JVM-类文件结构
类文件结构 JVM 的“无关性” 谈论 JVM 的无关性,主要有以下两个: 平台无关性:任何操作系统都能运行 Java 代码 语言无关性: JVM 能运行除 Java 以外的其他代码 Java 源代码首先需要使用 Javac 编译器编译成 .class 文件ÿ…...
丹摩征文活动|实现Llama3.1大模型的本地部署
文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型,相较于之前的版本,它在规模和功能上实现了显著提升,尤其是最大的 4050亿参数版本,成为开源社区中非常…...
深入探讨异步 API 的设计与实现
一、API 模式简介:同步与异步的对比 API 是客户端和服务器之间通信的桥梁。大多数 API 采用同步模式,执行的流程如下: 客户端发送请求。服务器处理请求。服务器返回响应。 同步模式对快速操作非常有效,比如数据查询或简单更新。…...
多模态大型语言模型(MLLM)综述
目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入概述 多模态嵌入关键步骤 多模态嵌入现状 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模…...
EasyPlayer-pro视频流播放学习
效果: 知识抢先看: 动态创建节点指的是通过 JavaScript 操作 DOM 来生成 HTML 元素并插入到页面中 document.createElement: 创建新的 HTML 元素节点。 // 创建一个 <div> 元素 const div document.createElement(div); // 设置其属性 div.id my…...
STM32F103C8T6实时时钟RTC
目录 前言 一、RTC基本硬件结构 二、Unix时间戳 2.1 unix时间戳定义 2.2 时间戳与日历日期时间的转换 2.3 指针函数使用注意事项 三、RTC和BKP硬件结构 四、驱动代码解析 前言 STM32F103C8T6外部低速时钟LSE(一般为32.768KHz)用的引脚是PC14和PC…...
springboot获取配置文件中的值
概括 在开发过程中,对于一些通用的配置,通常会定在一个配置文件中。通常为application.properties或者application.yml文件中。我们只需要在需要使用的地方通过注解直接获取即可。 使用 在springboot中可以通过使用value注解来读取配置文件中的属性。…...
Python 爬虫从入门到(不)入狱学习笔记
爬虫的流程:从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战:豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据(略) 一般爬虫的基…...
STM32C011开发(1)----开发板测试
STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…...
【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】
本章节内容:相机、棱镜、光场 计算机图形学的两种成像方法: 1.合成方法:光栅化、光线追踪(展示出现实没有的东西) 2.捕捉方法:相机(捕捉现实已有的东西) 目录 1 相机 1.1 针孔相…...
记录两次Unity编辑器和真机表现不符的情况,引用丢失等
如题,问题是在编辑器和打包在真机测试上的效果不一致。 首先,第一次遇到的问题是编辑器和真机上大量资源不符和丢失,多次对比表现为,异常和丢失内容都是两个版本之间变更的资源,判定为资源引用异常,尝试删…...
【Win】user32.SetWindowsHookExW - Notes
user32.SetWindowsHookExW user32.SetWindowsHookExW(idHook, lpfn, hMod, dwThreadId)用于在系统中安装钩子函数,以监视某些系统事件或消息。 Parameters idHook: int - 安装钩子的类型标识符;对应于不同的系统事件或消息类别。lpfn: callable - 指向…...
泷羽sec-linux
基础之linux 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
二叉树oj题解析
二叉树 二叉树的最近公共祖先什么是最近公共祖先?leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先? 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…...
python画图|无坐标轴自由划线操作fig.add_artist(lines.Line2D()函数
【1】引言 新发现了一种自由划线操作函数,和大家共享。 【2】官网教程 点击下述代码,直达官网: https://matplotlib.org/stable/gallery/misc/fig_x.html#sphx-glr-gallery-misc-fig-x-py 官网代码非常简洁,我进行了解读。 …...
Flutter封装Coap
前言 我们根据Coap数据通信流程写一个公共组件,用户只要在原本的组件外嵌套这个公共组件就可以使用Coap的功能,这样做更加的方便便捷。 具体步骤 封装一个udp函数 创建一个工厂函数,工厂函数初始化时监听广播数据发送广播函数:…...
openharmony napi调试笔记
一、动态库的编译 第一种openharmony交叉编译链配置方法 使用的编译环境是ubuntu20.04 1、使用vscode配置openharmony sdk交叉编译环境 首先下载openharmony的sdk,如native-linux-x64-4.1.7.5-Release.zip 解压后native目录下就是交叉编译用的sdk 在要编译的源…...
C++数据结构与算法
C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…...
MATLAB深度学习(六)——LSTM长短期神经网络原理与应用
LSTM的应用可以参见一个相当好的视频:小车倒立摆最优控制教程 - Part1 Simulink Simscape Multibody仿真建模_哔哩哔哩_bilibili 6.1 序列建模——循环神经网络 循环神经网络RNN是一类专门用于处理序列性数据x,,xn的神经网络结构,…...
利用Python爬虫获得1688按关键字搜索商品:技术解析
在电商领域,1688作为中国领先的B2B电商平台,其商品搜索功能对于商家来说具有极高的价值。通过获取搜索结果,商家可以更好地了解市场趋势,优化产品标题,提高搜索排名。本文将介绍如何使用Python编写爬虫,以获…...
Ajax学习笔记,第一节:语法基础
Ajax学习笔记,第一节:语法基础 一、概念 1、什么是Ajax 使用浏览器的 XMLHttpRequest 对象 与服务器通信2、什么是axios Axios是一个基于Promise的JavaScript库,支持在浏览器和Node.js环境中使用。相较于Ajax,Axios提供了更多…...
java基础知识(常用类)
目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…...
修改bag的frame_id的工具srv_tools
在使用数据集导航或者建图时,bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…...
浅谈丨功能安全测试,汽车的守护者
随着新能源汽车迅猛的发展,各类车型频频面世,同时辅助驾驶/自动驾驶等智驾功能也在不断迭代,使得整个汽车系统的复杂性越来越高,最终导致消费者不得不对如今的汽车质量和安全性提出质疑。 如何打破质疑? 那就不得不搬…...
了解M有SQL索引
目录 索引介绍 索引的优缺点 索引底层数据结构选型 Hash表 二叉查找树(BST) AVL树 红黑树 B 树& B树 索引类型总结 主键索引(Primary Key) 二级索引 聚簇索引与非聚簇索引 聚簇索引(聚集索引) 聚簇索引介绍 聚簇索引的优缺点 非聚簇索引(非聚集索引) 非聚簇…...
进程间通信5:信号
引入 我们之前学习了信号量,信号量和信号可不是一个东西,不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的,无法预测信号可以临时保存下来,之后再处理信号是异步发送的…...
Excel把其中一张工作表导出成一个新的文件
excel导出一张工作表 一个Excel表里有多个工作表,怎么才能导出一个工作表,让其生成新的Excel文件呢? 第一步:首先打开Excel表格,然后选择要导出的工作表的名字,比如“Sheet1”,把鼠标放到“She…...
python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
Two-Step Vertification required: Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话…...
微信小程序下拉刷新与上拉触底的全面教程
微信小程序下拉刷新与上拉触底的全面教程 引言 在微信小程序的开发中,用户体验至关重要。下拉刷新和上拉触底是提高用户交互体验的重要功能,能够让用户轻松获取最新数据和内容。本文将详细介绍这两个功能的实现方式,结合实际案例、代码示例和图片展示,帮助开发者轻松掌握…...
第三十九章:Grafana 概述、Docker安装与验证指南
Grafana 概述、Docker安装与验证指南 一、Grafana 概述 Grafana 是一个跨平台的开源可视化分析工具,是目前网络架构和应用分析中最流行的时序数据展示工具。它主要用于大规模指标数据的可视化展示,并支持多种数据源和丰富的可视化插件。Grafana 使用Go语言开发,具备数据监…...
使用go实现流式输出
流式输出的深度剖析 之前一直在调用openai的key,只是照着文档进行流式调用,也只知其确是流式与api有所不同,而未成体系深究其实现原理。 就以openai的官方流式输出为切入。 概述 流式输出(Streaming Output)是 HTT…...
WebSocket详解、WebSocket入门案例
目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…...
元组部分介绍
元组部分 元组的基本格式与特点 #1.元组 #基本格式: 元组名(元素1,元素2,元素3) #注意:所有元素包含在小括号内,元素与元素之间用逗号隔开,可以是不同的元素类型 #注意:…...
mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法
mfc100u.dll 是一个动态链接库(DLL)文件,属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义,这…...
企业数字化转型现状
国家数字经济战略背景 2018年以来,国家政府不断出台政策规范我国企业数字化治理市场。2018年9月颁布《关于发展数字经济稳定并扩大就业的指导意见》,支持建设一批数字经济创新创业孵化机构。积极推进供应链创新与应用,支持构建以企业为主导。…...
数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章
文章目录 1. 数据治理的核心内涵与战略价值2. 数据治理的驱动因素:不仅仅是合规3. 数据治理的组织模型:选择适合企业结构的运营模式4. 实施数据治理的关键步骤:战略、制度和文化5. 数据治理工具的选择:支持业务与流程的高效管理6.…...
树莓派2装FreeBSD14.1 Raspberry Pi2 install FreeBSD14.1 00000121:error:0A000086:SSL
树莓派2代的Model B采用Broadcom BCM2836 900MHz的四核SoC,1GB内存,是新一代开拓者,兼容1代B。相比之下,树莓派2的性能比1代提升6倍,内存翻了一番。Raspberry Pi 2不仅能跑全系列ARM GNU/Linux发行版,而且支…...
uniop触摸屏维修eTOP40系列ETOP40-0050
在现代化的工业与商业环境中,触摸屏设备已成为不可或缺的人机交互界面。UNIOP,作为一个知名的触摸屏品牌,以其高性能、稳定性和用户友好性,广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而,即便如…...
uniapp+vue2重新进入小程序就清除缓存,设备需要重新扫码
代码 app.vue页面 <script>export default {onLaunch: function() {uni.removeStorageSync(equiId)}} </script>...
视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析
在数字科技日新月异的今天,视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台,提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务,广泛应用于…...
论文笔记 网络安全图谱以及溯源算法
本文提出了一种网络攻击溯源框架,以及一种网络安全知识图谱,该图由六个部分组成,G <H,V,A,E,L,S,R>。 1|11.知识图 网络知识图由六个部分组成,…...
抓住鸿蒙生态崛起的机遇,拥抱未来开发挑战
随着华为鸿蒙(HarmonyOS)的持续发展,鸿蒙生态正在迅速崛起,逐步在智能手机、智能穿戴、车载、家居等领域形成完整闭环。它不仅为开发者带来了新的机遇,还带来了技术上的挑战。如何抓住这些机遇并应对挑战,是…...
STM32WB55RG开发(5)----监测STM32WB连接状态
STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…...
ArcGIS应用指南:ArcGIS制作局部放大地图
在地理信息系统(GIS)中,制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化,还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧,用于展示特定区域的详细信息ÿ…...
浅谈网络 | 传输层之TCP协议
目录 TCP 包头格式TCP 的三次握手TCP 的四次挥手TCP 的可靠性与"靠谱"的哲学TCP流量控制TCP拥塞控制 上一章我们提到,UDP 就像我们小时候一样简单天真,它相信“网之初,性本善,不丢包,不乱序”,因…...
Kotlin中的?.和!!主要区别
目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。 ?.(安全调用操作符):当变量可能为null时,使用?.可以安全地调用其方法或属性…...
【漏洞复现】代付微信小程序系统 read.php 任意文件读取漏洞
免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...