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

Vue 高级技巧深度解析

Vue 高级技巧深度解析


在这里插入图片描述

mindmaproot(Vue2高级技巧)组件通信EventBusprovide/inject$attrs/$listeners性能优化虚拟DOM优化函数式组件按需加载状态管理Vuex模块化持久化存储严格模式高级指令自定义指令动态组件异步组件渲染控制作用域插槽渲染函数JSX支持

一、组件通信的进阶之道

1.1 跨层级通信方案对比

props
props
provide
inject
父组件
子组件
孙子组件
EventBus

通信方案性能测试

方法100组件通信耗时内存占用适用场景
Props/Events120ms父子组件直接通信
EventBus85ms任意组件间低频通信
Vuex45ms中大型应用状态管理
provide/inject65ms跨多层级组件通信

1.2 高阶属性传递

// 父组件
<template><child v-bind="$attrs" v-on="$listeners"></child>
</template>// 子组件
export default {inheritAttrs: false,mounted() {console.log(this.$attrs); // 获取非props属性console.log(this.$listeners); // 获取所有监听器}
}

最佳实践

  • 使用inheritAttrs: false避免自动绑定到根元素
  • 结合v-bind="$attrs"实现属性透传
  • 通过$listeners批量处理事件监听

二、性能优化深度策略

2.1 虚拟DOM优化技巧

// 优化前
<template><div><div v-for="item in list" :key="item.id">{{ item.content }}</div></div>
</template>// 优化后:使用函数式组件
Vue.component('functional-list', {functional: true,render(h, context) {return context.props.list.map(item => h('div', { key: item.id }, item.content)}
})

优化效果对比

列表长度普通组件渲染时间函数式组件时间提升幅度
1000120ms45ms62%
5000680ms220ms67%

2.2 按需加载实现

// 路由配置
const routes = [{path: '/dashboard',component: () => import(/* webpackChunkName: "dashboard" */ './views/Dashboard.vue')}
]// 异步组件工厂
Vue.component('async-component', (resolve) => {setTimeout(() => {resolve(import('./components/HeavyComponent.vue'))}, 1000)
})

性能提升数据

优化项首屏体积加载时间内存占用
全量打包2.8MB3.2s150MB
按需加载1.1MB1.4s80MB

三、Vuex 高级应用模式

3.1 模块化状态设计

// store/modules/user.js
export default {namespaced: true,state: () => ({profile: null}),mutations: {SET_PROFILE(state, payload) {state.profile = payload}},actions: {async fetchProfile({ commit }) {const res = await api.getProfile()commit('SET_PROFILE', res.data)}}
}// 组件中调用
this.$store.dispatch('user/fetchProfile')

3.2 持久化存储方案

// 使用vuex-persistedstate
import createPersistedState from 'vuex-persistedstate'export default new Vuex.Store({plugins: [createPersistedState({key: 'vuex_storage',paths: ['user.profile'],storage: window.sessionStorage})],modules: {user}
})

存储方案对比

方案容量限制安全性生命周期
localStorage5MB永久
sessionStorage5MB会话期间
Cookie4KB可设置过期时间
IndexedDB250MB+永久

四、自定义指令与渲染控制

4.1 权限控制指令实现

// 注册全局指令
Vue.directive('permission', {inserted(el, binding) {const { value } = bindingconst permissions = store.state.user.permissionsif (!permissions.includes(value)) {el.parentNode && el.parentNode.removeChild(el)}}
})// 使用示例
<button v-permission="'delete'">删除</button>

4.2 渲染函数与JSX

// 普通模板
<template><div :class="wrapperClass"><slot name="header"></slot><ul><li v-for="item in items">{{ item }}</li></ul></div>
</template>// 等价渲染函数
export default {render(h) {return h('div', {class: this.wrapperClass}, [this.$scopedSlots.header(),h('ul', this.items.map(item => h('li', item)))])}
}// JSX写法
export default {render() {return (<div class={this.wrapperClass}>{this.$scopedSlots.header()}<ul>{this.items.map(item => <li>{item}</li>)}</ul></div>)}
}

五、项目最佳实践

5.1 错误监控集成

// 全局错误处理
Vue.config.errorHandler = (err, vm, info) => {console.error(`Error: ${err.toString()}\nInfo: ${info}`)Sentry.captureException(err)
}// 异步错误捕获
window.addEventListener('unhandledrejection', event => {event.preventDefault()console.error('Unhandled promise rejection:', event.reason)
})

5.2 性能监控方案

// 使用Performance API
const perfData = {dns: performance.timing.domainLookupEnd - performance.timing.domainLookupStart,tcp: performance.timing.connectEnd - performance.timing.connectStart,ttfb: performance.timing.responseStart - performance.timing.requestStart,domReady: performance.timing.domContentLoadedEventEnd - performance.timing.navigationStart
}// 发送监控数据
axios.post('/perf-log', perfData)

关键性能指标

指标优秀值可接受值需优化值
DNS查询<50ms<100ms>200ms
TCP连接<100ms<300ms>500ms
首字节(TTFB)<200ms<500ms>1s
可交互时间<2s<3s>5s

相关文章:

  • 【星闪模组开发板WS8204SLEBLEModule】星闪数据收发测试
  • 信息系统项目管理师-工具名词解释(下)
  • STM32 TDS+温度补偿
  • MySQL——存储
  • Redis 分布式锁+秒杀异步优化
  • android11 DevicePolicyManager浅析
  • Rocky8.10安装openhalo1.0
  • 算法——通俗讲解升幂定理
  • 基于深度学习的狗鼻纹身份识别
  • 定制开发还是源码搭建?如何快速上线同城外卖跑腿APP?
  • 算法堆排序记录
  • 1022 Digital Library
  • 【ROS2】行为树 BehaviorTree(五):详细学习端口和黑板
  • 项目集管理汇报报告 (范本)
  • 什么时候触发full GC(发生场景)
  • Snipaste免费版安装教程包含下载、安装、使用(附安装包)
  • Tmi-clnet:从影像学、临床和放射学数据融合判断慢性肝病预后的三模态相互作用网络——医学图像论文学习,论文源码下载
  • 远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?
  • 块存储、文件存储和对象存储的特点、应用场景及区别
  • load_summarize_chain ,load_qa_chain 是什么
  • 95后男中音胡斯豪敲开芝加哥抒情歌剧院大门
  • 文理医工“四轮驱动”,复旦六大新工科创新学院核心团队均亮相
  • 成了“一日顶流”又能如何?
  • 上海地铁5G信号全覆盖后网速如何?记者亲测有这些发现
  • 摩根大通首席执行官:贸易战损害美国信誉
  • 许志强评《伐木》|伯恩哈德的文人共和国