Vue3的一个重大更新点就是支持Composition API,而且也被业界称为hooks,那么Vue3的"Hooks"与React的Hooks有这么区别呢?
一、核心相似点
1. 逻辑复用与代码组织
-
都解决了传统类组件或选项式 API 中逻辑分散的问题,允许将相关逻辑聚合在一起。
-
示例:
*JavaScript// Vue3 Composition API const useCounter = () => { const count = ref(0); const increment = () => count.value++; return { count, increment }; }; // React Hooks const useCounter = () => { const [count, setCount] = useState(0); const increment = () => setCount(c => c + 1); return { count, increment }; };
2. 函数式编程****范式
- 均支持在函数式组件中管理状态和副作用,减少对类组件的依赖。
3. 状态管理灵活性
- 提供细粒度的状态管理能力,避免全局状态污染。
二、核心差异点
维度 | Vue3 Composition API | React Hooks |
---|---|---|
响应式系统 | 基于 Proxy 的自动依赖追踪 | 依赖手动触发更新(如 setState ) |
生命周期管理 | 显式生命周期钩子(如 onMounted ) |
通过 useEffect 模拟,依赖数组控制执行时机 |
执行模型 | setup 函数仅执行一次 |
函数组件每次渲染都会重新执行所有 Hooks |
逻辑复用机制 | 组合式函数返回响应式对象 | Hooks 返回状态和函数,需遵守规则(如顺序调用) |
副作用管理 | watch /watchEffect 自动追踪依赖 |
useEffect 需手动声明依赖数组 |
闭包陷阱 | 无(Proxy 自动追踪最新值) | 需注意过时闭包问题(依赖数组未正确声明时) |
TypeScript 支持 | 天然集成响应式类型 | 需显式声明类型(如 useState<number>() ) |
三、详细对比分析
1. 响应式系统实现
-
Vue3 :基于 Proxy 的响应式系统自动追踪依赖,数据变化触发精确更新。
*JavaScriptconst state = reactive({ count: 0 }); watchEffect(() => console.log(state.count)); // 自动追踪 state.count
-
React :依赖状态更新函数,需手动触发重新渲染。
*JavaScriptconst [count, setCount] = useState(0); useEffect(() => console.log(count), [count]); // 手动声明依赖
2. 生命周期与副作用
-
Vue3 :明确分离的生命周期钩子(如
onMounted
)。
*JavaScriptonMounted(() => fetchData());
-
React :统一通过
useEffect
管理,依赖数组控制执行。
*JavaScriptuseEffect(() => { fetchData(); return () => cleanup(); // 清理函数 }, [dependency]);
3. 闭包问题与状态更新
-
Vue3:响应式数据始终引用最新值,无过时闭包问题。
-
React :依赖数组未更新时,闭包可能捕获旧值。
*JavaScriptconst [count, setCount] = useState(0); useEffect(() => { const timer = setInterval(() => { console.log(count); // 可能捕获初始化时的 count=0 }, 1000); return () => clearInterval(timer); }, []); // 依赖数组为空,count 不更新
4. TypeScript 集成
-
Vue3 :响应式对象自动推断类型。
*TypeScriptconst state = reactive({ count: 0 }); // 自动推断为 { count: number }
-
React :需显式声明类型。
*TypeScriptconst [count, setCount] = useState<number>(0);