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

boyanx6天前技术教程4

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

相关文章

轻量级 React.js 虚拟美化滚动条组件RScroll

前几天有给大家分享一个Vue自定义滚动条组件VScroll。今天再分享一个最新开发的React PC端模拟滚动条组件RScroll。vue+pc桌面端模拟滚动条组件VScrollrscroll 一款基...

作弊技术2——网站劫持(网站劫持软件)

很多站长朋友都知道网站劫持,但是还是有人不知道什么是网站劫持,网站劫持是什么,下面就由小编介绍一下网站劫持的基本内容。一、什么是网站劫持网站劫持就是指在打开一个网址的时候,出现了一个不属于网站范围的广...

登录人人都是产品经理即可获得以下权益

在 2025 年,AI 爬虫领域迎来了全新变革。本文聚焦于 2025AI 爬虫最佳实践,深入实战演示如何运用 Deepseek、Crawl4ai 以及 Playwright MCP 这三大工具组合,实...

&quot;前端开发者不可错过的技能:SSE流式传输助力实时数据更新!&quot;

背景由于大模型通常是需要实时推理的,Web 应用调用大模型时,它的标准模式是浏览器提交数据,服务端完成推理,然后将结果以 JSON 数据格式通过标准的 HTTP 协议返回给前端。但是这么做有一个问题,...

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

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

小巧 Vue 页面滚动进度条组件ScrollProgress

今天给大家分享一个轻量级Vue.js全屏滚动进度条组件VueScrollProgress。vue-scroll-progress 一款基于vue.js构建的页面滚动进度条组件,非常小巧,GZIP压缩后...

发表评论    

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