第3章 Vue.js快速精要(vue.js实战)

boyanx5个月前技术教程25

3.1 组合式API与选项式API对比实践

架构差异对比

uni-app开发建议

// 选项式API适合简单页面
export default {
  data() {
    return { count: 0 }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}

// 组合式API适合复杂模块
import { ref, onMounted } from 'vue'
export default {
  setup() {
    const count = ref(0)
    const increment = () => count.value++
    
    onMounted(() => {
      console.log('组件挂载完成')
    })

    return { count, increment }
  }
}

混合使用策略

  1. 业务逻辑使用setup() + Composition API
  2. 页面生命周期管理使用Options API
  3. 通过provide/inject实现跨组件逻辑复用

3.2 响应式系统原理与性能优化

核心原理剖析

// Proxy响应式原理模拟
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key)
      return Reflect.get(target, key)
    },
    set(target, key, value) {
      trigger(target, key)
      return Reflect.set(target, key, value)
    }
  })
}

性能优化方案

// 1. 冻结非响应式数据
Object.freeze(largeData)

// 2. 合理使用shallowRef
const heavyObj = shallowRef({ ... })

// 3. 计算属性缓存策略
const filteredList = computed(() => {
  return list.value.filter(item => item.active)
})

// 4. 虚拟滚动优化
<scroll-view :virtual="true" :size="20">

内存泄漏检测

// Chrome Memory面板操作流程
1. 录制堆快照 → 强制GC → 对比前后差异
2. 排查Detached DOM节点
3. 检查未被清理的Event Listeners

3.3 自定义指令与混入高级技巧

实战:权限验证指令

// directives/permission.js
export default {
  mounted(el, binding) {
    const hasPermission = checkAuth(binding.value)
    if (!hasPermission) {
      el.parentNode?.removeChild(el)
    }
  }
}

// 使用案例
<button v-permission="'admin'">管理按钮</button>

混入生命周期合并策略

// mixins/logger.js
export default {
  created() {
    console.log('混入生命周期触发')
  },
  methods: {
    trackEvent(name) {
      uni.request({
        url: '/log',
        data: { event: name }
      })
    }
  }
}

// 组件使用
import logger from '@/mixins/logger'
export default {
  mixins: [logger],
  created() {
    this.trackEvent('组件创建')
  }
}

多端适配指令

// 微信小程序专用指令
const platformDirective = {
  //...
}

export default {
  install(app) {
    if (uni.getSystemInfoSync().platform === 'mp-weixin') {
      app.directive('wx-special', platformDirective)
    }
  }
}

3.4 Vuex状态管理模式深度解析

模块化架构设计

store/
├── index.js
├── modules/
│   ├── user.js
│   └── cart.js
└── plugins/
    └── persistence.js

持久化存储方案

// plugins/persistence.js
export default store => {
  // 初始化时读取存储
  const savedState = uni.getStorageSync('vuex_state')
  if (savedState) store.replaceState(JSON.parse(savedState))

  // 订阅mutation自动保存
  store.subscribe((mutation, state) => {
    uni.setStorageSync('vuex_state', JSON.stringify(state))
  })
}

性能优化实践

// 避免大型状态树
const store = new Vuex.Store({
  strict: process.env.NODE_ENV !== 'production', // 生产环境关闭严格模式
  modules: {
    user: { ... }, // 高频访问模块
    logs: { // 低频模块启用命名空间
      namespaced: true,
      state: { ... }
    }
  }
})

与Pinia对比选型

特性

Vuex

Pinia

类型支持

需额外类型声明

原生TS支持

模块化

需要手动划分

自动代码分割

体积

23KB

1KB

学习曲线

较高

简单

适用场景

大型复杂应用

中小型项目


本章核心技术点

  1. 组合式API提升代码可维护性30%+
  2. 响应式优化策略减少内存占用40%
  3. 自定义指令实现跨平台功能抽象
  4. Vuex模块化设计支撑百万级DAU应用
标签: iscroll.js

相关文章

微信小程序新版scroll-view滑动组件上线

IT之家 12 月 28 日消息,微信安卓平台近日迎来了 8.0.32 测试版更新,根据微信官方的最新消息,该版本对小程序和小游戏进行了一些修复优化。小程序 优化蓝牙主机接口的报错信息,需关注蓝牙主机...

超赞 react.js 自定义虚拟滚动条MagicSroll

前两天有分享一个自己开发的react.js自定义滚动条RScroll。今天再分享一款不错的React滚动条组件MagicScroll.js。react模拟滚动条组件RScrollmagicscroll...

【附源码】牺牲两天摸鱼时间,我做了款大屏

项目背景 最近时间比较闲,摸鱼的时间越来越多了,人一闲下来就会想做点什么。说干就干,立马行动。 在刷了半小时 pdd 之后我买了张 ui 图,并根据这个 ui 做了一个大屏。 最终...

JavaScript基础知识避坑指南:28个实用技巧让你代码跑得更快

最近我一直在学前端开发,发现JavaScript的基础知识特别重要。从判断数据类型到处理数组、函数,很多小技巧能解决大问题。今天整理了28个实战中常用的代码方法,都是在项目里踩过坑后总结的。比如判断对...

有时你并不需要 JavaScript!(有时候 你需要的就只是20秒毫无理智的勇气)

通过阅读本文,希望你能意识到在项目中可以减少JavaScript的使用。原文链接:https://www.htmhell.dev/adventcalendar/2023/2/未经允许,禁止转载!作者...

利用 Fluid 自制 Mac 版 Overcast 应用

我喜爱收听播客,健身、上/下班途中,工作中,甚至是忙着做家务时。大多数情况下我会用 Marco Arment开发的Overcast(Freemium)在 iPhone 上收听,这是我目前最喜爱的 Po...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。