一、响应式系统进阶
1. 精准控制响应式追踪
scss
import { effectScope, onScopeDispose } from 'vue'
// 创建独立作用域
const scope = effectScope()
scope.run(() => {
const state = reactive({ count: 0 })
watchEffect(() => console.log(state.count))
})
// 组件卸载时自动清理
onScopeDispose(() => scope.stop())
场景 :管理复杂组件的副作用集合
优势:批量停止侦听器,避免内存泄漏
2. 非响应式数据优化
arduino
const heavyObject = markRaw({
// 10万条数据的静态配置
bigData: [...Array(100000).keys()]
})
// 在响应式系统中使用
const state = reactive({
config: heavyObject, // 不会被代理
active: true
})
效果:减少不必要的响应式代理开销
二、模板引擎黑科技
1. 动态CSS变量绑定
xml
<template>
<div :style="{
'--progress': `${progress}%`,
'--theme-color': themeColor
}">
<div class="progress-bar" />
</div>
</template>
<style scoped>
.progress-bar {
width: var(--progress);
background: var(--theme-color);
}
</style>
创新点:JS与CSS变量的实时联动
2. 高阶v-model用法
xml
<!-- 自定义多v-model组件 -->
<UserForm
v-model:name="userName"
v-model:age="userAge"
v-model:role="userRole"
/>
<!-- 子组件实现 -->
<script setup>
defineProps(['name', 'age', 'role'])
defineEmits(['update:name', 'update:age', 'update:role'])
</script>
优势:支持多个双向绑定参数
三、组件模式进阶
1. 动态组件加载器
javascript
// 智能组件加载器
const AsyncComponent = defineAsyncComponent({
loader: () => import('./HeavyComponent.vue'),
timeout: 3000, // 超时时间
suspensible: false, // 禁用Suspense
onError(error, retry) {
if (error.message.includes('fetch')) {
retry() // 网络错误自动重试
}
}
})
场景:优化大型应用的组件加载体验
2. 组件元编程
javascript
// 自动注册组件配置
const setupComponent = (options) => {
return defineComponent({
...options,
setup(props, ctx) {
// 统一注入逻辑
const theme = inject('theme')
return options.setup?.(props, { ...ctx, theme })
}
})
}
// 使用示例
export default setupComponent({
props: { /* ... */ },
setup(props, { theme }) {
// 可直接使用注入的theme
}
})
优势:实现跨组件的统一逻辑封装
四、TypeScript深度集成
1. 类型安全的Provide/Inject
typescript
// types.ts
interface InjectionKey<T> extends Symbol {}
const ThemeKey: InjectionKey<Theme> = Symbol()
// 提供者
provide(ThemeKey, { color: '#42b983' })
// 消费者
const theme = inject(ThemeKey) // 自动推断类型
优势:避免字符串注入的类型安全问题
2. 复杂Props类型推导
scala
type Props<T extends string> = {
data: Record<T, any>
primaryKey: T
}
defineProps<Props<'id' | 'code'>>() // 自动校验data包含id/code字段
五、性能调优秘籍
1. 虚拟滚动优化器
xml
<template>
<div class="viewport" @scroll="handleScroll">
<div class="scroll-list" :style="{ height: totalHeight }">
<div
v-for="item in visibleItems"
:key="item.id"
:style="{ transform: `translateY(${item.offset}px)` }"
>
{{ item.content }}
</div>
</div>
</div>
</template>
<script setup>
// 计算可见项算法
const visibleItems = computed(() => {
const start = Math.floor(scrollY.value / itemHeight)
return data.slice(start, start + visibleCount)
})
</script>
性能提升:万级数据列表内存占用减少90%
2. 编译时优化配置
php
// vite.config.js
export default defineConfig({
plugins: [vue({
reactivityTransform: true, // 启用响应式语法糖
template: {
compilerOptions: {
hoistStatic: true, // 静态节点提升
cacheHandlers: true // 事件缓存
}
}
})]
})
效果:生产包体积减少5%-15%
六、生态融合技巧
1. Pinia状态快照
typescript
// 状态时光机
const store = useStore()
const history = ref<typeof store.$state[]>([])
store.$subscribe((_, state) => {
history.value.push(JSON.parse(JSON.stringify(state)))
})
// 恢复到指定状态
const restore = (index: number) => {
store.$patch(history.value[index])
}
场景:开发调试/撤销重做功能
2. Vue与Web Components互操作
javascript
// 注册Vue组件为Web Component
import { defineCustomElement } from 'vue'
const MyVueElement = defineCustomElement({
props: { msg: String },
template: `<div>{{ msg }}</div>`
})
customElements.define('my-element', MyVueElement)
// 在原生HTML中使用
<my-element msg="Hello WC!"></my-element>
优势:跨框架复用Vue组件