React Hooks全面解析:从基础到高级的实用指南

React Hooks全面解析:从基础到高级的实用指南

React Hooks自2018年16.8版本引入以来,彻底改变了React组件的开发方式。** Hooks使函数组件获得了与类组件同等的表达能力,同时简化了代码结构,提升了可维护性**。本文将系统介绍React常用Hooks,通过功能解析、使用场景和代码示例,帮助开发者深入掌握这一重要特性。

一、Hooks基本概念与使用规则

Hooks是React提供的特殊函数,允许在函数组件中直接管理状态和副作用。与类组件相比,Hooks提供了更直观的状态管理方式,避免了this关键字的困扰,使组件逻辑更加清晰。React官方文档将Hooks定义为"可重复使用的函数,它让你能够从函数组件中提取逻辑"。

使用Hooks需遵循以下核心规则:

  1. 只能在函数组件中使用:不能在类组件中调用Hooks,也不能在普通函数中调用
  2. 必须在函数顶层调用:不能在条件语句、循环或嵌套函数中调用Hooks
  3. 保持调用顺序一致:每次渲染时,必须以相同的顺序调用Hooks,否则会导致状态错乱

这些规则看似简单,但违反它们会导致难以察觉的错误。例如,在条件语句中调用Hooks,会导致状态与函数调用顺序不匹配;而循环中调用Hooks则可能导致重复状态创建。理解并严格遵守这些规则,是正确使用Hooks的基础。

二、常用内置Hooks详解

1. useState:组件状态管理

useState是React中最基础的Hook,用于在函数组件中创建和管理状态变量。它返回一个数组,包含当前状态值和更新该状态的函数。

功能与用法

import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);const [name, setName] = useState('John');return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button><p Name: {name}</p><inputtype="text"value={name}onChange={(e) => setName(e.target.value)}/></div>);
}

使用场景

  • 管理表单输入状态
  • 实现计数器、开关等简单交互状态
  • 存储组件内部计算结果

最佳实践

  • 使用函数式更新(setCount(prev => prev + 1))处理异步状态更新
  • 初始值应与状态类型一致
  • 避免在useState中执行复杂计算,应将其移至useMemo
2. useEffect:副作用管理

useEffect是React中处理副作用的Hook,它允许在组件渲染后执行异步操作、订阅等。它模拟了类组件中的componentDidMount、componentDidUpdate和componentWillUnmount生命周期方法。

功能与用法

import React, { useState, useEffect } from 'react';function DataDisplay({ url }) {const [data, setData] = useState(null);const [error,犯错] = useState(null);useEffect(() => {let isCurrent = true;const fetchData = async () => {try {const response = await fetch(url);const result = await response.json();if (isCurrent) setData(result);} catch (e) {if (isCurrent)犯错(e.message);}};fetchData();return () => {isCurrent = false; // 清理副作用};}, [url]); // 依赖项数组return (<div>{error ? <p>{error}</p> : null}{data ? <pre>{JSON.stringify(data, null, 2)}</pre> : null}</div>);
}

使用场景

  • 数据获取(如API调用)
  • 订阅事件(如WebSocket、WebSocket)
  • DOM操作(如自动聚焦输入框)
  • 清理操作(如取消订阅、清除定时器)

最佳实践

  • 空依赖数组([])模拟componentDidMount
  • 依赖项数组包含所有外部变量
  • 返回清理函数处理副作用
  • 避免在useEffect中直接更新状态,应使用函数式更新

常见陷阱

  • 未清理异步操作导致内存泄漏
  • 依赖项遗漏导致副作用重复执行
  • useEffect中直接返回状态导致无限循环
3.上下文相关Hooks:useContext和useReducer

useContext用于在函数组件中访问React Context,避免了在类组件中需要层层传递props的繁琐。useReducer则用于管理复杂的状态逻辑,特别适合处理多个相关联的状态更新。

useContext功能与用法

import React, { createContext, useState, useContext } from 'react';// 创建Context
const ThemeContext = createContext();// 提供者组件
function App() {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={{ theme, setTheme }}><ComponentA /></ThemeContext.Provider>);
}// 消费组件
function ComponentA() {const { theme } = useContext(ThemeContext);return <div>Current theme: {theme}</div>;
}

useReducer功能与用法

import React, { useReducer } from 'react';// 定义reducer
function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:return state;}
}// 使用useReducer
function Counter() {const [state, dispatch] = useReducer(reducer, {count: 0});return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></div>);
}

使用场景
-跨越多层组件传递数据(useContext)
-管理复杂状态逻辑(如购物车、用户认证)(useReducer)
-替代Redux处理轻量级状态管理

最佳实践

  • 使用useReducer处理复杂状态逻辑,避免过多useState
  • 结合useContextuseReducer创建全局状态管理
  • useContext中使用默认值避免空值错误

常见陷阱

  • useContext中直接修改值,应通过action和reducer更新
  • 忘记提供初始值导致组件渲染错误
  • 过度使用useReducer处理简单状态
4.性能优化Hooks:useMemo和useCallback

useMemo和useCallback是React提供的性能优化Hooks,它们通过缓存计算结果和函数引用,避免不必要的重新渲染。

useMemo功能与用法

import React, { useState, useMemo } from 'react';function ExpensiveCalculationExample() {const [input, setInput] = useState('');const [count, setCount] = useState(0);// 使用useMemo缓存计算结果const memoizedResult = useMemo(() => {return input.split('').reverse().join('');}, [input]); // 仅当input变化时重新计算return (<div><inputvalue={input}onChange={(e) => setInput(e.target.value)}/><p>Reversed input: {memoizedResult}</p><button onClick={() => setCount(count + 1)}>Increment Count ({count})</button></div>);
}

useCallback功能与用法

import React, { useState, useCallback } from 'react';function ParentComponent() {const [count, setCount] = useState(0);// 使用useCallback缓存函数引用const handleClick = useCallback(() => {setCount(count + 1);}, [count]); // 依赖项数组确保函数引用稳定return (<div><p>Count: {count}</p><ChildComponent onClick={handleClick} /></div>);
}function ChildComponent({ onClick }) {// 如果onClick引用变化,组件会重新渲染return <button onClick={onClick}>Increment</button>;
}

使用场景
-缓存昂贵计算结果(如复杂数组处理、数据转换)
-缓存函数引用,避免子组件不必要的重新渲染
-在React.memo中使用,提升性能

最佳实践

  • 仅在需要时使用,避免过度优化
  • 合理设置依赖项数组,确保缓存正确更新
  • 避免在useMemo中执行副作用,应使用useEffect
  • 对于简单计算,直接返回结果可能比使用useMemo更高效

常见陷阱

  • 依赖项遗漏导致缓存结果过时
  • useMemo中执行副作用,应使用useEffect
  • 过度使用导致性能下降,应通过React DevTools分析渲染次数
5.其他实用Hooks:useRef和useDebugValue

useRef提供了一种在组件渲染周期之间持久化存储值的方式,修改其current属性不会触发组件重新渲染。useDebugValue则用于在React开发者工具中为自定义Hook添加可读标签,提升调试体验。

useRef功能与用法

import React, { useRef, useEffect } from 'react';function FocusInputExample() {const inputRef = useRef(null);useEffect(() => {// 使用useRef获取DOM元素inputRef.current.focus();}, []); // 仅在挂载时执行return <input type="text" ref={inputRef} />;
}function RenderCounterExample() {const renderCount = useRef(0);useEffect(() => {renderCount.current += 1;});return (<div>渲染次数: {renderCount.current}</div>);
}

useDebugValue功能与用法

import React, { useState, useDebugValue } from 'react';function useOnlineStatus() {const [isOnline, setIsOnline] = useState(null);useEffect(() => {const handleOnline = () => setIsOnline(true);const handleOffline = () => setIsOnline(false);window.addEventListener('online', handleOnline);window.addEventListener('offline', handleOffline);return () => {window.removeEventListener('online', handleOnline);window.removeEventListener('offline', handleOffline);};}, []);// 使用useDebugValue在开发者工具中显示状态useDebugValue(isOnline ? 'Online' : 'Offline');return isOnline;
}

使用场景

  • 访问DOM元素(如自动聚焦、测量尺寸)
  • 存储不引起重新渲染的持久化变量
  • 在异步操作中访问最新状态值(解决闭包问题)
  • 调试自定义Hooks时显示可读状态

最佳实践

  • 在需要频繁更新但不影响渲染的场景使用useRef
  • 使用useDebugValue提升自定义Hooks的可调试性
  • 在异步操作中通过useRef.current访问最新值
  • 避免在useDebugValue中执行复杂计算,应使用格式化函数

常见陷阱

  • 将useRef用于需要触发重新渲染的状态
  • 忘记在useEffect中返回清理函数,导致内存泄漏
  • 在条件语句中调用useRef,导致引用不一致

三、高级Hooks与并发模式

React 18引入了并发模式,配合新的高级Hooks,可以实现更流畅的用户体验和更高效的渲染流程。

1. useTransition:优化交互流畅度

useTransition允许将某些状态更新标记为"可中断的过渡",React会区分高优先级更新(如用户输入)和低优先级更新(如数据获取),确保用户交互不会卡顿。

功能与用法

import React, { useState, useTransition } from 'react';function SearchBox() {const [query, setQuery] = useState('');const [results, setResults] = useState([]);const [isPending, startTransition] = useTransition();const handleChange = (e) => {const newQuery = e.target.value;setQuery(newQuery); // 高优先级:立即更新输入框// 将耗时的结果更新包裹在startTransition中startTransition(() => {// 模拟耗时操作(如复杂计算、API请求)const filteredResults = massiveList.filter(item => item.name.includes(newQuery));setResults(filteredResults); // 低优先级:可中断的更新});};return (<div><inputtype="text"value={query}onChange={handleChange}/>{isPending && <span>Loading...</span>}<ul>{results.map(item => (<li key={item.id}>{item.name}</li>))}</ul></div>);
}

使用场景

  • 用户输入后的搜索结果更新
  • 表单提交后的数据处理
  • 复杂计算后的状态更新

最佳实践

  • 将用户直接交互的更新放在高优先级
  • 将耗时或非关键的更新包裹在startTransition中
  • 使用isPending状态显示加载指示器
  • 结合useDeferredValue获取延迟更新的值

常见陷阱

  • 未正确标记可中断更新,导致界面卡顿
  • 忽略isPending状态,无法提供加载反馈
  • 在useTransition中执行不可中断的副作用
2. useLayoutEffect:同步执行的副作用

useLayoutEffect类似于useEffect,但会在浏览器绘制前同步执行,适用于需要在DOM更新后立即读取布局信息的场景,如测量元素尺寸。

功能与用法

import React, { useState, useLayoutEffect } from 'react';function ElementSizeExample() {const [width, setWidth] = useState(0);const [height, setHeight] = useState(0);const ref = useRef(null);useLayoutEffect(() => {if (ref.current) {const { offsetWidth, offsetHeight } = ref.current;setWidth(offsetWidth);setHeight(offsetHeight);}}, []); // 仅在挂载时执行return (<div ref={ref}><p>当前元素尺寸: {width}x{height}</p></div>);
}

使用场景

  • 测量DOM元素尺寸或位置
  • 在布局更新后立即执行某些操作
  • 避免页面闪烁的副作用处理

最佳实践

  • 优先使用useEffect,仅在需要同步执行时使用useLayoutEffect
  • 在useLayoutEffect中执行轻量级操作,避免阻塞浏览器绘制
  • 返回清理函数处理副作用
  • 避免在useLayoutEffect中直接更新状态,应使用函数式更新

常见陷阱

  • 在useLayoutEffect中执行耗时操作,导致页面卡顿
  • 未正确清理副作用,导致内存泄漏
  • 混淆useEffect和useLayoutEffect的使用场景

四、自定义Hooks:逻辑复用的艺术

自定义Hooks是React中逻辑复用的核心机制,通过封装可重用的组件逻辑,使代码更加模块化和可维护。自定义Hooks应以"use"开头命名,遵循React Hooks的使用规则。

1. 表单验证自定义Hook

表单验证是Web应用中的常见需求,通过自定义Hooks可以将验证逻辑封装,使组件保持简洁。

function useFormData(initialState = {}, validationSchema) {const [values, setValues] = useState(initialState);const [errors, setErrors] = useState {};const [isDirty, setIsDirty] = useState false;// 实时验证useEffect(() => {const validate = () => {const newErrors = {};for (const field in validationSchema) {if (validationSchema.hasOwnProperty(field)) {const validationFn = validationSchema[field];if (!validationFn(values[field])) {newErrors[field] = validationFn.message;}}}setErrors(newErrors);};validate();}, [values, validationSchema]);// 处理表单输入const handleInputChange = (e) => {const { name, value } = e.target;setValues({ ...values, [name]: value });setIsDirty(true);};// 验证表单const validateForm = () => {const validate = () => {const newErrors = {};for (const field in validationSchema) {if (!validationSchema.hasOwnProperty(field)) continue;const validationFn = validationSchema[field];if (!validationFn(values[field])) {newErrors[field] = validationFn.message;}}return Object.keys(newErrors).length === 0;};const isValid = validate();setErrors(isValid ? {} : validate());return isValid;};return { values, errors, isDirty, handleInputChange, validateForm };
}

使用场景

  • 复杂表单验证
  • 跨组件共享表单逻辑
  • 表单状态管理

最佳实践

  • 将验证规则与表单逻辑分离
  • 使用useEffect进行实时验证
  • 返回标准化的接口,方便组件使用
  • 结合useDebugValue添加调试信息

常见陷阱

  • 未正确处理表单提交时的验证
  • 依赖项遗漏导致验证结果不更新
  • 表单状态与UI组件绑定过紧
2. 动画控制自定义Hook

动画控制是前端应用中的常见需求,通过自定义Hooks可以将动画逻辑封装,实现复用。

function useDebounce(fn, delay) {const timerRef = useRef(null);useEffect(() => {return () => {// 清理定时器if (timerRef.current) {clearTimeout(timerRef.current);}};}, []); // 仅在组件卸载时执行清理const debouncedFn = (...args) => {if (timerRef.current) {clearTimeout(timerRef.current);}timerRef.current = setTimeout(() => {fn(...args);}, delay);};return debouncedFn;
}function useThrottle(fn, delay) {const timerRef = useRef(null);const shouldRunRef = useRef(true);const throttledFn = (...args) => {if (!shouldRunRef.current) return;shouldRunRef.current = false;fn(...args);timerRef.current = setTimeout(() => {shouldRunRef.current = true;if (timerRef.current) clearTimeout(timerRef.current);}, delay);};return throttledFn;
}

使用场景

  • 表单输入防抖
  • 滚动事件节流
  • 频繁操作的优化

最佳实践

  • 使用useRef存储定时器引用
  • 返回清理函数处理副作用
  • 结合useCallback缓存函数引用
  • 在自定义Hooks中使用useDebugValue添加调试信息

常见陷阱

  • 未正确清理定时器,导致内存泄漏
  • 依赖项遗漏导致函数引用变化
  • 在条件语句中调用自定义Hooks

五、Hooks最佳实践与常见陷阱

1. 避免闭包陷阱

闭包陷阱是React Hooks中最常见的问题之一,它发生在异步操作(如定时器、API请求)中访问过时状态值的情况。这是因为异步操作在创建时捕获了当前渲染周期的状态,而后续渲染可能已更新该状态。

解决方案

  • 使用函数式更新(setState(prev => prev + 1)
  • 使用useRef存储最新值
  • 正确声明依赖项数组
// 错误示例:闭包陷阱
function Counter() {const [count, setCount] = useState(0);const [isPending, startTransition] = useTransition();useEffect(() => {setTimeout(() => {// 始终输出初始值0console.log(count);}, 3000);}, []); // 空依赖项数组导致闭包陷阱return <div>Count: {count}</div>;
}// 正确示例:使用函数式更新
function Counter() {const [count, setCount] = useState(0);useEffect(() => {const timer = setInterval(() => {// 使用函数式更新获取最新值setCount(prev => prev + 1);}, 1000);return () => clearInterval(timer);}, []); // 空依赖项数组return <div>Count: {count}</div>;
}
2. 合理设置依赖项数组

依赖项数组是useEffect和useMemo等Hooks的核心部分,它决定了函数何时重新执行。80%的Hooks错误源于依赖项管理不当,因此正确设置依赖项至关重要。

最佳实践

  • 显式声明所有外部变量
  • 使用ESLint插件检查依赖项
  • 避免在依赖项数组中包含不必要的变量
  • 对于函数,使用useCallback而不是直接传递
// 错误示例:依赖项遗漏
function DataDisplay({ url }) {const [data, setData] = useState(null);useEffect(() => {// 每次渲染都执行,即使url未变化fetch(url).then(res => res.json()).then(setData);}); // 未声明依赖项,导致副作用重复执行return <div>{JSON.stringify(data)}</div>;
}// 正确示例:依赖项准确
function DataDisplay({ url }) {const [data, setData] = useState(null);useEffect(() => {// 仅在url变化时执行fetch(url).then(res => res.json()).then(setData);}, [url]); // 依赖项数组包含urlreturn <div>{JSON.stringify(data)}</div>;
}
3. 自定义Hooks设计原则

自定义Hooks的设计直接影响代码的可读性和可维护性。遵循以下原则可以创建高质量的自定义Hooks:

  1. 单一职责原则:每个Hook只处理一个功能
  2. 依赖显式声明:通过参数传递外部依赖
  3. 返回标准接口:保持Hook使用的一致性
  4. 使用useDebugValue:提升可调试性
// 基础层Hook
function useLocalStorage(key, initialValue) {const [value, setValue] = useState(() => {const storedValue = localStorage.getItem(key);return storedValue ? JSON.parse(storedValue) : initialValue;});useEffect(() => {localStorage.setItem(key, JSON.stringify(value));}, [key, value]); // 依赖项准确return [value, setValue];
}// 业务层Hook
function useCookie(name, initialValue) {const [cookie, setCookie] = useState(initialValue);const updateCookie = (value, options) => {document.cookie = `${name}=${value};${options}`;setCookie(value);};const deleteCookie = () => {document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT`;setCookie(initialValue);};// 添加调试信息useDebugValue cookie, (value) => {return `cookie: ${value}`;};return [cookie, updateCookie, deleteCookie];
}

六、总结与展望

React Hooks代表了React组件开发范式的重大变革,它使函数组件获得了与类组件同等的表达能力,同时简化了代码结构,提升了可维护性。通过合理使用Hooks,开发者可以构建更加模块化、可复用的React应用。

未来发展趋势

  • Hooks API将持续扩展,提供更多并发模式支持
  • 自定义Hooks的生态将更加丰富,形成标准解决方案
  • Hooks与TypeScript的结合将更加紧密,提供更好的类型推断
  • React开发者工具将增强Hooks调试功能,提升开发体验

掌握Hooks的关键点

  • 理解Hooks的工作原理和使用规则
  • 熟练使用常用内置Hooks(useState、useEffect等)
  • 学会封装自定义Hooks,实现逻辑复用
  • 注意性能优化,合理使用useMemo和useCallback
  • 熟悉并发模式API,提升应用流畅度

React Hooks不是银弹,而是工具。开发者应根据具体场景选择合适的Hooks,避免过度使用导致代码复杂度增加。通过实践和经验积累,开发者将能够充分发挥Hooks的优势,构建更高效、更可维护的React应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87582.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINUX75 LAMP

LAMP 环境 yum NetworkManager systemctl status firewalld setenforce 0 Last login: Fri Jul 4 19:21:47 2025 from 192.168.235.1 [rootweb ~]# cd /usr/local/apache2/conf/ [rootweb conf]# ls extra httpd.conf httpd.conf.bak magic mime.types original [root…

cloudflare配合github搭建免费开源影视LibreTV一个独享视频网站 详细教程

一、项目简介 LibreTV 是一个开源的 IPTV/影视聚合前端项目&#xff0c;支持 M3U 播放列表、EPG 电子节目单等。它本身是纯前端项目&#xff0c;非常适合用 GitHub Pages Cloudflare 免费托管。 二、准备工作 GitHub 账号 注册并登录 GitHub Cloudflare 账号 注册并登录 …

Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)

进程 文章目录 进程I 进程基本概念1、进程和程序2、进程号和父进程号3、进程内存布局4、虚拟内存管理&#xff08;1&#xff09;程序的两种局部性&#xff08;2&#xff09;虚拟内存的规划&#xff08;3&#xff09;虚拟内存的优点 5、栈和栈帧6、命令行参数argc和argv7、环境变…

0基础学Python系列【25】 单元测试入门教程

大家好,欢迎来到Python学习的第三站!🎉 这部分会涉及一些Python的进阶技术,虽然不一定是必需的,但学会这些,你会觉得编程更得心应手。 本章要学什么? Python调试器(pdb)装饰器lambda函数代码性能分析单元测试入门 —— 今天讲这里听起来有点多?别担心,我们慢慢来,…

iOS常见内存错误码

一、经典十六进制错误码0xDEADBEEF&#xff08;EXC_BAD_ACCESS&#xff09; 含义&#xff1a;野指针访问&#xff08;访问已释放的内存地址&#xff09;。 记忆点&#xff1a;“DEAD BEEF” 可理解为 “死亡牛肉”&#xff0c;象征指针指向的内存已 “死亡”。 触发场景&#x…

CSS01:CSS的快速入门及优势

CSS快速入门 style 练习格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS</title><!-- 规范,<style>可以编写css代码,每一个声明最好用分号结尾语法&#xff1a;…

springsecurity5配置之后启动项目报错:authenticationManager cannot be null

目录 配置代码 报错信息 解决办法 配置代码 下面的配置为响应式的配置方式 //这个配置只是配置springboot admin的一个例子,具体的配置可能比较复杂 @EnableWebFluxSecurity public class SecurityConfig {private final AdminServerProperties adminServer;public Securi…

攻防世界-Rerverse-game

知识点 1.ida逆向 2.函数分析逆向 步骤 用Exeinfo打开&#xff0c;为32位exe文件。 方法一&#xff1a; 玩游戏通关&#xff0c;根据游戏规则&#xff0c;m1&#xff0c;n依次为1到8即可得到flag。 方法二&#xff1a; 用32位IDA打开 ctrlF搜索main&#xff0c;点击_main,…

openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群

目录 0 | 为什么要写这篇教程&#xff1f; 1 | 准备工作 1.1 控制节点手工下载 MinIO 1.2 SSH 互信&#xff08;可跳过&#xff0c;本教程已有互信&#xff09; 1.3 安装 Ansible & SELinux 依赖 2 | 项目目录 3 | Inventory hosts.ini 4 | 变量文件 group_vars/al…

最左匹配原则

导读&#xff1a; 首先创建一张 test 表&#xff0c;并插入一些数据&#xff1a; CREATE TABLE test ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键, a int(11) NOT NULL, b int(11) NOT NULL, c int(11) NOT NULL, d int(11) NOT NULL, PRIMARY KEY (id), KEY idx_abc …

MySQL 8.0 OCP 1Z0-908 题目解析(17)

题目65 Choose two. Which two are characteristics of snapshot-based backups? □ A) The frozen file system can be cloned to another virtual machine immediately into active service. □ B) There is no need for InnoDB tables to perform its own recovery when re…

Level2_12小球与挡板(移动+反弹)

一、前引 #已经学习完了: #1.数据结构&#xff1a;集合、元组、字典 #2.函数 #3.类和对象 #4.继承与多态 #1.规划编程项目: #&#xff08;1&#xff09;你想做什么什么样功能的项目&#xff1f; # 接小球游戏,碰到挡板时自动反弹 #&#xff08;2&#xff09;功能有哪些&#x…

win11 2025开机禁用微软账号登录,改本地用户登录,品牌预装机福音

今天开箱了品牌商出厂系统一台华为笔记本&#xff0c;开机提示连接wifi并需要登录微软账号&#xff0c;其中过程实在缓慢&#xff0c;而且老是提示自动更新&#xff0c;速度太慢了&#xff0c;等的花都谢了&#xff0c;进到桌面大概得要30-40分钟&#xff0c;还不如本地用户登录…

【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)

ELF文件格式内部结构详解(三) 文章目录 ELF文件格式内部结构详解(三)12、动态部分和动态加载13、依赖加载(需要)14、程序重定位14.1 静态重定位14.2 动态重定位14.3 全局偏移表 (GOT)14.4 过程链接表 (PLT)12、动态部分和动态加载 ELF 文件格式中的 .dynamic 部分用于指…

HTML知识复习2

文章目录 HTML5简介什么是HTML5HTML5优势 新增语义化标签新增布局标签新增状态标签新增列表标签新增文本标签 新增表单功能表单控件新增属性input新增属性值 新增多媒体标签视频标签音频标签 HTML5兼容性处理 HTML5简介 什么是HTML5 HTML5 是新一代的 HTML 标准&#xff0c;2…

栈(Stack)和队列(Queue)

文章目录 前言1. 栈(Stack)1.1 什么是栈1.2 栈的常用操作1.3 栈的模拟实现1.4 栈的应用场景1.4.1 元素序列处理1.4.2 字符串反转1.4.3 括号匹配1.4.4 逆波兰表达式求值1.4.5 栈的压入、弹出序列1.4.6 最小栈1.4.7 递归转循环 1.5 概念区分1.5.1 数据结构中的栈1.5.2 JVM中的虚拟…

5G MEC四大核心挑战技术解析报告

一、MEC园区部署挑战:数据本地化与低时延接入 痛点深度解析 数据不出园区:工业质检、医疗影像等敏感业务需数据在本地闭环处理。但运营商基站与企业MEC间若经公网绕行,时延超50ms且存在泄露风险。L2网络局限:传统L2接入网无法实现基站→UPF的智能路由,导致业务流绕行城域…

【硬核拆解】英伟达Blackwell芯片架构如何重构AI算力边界?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 一、Blackwell诞生的算力危机&#xff08;2025现状&#xff09; graph TD A[2025年AI算力需求] --> B[千亿参数模型训练能耗…

【深度学习模块】图像的相对位置编码

这个是一个常用的模块&#xff0c;就是我们可以对输入的特征嵌入位置编码。 位置编码&#xff08;Positional Encoding&#xff09;是一种将空间位置信息嵌入到特征中的方法&#xff0c;通常用于帮助模型更好地理解特征的空间关系。 这里介绍的这个是相对位置编码&#xff0c;…

osg加入实时光照SilverLining 天空和3D 云

OSG系列文章目录 文章目录 OSG系列文章目录一、前言官网的介绍&#xff1a; 二、编译官网例子 一、前言 osg本身也可以加入动态云&#xff0c;但是效果有点差强人意&#xff0c;这里我们使用sundog公司的动态云&#xff1a;SilverLining 天空和 3D 云。 官网的介绍&#xff1…