首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

vue与react中监听的简单对比

  • 25-04-18 22:01
  • 2225
  • 5397
juejin.cn

一、核心概念对比

Vue监听机制

  • ‌响应式核心‌:基于Object.defineProperty(Vue2)/Proxy(Vue3)的数据劫持

  • ‌主要API‌:

    • data + watch侦听器
    • computed计算属性
    • $watch方法
  • ‌设计哲学‌:声明式编程,自动依赖追踪

React监听机制

  • ‌响应式核心‌:基于不可变数据和虚拟DOM diff

  • ‌主要API‌:

    • useState + useEffect
    • useMemo/useCallback
    • 类组件的生命周期方法
  • ‌设计哲学‌:函数式编程,显式控制

二、代码实现对比(含优化方案)

Vue实现示例

javascript
代码解读
复制代码
export default { data() { return { count: 0, user: { name: 'John', profile: { age: 30 } } } }, watch: { // 基础监听 count(newVal, oldVal) { console.log(`Count变化: ${oldVal}→${newVal}`); }, // 深度监听优化 user: { handler(val) { /* 处理逻辑 */ }, deep: true, immediate: false // 避免初始化执行 }, // 精确监听嵌套属性 'user.profile.age': function(newAge) { console.log('年龄变化:', newAge); } }, computed: { // 带缓存的计算属性 userInfo() { return `${this.user.name}-${this.user.profile.age}`; } } }

React实现示例

javascript
代码解读
复制代码
import { useState, useEffect, useMemo, useCallback } from 'react'; function UserComponent() { const [count, setCount] = useState(0); const [user, setUser] = useState({ name: 'John', profile: { age: 30 } }); // 基础监听(类似watch) useEffect(() => { console.log('count变化:', count); }, [count]); // 明确依赖 // 深度监听优化方案 useEffect(() => { console.log('user变化:', user); }, [user.name, user.profile.age]); // 精确指定依赖 // 计算属性优化(类似computed) const userInfo = useMemo(() => { return `${user.name}-${user.profile.age}`; }, [user.name, user.profile.age]); // 事件处理优化 const handleClick = useCallback(() => { setCount(prev => prev + 1); }, []); return ( <div> <p>{userInfo}p> <button onClick={handleClick}>增加button> div> ); }

三、深度对比分析

1. 响应式原理差异

维度VueReact
‌数据跟踪‌自动依赖收集手动声明依赖
‌更新触发‌精确到属性级别组件级别重新渲染
‌实现方式‌编译时转换+运行时劫持运行时虚拟DOM diff

2. 性能优化对比

优化策略Vue实现方式React实现方式
‌计算缓存‌自动缓存的computed需手动useMemo
‌函数缓存‌方法自动绑定需手动useCallback
‌列表渲染‌v-for自带key优化需手动指定key
‌深度监听‌内置deep:true支持需手动拆解对象属性

3. 开发体验对比

开发场景Vue优势React优势
‌快速原型‌更少的样板代码更灵活的组件组合
‌复杂状态‌自动化的响应式更新更精确的状态控制
‌跨平台‌更好的uni-app整合更丰富的React Native生态
‌TypeScript‌需要额外类型定义一流的TS支持

四、Uniapp开发中的监听实践

1. Vue语法下的特殊处理

javascript
代码解读
复制代码
// 在uni-app中需要特别注意的watch用法 export default { watch: { // 监听全局变量变化 '$store.state.token'(newVal) { uni.setStorageSync('token', newVal); }, // 处理平台差异 someValue: { handler(val) { // #ifdef H5 console.log('H5特有处理'); // #endif } } } }

2. React语法下的注意事项

scss
代码解读
复制代码
function UniAppComponent() { const [sysInfo, setSysInfo] = useState({}); useEffect(() => { // 获取系统信息 uni.getSystemInfo({ success: res => setSysInfo(res) }); }, []); // 处理平台特定逻辑 useEffect(() => { // #ifdef MP-WEIXIN console.log('微信小程序特有逻辑'); // #endif }, [sysInfo]); }
注:本文转载自juejin.cn的拉不动的猪的文章"https://juejin.cn/post/7494067439242559514"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

104
前端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top