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

React Hooks深度解析与最佳实践:提升函数组件能力的终极指南

在这里插入图片描述

🌟 Hello,我是蒋星熠Jaxonic!
🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。
🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。
🔭 每一次性能优化都是我的天文望远镜,每一次架构设计都是我的引力弹弓。
🎻 在数字世界的协奏曲中,我既是作曲家也是首席乐手。让我们携手,在二进制星河中谱写属于极客的壮丽诗篇!

摘要

作为一名前端开发者,我一直在寻找能够提升代码质量和开发效率的方法。当React团队在16.8版本中引入Hooks时,我立刻意识到这是一场前端开发范式的革命。在过去的几年里,我深入研究了Hooks的工作原理,并在多个企业级项目中实践了这一技术。从最初的困惑到如今的得心应手,我亲身经历了Hooks带来的巨大变革。在本文中,我将分享我对React Hooks的深度理解,包括其设计理念、核心API的使用技巧、常见陷阱及解决方案,以及在实际项目中的最佳实践。通过这篇文章,我希望能够帮助你彻底掌握Hooks,让你的函数组件代码更加简洁、可维护且高效。无论你是刚接触React的新手,还是寻求提升的资深开发者,这篇文章都将为你提供全面而深入的Hooks指南,帮助你在React开发的道路上更进一步。让我们一起探索这个改变了React开发方式的强大特性,解锁函数组件的无限潜力!

1. Hooks的前世今生:为什么需要Hooks?

在深入了解Hooks之前,我们需要理解为什么React团队要引入这一特性。

1.1 类组件的局限性

在Hooks出现之前,React开发主要依赖于类组件。虽然类组件功能强大,但也存在一些明显的问题:

  1. 复杂的生命周期方法:类组件中的生命周期方法往往导致相关逻辑分散在不同的方法中
  2. this绑定问题:在事件处理函数中需要手动绑定this
  3. 逻辑复用困难:高阶组件(HOC)和渲染属性(Render Props)模式虽然能够复用逻辑,但会导致组件嵌套过深
// 类组件示例
class Counter extends React.Component {constructor(props) {super(props);this.state = { count: 0 };// 需要手动绑定thisthis.handleClick = this.handleClick.bind(this);}componentDidMount() {document.title = `点击了 ${this.state.count} 次`;}componentDidUpdate() {document.title = `点击了 ${this.state.count} 次`;}handleClick() {this.setState({ count: this.state.count + 1 });}render() {return (<div><p>你点击了 {this.state.count} 次</p><button onClick={this.handleClick}>点击我</button></div>);}
}

注意上面代码中,更新document.title的逻辑在componentDidMount和componentDidUpdate中重复出现,这是类组件常见的问题之一。

1.2 Hooks的诞生

React团队在2018年React Conf上首次介绍了Hooks概念,并在React 16.8中正式发布。Hooks的设计目标是解决上述类组件的问题,同时保持React的声明式特性。
在这里插入图片描述

2. 核心Hooks详解

2.1 useState:状态管理的基石

useState是最基础的Hook,它让函数组件能够拥有自己的状态。

// useState基本用法
import React, { useState } from 'react';function Counter() {// 声明一个叫"count"的state变量,初始值为0const [count, setCount] = useState(0);return (<div><p>你点击了 {count} 次</p><button onClick={() => setCount(count + 1)}>点击我</button></div>);
}

useState的工作原理可以通过下面的图表来理解:

调用useState
调用useState
组件首次渲染
创建状态
返回当前状态值和更新函数
组件渲染
状态更新?
调用状态更新函数
安排重新渲染
组件重新渲染
获取最新状态
等待事件
useState的高级用法

1. 函数式更新

当新状态依赖于旧状态时,应该使用函数式更新:

// 不推荐
setCount(count + 1);// 推荐
setCount(prevCount => prevCount + 1);

2. 惰性初始化

当初始状态需要复杂计算时,可以使用惰性初始化:

// 初始化函数只会在组件首次渲染时执行一次
const [state, setState] = useState(() => {const initialState = someExpensiveComputation(props);return initialState;
});

2.2 useEffect:副作用处理专家

useEffect用于处理组件中的副作用,如数据获取、订阅或手动修改DOM等。

import React, { useState, useEffect } from 'react';function DocumentTitleExample() {const [count, setCount] = useState(0);// 相当于componentDidMount和componentDidUpdateuseEffect(() => {// 更新文档标题document.title = `你点击了 ${count} 次`;// 返回清理函数,相当于componentWillUnmountreturn () => {document.title = 'React App';};}, [count]); // 仅在count更改时重新执行return (<div><p>你点击了 {count} 次</p><button onClick={() => setCount(count + 1)}>点击我</button></div>);
}

useEffect的依赖数组是其核心概念,它决定了effect的执行时机:

组件React引擎Effect系统首次渲染调度Effect执行执行Effect函数状态更新,重新渲染检查依赖数组执行清理函数(如果存在)执行新的Effect函数跳过Effect执行alt[依赖项变化][依赖项未变化]组件卸载执行清理函数组件React引擎Effect系统

2.3 useContext:跨组件状态共享

useContext让我们可以在不使用Provider嵌套的情况下消费Context。

// 创建Context
const ThemeContext = React.createContext('light');// 父组件提供Context
function App() {return (<ThemeContext.Provider value="dark"><ThemedButton /></ThemeContext.Provider>);
}// 子组件消费Context
function ThemedButton() {// 使用useContext获取主题值const theme = useContext(ThemeContext);return (<button style={{ background: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#333' }}>我是{theme === 'dark' ? '暗色' : '亮色'}主题按钮</button>);
}

2.4 useReducer:复杂状态逻辑的管理者

当组件状态逻辑较复杂时,useReducer是比useState更好的选择。

import React, { useReducer } from 'react';// 定义reducer函数
function counterReducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };case 'reset':return { count: 0 };default:throw new Error(`未知action类型: ${action.type}`);}
}function Counter() {// 使用useReducerconst [state, dispatch] = useReducer(counterReducer, { count: 0 });return (<div><p>计数: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button><button onClick={() => dispatch({ type: 'reset' })}>重置</button></div>);
}

3. 自定义Hooks:逻辑复用的最佳方式

自定义Hooks是React Hooks最强大的特性之一,它允许我们将组件逻辑提取到可重用的函数中。

3.1 自定义Hook的设计原则

  1. 命名以"use"开头:遵循React的约定
  2. 只调用其他Hooks:自定义Hook内部可以调用其他Hook
  3. 关注点分离:每个自定义Hook应该只做一件事

3.2 实用自定义Hook示例

1. useLocalStorage:持久化状态

function useLocalStorage(key, initialValue) {// 状态初始化逻辑const [storedValue, setStoredValue] = useState(() => {try {const item = window.localStorage.getItem(key);return item ? JSON.parse(item) : initialValue;} catch (error) {console.error(error);return initialValue;}});// 更新状态并同步到localStorageconst setValue = value => {try {// 允许value是函数,类似useStateconst valueToStore = value instanceof Function ? value(storedValue) : value;setStoredValue(valueToStore);window.localStorage.setItem(key, JSON.stringify(valueToStore));} catch (error) {console.error(error);}};return [storedValue, setValue];
}// 使用示例
function App() {const [name, setName] = useLocalStorage('name', '访客');return (<div><inputvalue={name}onChange={e => setName(e.target.value)}placeholder="输入你的名字"/><p>你好, {name}!</p></div>);
}

2. useFetch:数据获取Hook

function useFetch(url, options) {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {let isMounted = true;const fetchData = async () => {try {setLoading(true);const response = await fetch(url, options);if (!response.ok) {throw new Error(`HTTP错误! 状态: ${response.status}`);}const result = await response.json();if (isMounted) {setData(result);setError(null);}} catch (error) {if (isMounted) {setError(error.message);setData(null);}} finally {if (isMounted) {setLoading(false);}}};fetchData();return () => {isMounted = false;};}, [url, JSON.stringify(options)]);return { data, loading, error };
}// 使用示例
function UserProfile({ userId }) {const { data, loading, error } = useFetch(`https://api.example.com/users/${userId}`);if (loading) return <div>加载中...</div>;if (error) return <div>错误: {error}</div>;return (<div><h1>{data.name}</h1><p>邮箱: {data.email}</p></div>);
}

4. Hooks性能优化策略

4.1 使用React.memo避免不必要的重渲染

const MemoizedComponent = React.memo(function MyComponent(props) {// 只有当props变化时才会重新渲染return <div>{props.name}</div>;
});

4.2 useCallback缓存回调函数

function ParentComponent() {const [count, setCount] = useState(0);// 没有使用useCallback,每次渲染都会创建新函数const handleClickBad = () => {console.log('Clicked');setCount(count + 1);};// 使用useCallback,函数引用在依赖项不变时保持稳定const handleClickGood = useCallback(() => {console.log('Clicked');setCount(prevCount => prevCount + 1); // 使用函数式更新}, []); // 空依赖数组,函数不会重新创建return (<div><ExpensiveChild onClick={handleClickGood} /><p>Count: {count}</p></div>);
}const ExpensiveChild = React.memo(({ onClick }) => {console.log('ExpensiveChild renders');return <button onClick={onClick}>Click me</button>;
});

4.3 useMemo缓存计算结果

function FilteredList({ items, filter }) {// 使用useMemo缓存过滤结果,只有当items或filter变化时才重新计算const filteredItems = useMemo(() => {console.log('Filtering items...');return items.filter(item => item.includes(filter));}, [items, filter]);return (<ul>{filteredItems.map(item => (<li key={item}>{item}</li>))}</ul>);
}

4.4 性能优化决策树

在这里插入图片描述

在这里插入图片描述

5. Hooks常见陷阱与解决方案

5.1 依赖数组问题

问题:忘记添加依赖或添加错误的依赖

// 错误示例
useEffect(() => {fetchData(userId); // userId是props,但未添加到依赖数组
}, []); // 空依赖数组,effect只会在挂载时执行一次// 正确示例
useEffect(() => {fetchData(userId);
}, [userId]); // 当userId变化时重新执行effect

5.2 闭包陷阱

问题:在effect中使用过时的状态值

// 错误示例
function Counter() {const [count, setCount] = useState(0);useEffect(() => {const timer = setInterval(() => {console.log(`Current count: ${count}`);setCount(count + 1); // 使用的是effect创建时的count值}, 1000);return () => clearInterval(timer);}, []); // 空依赖数组,effect只执行一次,但count会变化return <div>Count: {count}</div>;
}// 正确示例
function Counter() {const [count, setCount] = useState(0);useEffect(() => {const timer = setInterval(() => {setCount(prevCount => prevCount + 1); // 使用函数式更新获取最新状态}, 1000);return () => clearInterval(timer);}, []); // 空依赖数组是合理的,因为我们不依赖外部变量return <div>Count: {count}</div>;
}

5.3 条件渲染中的Hooks

问题:在条件语句中调用Hooks

// 错误示例
function Example(props) {if (props.isLoggedIn) {// 错误:条件调用Hookconst [name, setName] = useState('');}// ...
}// 正确示例
function Example(props) {const [name, setName] = useState('');if (props.isLoggedIn) {// 在Hook调用后使用条件逻辑// ...}// ...
}

6. Hooks与TypeScript:类型安全的React开发

6.1 基本Hook类型定义

// useState with TypeScript
interface User {id: number;name: string;email: string;
}function UserProfile() {// 明确指定类型const [user, setUser] = useState<User | null>(null);// TypeScript可以从初始值推断类型const [isLoading, setIsLoading] = useState(false);// ...
}

6.2 自定义Hook的类型定义

// 带类型的自定义Hook
function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((val: T) => T)) => void] {const [storedValue, setStoredValue] = useState<T>(() => {try {const item = window.localStorage.getItem(key);return item ? JSON.parse(item) : initialValue;} catch (error) {console.error(error);return initialValue;}});const setValue = (value: T | ((val: T) => T)) => {try {const valueToStore = value instanceof Function ? value(storedValue) : value;setStoredValue(valueToStore);window.localStorage.setItem(key, JSON.stringify(valueToStore));} catch (error) {console.error(error);}};return [storedValue, setValue];
}

7. Hooks生态系统与第三方库

React社区已经开发了许多优秀的Hooks库,可以帮助我们更高效地开发应用。

7.1 流行的Hooks库对比

在这里插入图片描述
在这里插入图片描述

7.2 常用第三方Hooks库功能对比

库名主要功能包大小TypeScript支持适用场景活跃度
react-use通用工具Hooks集合中等优秀通用项目
ahooks全面的Hooks库优秀企业级应用
swr数据获取与缓存优秀需要缓存的API调用
react-query数据获取与状态管理中等优秀复杂数据管理
react-hook-form表单处理优秀表单密集型应用

7.3 数据获取库对比:SWR vs React Query

// SWR示例
import useSWR from 'swr';function Profile() {const { data, error, isLoading } = useSWR('/api/user', fetcher);if (error) return <div>加载失败</div>;if (isLoading) return <div>加载中...</div>;return <div>Hello {data.name}!</div>;
}// React Query示例
import { useQuery } from 'react-query';function Profile() {const { data, error, isLoading } = useQuery('user', () => fetch('/api/user').then(res => res.json()));if (error) return <div>加载失败</div>;if (isLoading) return <div>加载中...</div>;return <div>Hello {data.name}!</div>;
}

8. 实战案例:构建一个任务管理应用

让我们通过一个实际的例子来综合应用Hooks知识。

8.1 应用架构

在这里插入图片描述

8.2 使用Context和Reducer管理状态

// TaskContext.js
import React, { createContext, useReducer, useContext, useEffect } from 'react';// 定义初始状态
const initialState = {tasks: [],filter: 'all' // 'all', 'active', 'completed'
};// 定义reducer
function taskReducer(state, action) {switch (action.type) {case 'ADD_TASK':return {...state,tasks: [...state.tasks, action.payload]};case 'TOGGLE_TASK':return {...state,tasks: state.tasks.map(task =>task.id === action.payload? { ...task, completed: !task.completed }: task)};case 'DELETE_TASK':return {...state,tasks: state.tasks.filter(task => task.id !== action.payload)};case 'SET_FILTER':return {...state,filter: action.payload};case 'LOAD_TASKS':return {...state,tasks: action.payload};default:return state;}
}// 创建Context
const TaskContext = createContext();// 创建Provider组件
export function TaskProvider({ children }) {const [state, dispatch] = useReducer(taskReducer, initialState);// 从localStorage加载任务useEffect(() => {const savedTasks = localStorage.getItem('tasks');if (savedTasks) {dispatch({ type: 'LOAD_TASKS', payload: JSON.parse(savedTasks) });}}, []);// 保存任务到localStorageuseEffect(() => {localStorage.setItem('tasks', JSON.stringify(state.tasks));}, [state.tasks]);return (<TaskContext.Provider value={{ state, dispatch }}>{children}</TaskContext.Provider>);
}// 创建自定义Hook以便使用Context
export function useTaskContext() {const context = useContext(TaskContext);if (!context) {throw new Error('useTaskContext必须在TaskProvider内使用');}return context;
}

8.3 任务列表组件

// TaskList.js
import React from 'react';
import { useTaskContext } from './TaskContext';
import TaskItem from './TaskItem';function TaskList() {const { state, dispatch } = useTaskContext();const { tasks, filter } = state;// 根据过滤条件筛选任务const filteredTasks = tasks.filter(task => {if (filter === 'active') return !task.completed;if (filter === 'completed') return task.completed;return true; // 'all'});// 任务统计const completedCount = tasks.filter(task => task.completed).length;const totalCount = tasks.length;const completionRate = totalCount > 0 ? (completedCount / totalCount) * 100 : 0;return (<div className="task-list"><div className="filters"><button className={filter === 'all' ? 'active' : ''}onClick={() => dispatch({ type: 'SET_FILTER', payload: 'all' })}>全部</button><button className={filter === 'active' ? 'active' : ''}onClick={() => dispatch({ type: 'SET_FILTER', payload: 'active' })}>未完成</button><button className={filter === 'completed' ? 'active' : ''}onClick={() => dispatch({ type: 'SET_FILTER', payload: 'completed' })}>已完成</button></div><div className="stats"><p>完成率: {completionRate.toFixed(0)}%</p><p>{completedCount}/{totalCount} 任务已完成</p></div>{filteredTasks.length > 0 ? (<ul>{filteredTasks.map(task => (<TaskItem key={task.id} task={task} />))}</ul>) : (<p className="empty-message">没有{filter === 'all' ? '' : filter === 'active' ? '未完成' : '已完成'}任务</p>)}</div>);
}export default TaskList;

8.4 任务表单组件

// TaskForm.js
import React, { useState } from 'react';
import { useTaskContext } from './TaskContext';function TaskForm() {const { dispatch } = useTaskContext();const [title, setTitle] = useState('');const [priority, setPriority] = useState('medium'); // 'low', 'medium', 'high'const [dueDate, setDueDate] = useState('');const handleSubmit = (e) => {e.preventDefault();if (!title.trim()) return;const newTask = {id: Date.now(),title,priority,dueDate: dueDate || null,completed: false,createdAt: new Date().toISOString()};dispatch({ type: 'ADD_TASK', payload: newTask });// 重置表单setTitle('');setPriority('medium');setDueDate('');};return (<form className="task-form" onSubmit={handleSubmit}><inputtype="text"value={title}onChange={(e) => setTitle(e.target.value)}placeholder="添加新任务..."required/><div className="form-row"><div className="form-group"><label>优先级:</label><select value={priority} onChange={(e) => setPriority(e.target.value)}><option value="low">低</option><option value="medium">中</option><option value="high">高</option></select></div><div className="form-group"><label>截止日期:</label><inputtype="date"value={dueDate}onChange={(e) => setDueDate(e.target.value)}/></div></div><button type="submit">添加任务</button></form>);
}export default TaskForm;

8.5 任务统计组件

// TaskStats.js
import React, { useMemo } from 'react';
import { useTaskContext } from './TaskContext';function TaskStats() {const { state } = useTaskContext();const { tasks } = state;// 使用useMemo缓存计算结果const stats = useMemo(() => {const totalTasks = tasks.length;const completedTasks = tasks.filter(task => task.completed).length;const activeTasks = totalTasks - completedTasks;const priorityCounts = tasks.reduce((acc, task) => {acc[task.priority] = (acc[task.priority] || 0) + 1;return acc;}, { low: 0, medium: 0, high: 0 });const completionRate = totalTasks > 0 ? (completedTasks / totalTasks) * 100 : 0;return {totalTasks,completedTasks,activeTasks,priorityCounts,completionRate};}, [tasks]);return (<div className="task-stats"><h2>任务统计</h2><div className="stats-grid"><div className="stat-card"><h3>总览</h3><p>总任务数: {stats.totalTasks}</p><p>已完成: {stats.completedTasks}</p><p>未完成: {stats.activeTasks}</p></div><div className="stat-card"><h3>优先级分布</h3><p>高: {stats.priorityCounts.high}</p><p>中: {stats.priorityCounts.medium}</p><p>低: {stats.priorityCounts.low}</p></div></div><div className="completion-chart"><h3>完成率: {stats.completionRate.toFixed(0)}%</h3><div className="progress-bar"><div className="progress" style={{ width: `${stats.completionRate}%` }}></div></div></div>{/* 使用Mermaid图表可视化数据 */}{/* 在实际应用中,可以使用React-Mermaid或其他图表库 */}</div>);
}export default TaskStats;

8.6 任务优先级分布图表

20%48%32%图2:任务优先级分布高优先级中优先级低优先级

9. Hooks最佳实践总结

在使用React Hooks进行开发时,遵循以下最佳实践可以帮助你避免常见问题并提高代码质量。

9.1 Hooks使用规则

“Hooks是React的魔法咒语,但魔法总是有规则的。遵循这些规则,你将获得魔法的力量;违反它们,你将陷入混乱。” —— Dan Abramov,React核心团队成员

  1. 只在顶层调用Hooks:不要在循环、条件或嵌套函数中调用Hooks
  2. 只在React函数组件或自定义Hooks中调用Hooks:不要在普通JavaScript函数中调用
  3. 自定义Hook必须以"use"开头:这是一个约定,帮助React识别Hook
  4. 依赖数组必须包含所有外部依赖:确保effect中使用的所有变量都在依赖数组中

9.2 性能优化建议

  1. 避免过度优化:在发现性能问题之前,不要急于应用优化技术
  2. 合理使用缓存Hooks:useCallback和useMemo只在必要时使用
  3. 拆分组件:将大型组件拆分为更小的组件,以减少不必要的重渲染
  4. 使用React.memo包装纯组件:对于纯展示型组件,使用React.memo可以避免不必要的重渲染

9.3 状态管理策略

在这里插入图片描述
在这里插入图片描述

  1. 本地状态使用useState:对于简单的组件内状态
  2. 复杂状态逻辑使用useReducer:当状态逻辑变得复杂时
  3. 跨组件共享状态使用Context:避免props drilling
  4. 大型应用考虑专门的状态管理库:如Redux、Zustand等

10. 未来展望:Hooks的发展趋势

React Hooks自推出以来不断发展,未来可能会有更多创新。

10.1 React团队正在探索的新Hook

  1. useEvent:解决回调函数稳定性问题
  2. useSubscription:简化订阅模式
  3. useImperativeHandle的改进:更好地支持命令式编程

10.2 社区创新方向

  1. AI辅助Hook开发:智能推荐最佳Hook使用方式
  2. 更强大的状态同步机制:跨组件、跨应用的状态同步
  3. 更好的开发者工具:专门针对Hooks的调试和性能分析工具

总结

作为一名前端开发者,我亲身经历了React Hooks带来的开发范式转变。从最初的困惑到现在的熟练应用,这段旅程让我深刻理解了Hooks的强大之处。Hooks不仅简化了组件逻辑,还提供了更优雅的状态管理和副作用处理方式。在本文中,我们深入探讨了核心Hooks的工作原理、自定义Hooks的设计模式、性能优化策略以及常见陷阱的解决方案。通过实战案例,我们看到了如何将这些知识应用到实际项目中。

React Hooks的出现标志着函数组件时代的到来,它让我们能够在不使用类的情况下享受React的全部功能。随着React生态系统的不断发展,Hooks将继续演化,为我们提供更强大、更灵活的工具。作为开发者,我们需要不断学习和实践,掌握Hooks的最佳实践,以构建更高质量的React应用。

我相信,随着你对Hooks的深入理解和熟练应用,你将能够编写出更简洁、可维护且高性能的React代码。希望本文能够成为你掌握React Hooks的有力工具,帮助你在React开发的道路上更进一步。让我们一起拥抱函数式组件的未来,充分发挥Hooks的强大潜力!

■ 我是蒋星熠Jaxonic!如果这篇文章在你的技术成长路上留下了印记
■ 👁 【关注】与我一起探索技术的无限可能,见证每一次突破
■ 👍 【点赞】为优质技术内容点亮明灯,传递知识的力量
■ 🔖 【收藏】将精华内容珍藏,随时回顾技术要点
■ 💬 【评论】分享你的独特见解,让思维碰撞出智慧火花
■ 🗳 【投票】用你的选择为技术社区贡献一份力量
■ 技术路漫漫,让我们携手前行,在代码的世界里摘取属于程序员的那片星辰大海!

参考链接

  1. React官方文档 - Hooks介绍
  2. React Hooks完全指南 - DigitalOcean
  3. 深入理解React Hooks - Dan Abramov的博客
  4. React Hooks性能优化 - Kent C. Dodds
  5. React Hooks测试策略 - Testing Library
http://www.dtcms.com/a/358009.html

相关文章:

  • 科技信息差(8.30)
  • 聊一聊耳机串扰-Crosstalk
  • 知料觅得-新一代AI搜索引擎
  • RK3576开发板串口配置及使用
  • STM32 之GP2Y1014AU0F的应用--基于RTOS的环境
  • 在 Git Bash 中查看 Git 仓库远程地址
  • flink中 Lookup Join和Interval Join和Regular Join使用场景与对比
  • 【云原生】Docker 搭建Kafka服务两种方式实战操作详解
  • 阿里云如何申请免费的ssl证书并部署
  • 嵌入式Linux驱动开发:ICM20608六轴传感器SPI驱动
  • 期刊 | 《电讯技术》期刊2025年投稿指南总结
  • 硬件SPI读写W25Q64
  • 北京交通大学:LLM的agent推理框架综述
  • 算法复习笔记: 双指针_二分查找篇
  • 详解推测性采样加速推理的算法逻辑
  • Kafka 消费模型
  • 本地运行的检索PDF文件中出现关键字的python程序
  • 2025年如何批量下载雪球帖子和文章导出pdf?
  • 2025 批量下载雪球和东方财富帖子和文章导出excel和pdf
  • kind集群应用
  • 《云原生架构从崩溃失控到稳定自愈的实践方案》
  • 「鸿蒙系统的编程基础」——探索鸿蒙开发
  • 第12章:推荐算法与实践
  • 科技感网页计时器.html
  • 设计模式:抽象工厂模式(Abstract Factory Pattern)
  • 在word以及latex中引用zotero中的参考文献
  • 单例模式的mock类注入单元测试与友元类解决方案
  • 云存储(参考自腾讯云计算工程师认证)
  • Twitter舆情裂变链:指纹云手机跨账号协同机制提升互动率200%
  • 使用电脑操作Android11手机,连接步骤