大家好呀~今天咱们不聊那些老生常谈的 Vue 基础语法,而是来挖一挖官方文档里“藏得比较深”的7个小技巧。这些方法你可能在项目里没见过,但一旦用上,代码立马变得更短、更快、更清晰,面试时候提一嘴,面试官眼睛都亮了!
别急,总共就7条,30秒就能学会,模板、组合式 API、性能优化全都有,拿来即用,不讲虚的。咱们一个一个来看。
1️⃣ v-memo
—— 模板级的“记忆术”,让 diff 更聪明
咱们先想想这个场景:你渲染一个很长的列表,列表里的每一项数据其实没变,但 Vue 还是老老实实做了一遍 diff 比较,是不是有点浪费?

程序员导航
优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站
这时候,v-memo
就派上用场了。它是 Vue3 专属的一个指令,可以告诉 Vue:“只要这个依赖没变,你就别动我这一块”。
下面这段代码,就是告诉 Vue:只有当 item.text
发生变化时,才需要更新这个 <li>
元素,否则直接跳过比对,大大提升性能。
<template>
<!-- v-memo 后面的数组是它的依赖项 -->
<!-- 只有当 item.text 改变时,这一项才会被重新 patch -->
<ul>
<li v-for="item in list" :key="item.id" v-memo="[item.text]">
{{ item.text }}
</li>
</ul>
</template>
📌 小贴士:它比
computed
更轻量,适合在模板中做局部优化,尤其是大数据列表渲染时,效果立竿见影。
2️⃣ defineOptions
—— 在 <script setup>
里也能设置组件名
用 <script setup>
是真香,但有个小痛点:没法给组件加 name
属性。可有时候调试、递归组件、或者想在 Vue DevTools 里看个清晰的名字,name
就特别重要。

AI 工具导航
优网导航旗下AI工具导航,精选全球千款优质 AI 工具集
以前你可能得写两个 <script>
块,现在不用了,一行 defineOptions
就搞定。
<script setup>
// defineOptions 是一个宏,可以在 <script setup> 中定义组件选项
// 比如 name、inheritAttrs 等
defineOptions({ name: 'MyCard' });
</script>
✅ 好处:不用再写额外的
<script>
标签,代码更干净,组件名也有了,调试更方便。
3️⃣ useTemplateRef
—— 组合式 API 中安全拿 DOM 的新姿势
以前在 <script setup>
里想拿个 DOM 元素,得先声明 ref(null)
,然后模板里 ref="xxx"
,还得注意别拼错名字,一不小心就是 undefined
。
现在 Vue 3.5+ 推出了 useTemplateRef
,可以直接通过模板中的 ref 名字来安全地获取 DOM,告别 null
判断和“魔术字符串”。
<script setup>
// useTemplateRef 接收一个字符串,对应模板中的 ref 名字
// 它会返回一个 ref,值就是对应的 DOM 元素
// 比 ref(null) 更安全、语义更清晰
import { onMounted, useTemplateRef } from 'vue'
const canvas = useTemplateRef('canvas');
onMounted(() => {
// 拿到 canvas 后就可以做绘图操作啦
canvas.value?.getContext('2d');
});
</script>
<template>
<!-- ref 名字要和 useTemplateRef 里的一致 -->
<canvas ref="canvas"></canvas>
</template>
🎯 重点:
useTemplateRef
能避免手动管理 ref 的 null 状态,类型推导也更友好,TypeScript 用户狂喜。
4️⃣ defineExpose
—— 精准控制子组件暴露的 API
父子组件通信时,有时候你只想让父组件调用子组件的某个方法,比如 open()
、reset()
,而不是把所有东西都暴露出去。

免费在线工具导航
优网导航旗下整合全网优质免费、免注册的在线工具导航大全
defineExpose
就是干这个的——它能让你明确告诉外界:“我只暴露这几个方法,别的别想调”。
<!-- Child.vue -->
<script setup>
// 这是一个私有方法,不会被父组件访问到
const internalLogic = () => { /* ... */ }
// 这个方法是公开的
const open = () => console.log('弹窗打开了!');
// defineExpose 明确声明要暴露的属性或方法
// 父组件通过 ref 才能访问到这些内容
defineExpose({ open });
</script>
<!-- Parent.vue -->
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const child = ref()
</script>
<template>
<!-- 点击后调用子组件的 open 方法 -->
<Child ref="child" @click="child.open()" />
</template>
💡 小技巧:如果不写
defineExpose
,子组件默认不暴露任何东西,更安全;写了,就只暴露你想暴露的,控制力更强。
5️⃣ v-bind
注入 CSS 变量 —— 主题切换的终极利器
想做主题色切换?以前可能得写一堆 class 或者用 JS 操作样式。现在,Vue 支持在 <style>
里直接使用 v-bind
,动态绑定 CSS 变量,简直不要太方便。
<template>
<!-- 通过内联 style 绑定自定义属性 -->
<!-- 这里的 --color 会被注入到 scoped 样式中 -->
<div :style="{ '--color': color }">Hello</div>
</template>
<style scoped>
/* 在 CSS 中使用 var() 引用 JS 绑定的变量 */
/* scoped 依然生效,不会污染全局 */
div {
color: var(--color);
}
</style>
🎨 举个栗子:
color
可以是'red'
、'#1677ff'
,甚至是从主题配置里读出来的,一键切换毫无压力。
6️⃣ v-once
—— 静态内容的“免死金牌”
有些内容,比如页面标题、版权信息、帮助文案,从加载到卸载,压根就不会变。但 Vue 默认还是会监听它,万一数据变了还得 diff 一下,多此一举。
这时候,给它加上 v-once
,相当于告诉 Vue:“这玩意儿一辈子就这德行了,别费劲监听了”。
<!-- v-once 让这一行只渲染一次,后续绝不更新 -->
<!-- 编译时直接输出静态 HTML,运行时零 diff 开销 -->
<p v-once>{{ staticText }}</p>
⚡ 性能提示:虽然单个节点影响不大,但如果页面里有大量静态文本,批量使用
v-once
能显著减少内存占用和 diff 时间。
7️⃣ defineAsyncComponent
—— 路由懒加载,首屏飞起来
大项目里,如果所有组件都打包进首页 JS,那首屏加载得等到天荒地老。解决办法?懒加载!
defineAsyncComponent
就是用来做异步组件加载的,配合路由,实现按需加载,让首屏体积直接瘦身 70% 不是梦。
// 定义一个异步组件,只有用到时才加载
// 常用于路由配置中,实现代码分割
const Home = defineAsyncComponent(() => import('./Home.vue'));
// 配合 Suspense 使用,可以展示 loading 状态
// 提升用户体验
🚀 实际效果:用户打开首页时,只加载首页相关代码,其他页面的组件等跳转时再加载,首屏速度嗖嗖的。
✅ 最后总结一下
这7个小技巧,看似不起眼,实则个个都是“效率加速器”:
v-memo
减少不必要的 diffdefineOptions
让 setup 也能有 nameuseTemplateRef
安全拿 DOMdefineExpose
精准暴露 APIv-bind
轻松玩转 CSS 变量v-once
静态内容免监听defineAsyncComponent
懒加载瘦身首屏
大伙儿注意啦,这些可都是 Vue 官方支持的功能,不是什么黑科技,放心大胆用起来!随便在项目里加一两条,代码立马清爽不少,面试时候提一嘴,妥妥加分项~