vue3 最佳实践
type
status
date
slug
summary
tags
category
icon
password
Blocking
Blocked by
top
URL
Sub-item
Parent item
基础功能
ref声明响应式状态
- ref的作用是将基本类型转换为响应式对象。
- 可以声明基本数据类型或对象类型,返回一个包含value属性的对象。
- 在
<script>里使用需要附加.value。
- 在模板中会自动解包,不需要附加
.value。
reactive声明响应式对象
- reactive的作用是让对象的属性变成响应式的,可以在模板中直接使用。
- 接受一个对象作为参数,返回一个响应式代理对象。
- 只能声明引用型数据类型。
- 不需要附加
.value。
- 不能重新赋值,否则会失去响应式。
refvs Reactive
推荐使用ref。
reactive | ref |
✅ script 和 template 无差别 | ❌ script 中需要使用 .value |
❌ 只支持对象和数组 | ✅ 任意类型 |
❌ 传递函数会丢失响应式 | ✅ 传递函数不会丢失响应式 |
✅ 直接返回属性 | ✅ 使用 .value 访问属性 |
❌ 解构丢失响应式 | ❌ 解构丢失响应式 |
computed 计算属性
computed 缓存计算属性值,- 懒计算:没有被引用不会计算。
- 缓存属性:计算属性的值会被缓存,只有在相关依赖值改变时,才重新计算。
只读计算属性
默认创建的是一个
只读的计算属性 ref可写计算属性
watch监听
- 需要显式声明响应式依赖
- 默认初始化不会执行,配置参数
immediate
- 默认只会浅层监听,配置参数
deep
- 默认在组件更新前执行,配置参数
flush
- 函数返回值都是停止监听的函数
- callback参数为新旧值,返回值为可清除副作用
监听getter函数
需要指向具体的属性
侦听一个 ref
侦听响应式对象时侦听器会自动启用深层模式。
watchEffect 监听副作用
- 自动跟踪回调的响应式依赖
- 初始化会执行
- 不会深度监听
- 默认在组件更新前执行,配置参数
flush
- 函数返回值都是停止监听的函数
- callback无法获取旧值,返回值为可清除副作用
监听源
unref 解包
防止在一个非
ref上调用.value会抛出一个运行时错误。如果
unref()的参数是一个ref,就会返回其内部值。否则就返回参数本身。这是的val = isRef(val) ? val.value : val语法糖。toRefs 和 toRef解构响应式对象
用
toRefs() 和 toRef() 解构响应式对象,保持响应性。readonly 返回一个只读的值
接受一个对象 (不论是响应式还是普通的),返回一个原值的只读代理。
isRef 检查某个值是否为 ref。
provide +inject依赖注入
provide在祖先组件提供值。接受两个参数:第一个参数是要注入的key,可以是一个字符串或者一个symbol,第二个参数是要注入的值。
inject在后代组件接收值。第一个参数是注入的key。Vue会查找最近组件的提供值 。
父组件
子组件
子组件调用父组件
- props
- 依赖注入
- 状态管理
父组件调用子组件
子组件里定义一个方法,并使用
defineExpose将其导出。父组件里将子组件通过ref 来拿到子组件上的方法。子组件
父组件
生命周期
组件
onUpdated响应状态变更而更新DOM树之后
onUnmounted组件实例被卸载之后
onBeforeMount组件被挂载之前
onBeforeUnmount组件实例被卸载之前
错误
onErrorCaptured捕获了后代组件传递的错误时调用
调试
onRenderTracked组件渲染过程中追踪到响应式依赖时
onRenderTriggered响应式依赖的变更触发了组件渲染时
SSR
onServerPrefetch组件实例在服务器上被渲染之前(SSR only)
keepAlive
onActivated缓存组件被插入到DOM中时调用
onDeactivated当缓存组件从DOM中被移除时调用
指令
v-text 更新元素的文本内容
v-html 更新元素的html内容
注意:在你的站点上动态渲染任意的 HTML 是非常危险的,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要将用户提供的内容作为插值
v-show 按条件改变元素的可见性
v-show根据条件切换元素上css的display属性,来改变元素可见性。
v-show始终会被渲染元素。
v-if 按条件渲染元素
-
v-if根据条件判断是否渲染元素
v-if vs. v-show
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。v-on 给元素绑定事件
缩写:
@- 修饰符
.stop- 调用event.stopPropagation()。.prevent- 调用event.preventDefault()。.capture- 在捕获模式添加事件监听器。.self- 只有事件从元素本身发出才触发处理函数。.{keyAlias}- 只在某些按键下触发处理函数。.once- 最多触发一次处理函数。.left- 只在鼠标左键事件触发处理函数。.right- 只在鼠标右键事件触发处理函数。.middle- 只在鼠标中键事件触发处理函数。.passive- 通过{ passive: true }附加一个 DOM 事件。
v-bind 组件绑定属性
- 缩写:
:
- 用于给组件绑定属性值,可动态绑定一个或多个
attribute,也可以是组件prop
v-model 双向数据绑定
在表单输入元素或组件上创建双向绑定。
仅限:
<input>
<select>
<textarea>
- components
修饰符
.lazy- 监听change事件而不是input
.number- 将输入的合法字符串转为数字
.trim- 移除输入内容两端空格
多个v-model 绑定
父组件
子组件
v-slot 作用域插槽
- 缩写:
#
- 父组件用
v-slot定义一个或多个具名插槽的内容
- 子组件使用
slot组件来定义的插槽位置,并显示父组件定义的内容。
父组件
子组件
渲染结果

v-pre 跳过该元素及其所有子元素的编译
跳过对当前元素及其子元素的编译过程。直接输出元素的原始内容。
渲染结果

css 相关
scoped 作用域限制
当前样式只在当前文件/组件的作用域下生效
:deep 深度渗透
在
scoped的模式下,使用 :deep 来实现父组件的样式影响到子组件。:slotted 插槽样式
默认情况下,作用域的样式是不会影响到子组件,包括
<slot/> 的组件,可以使用 :slotted 给插槽的内容添加样式。:global 全局样式
样式应用于全局
混合使用局部样式和全局样式
动态样式
- 动态
style样式
- 动态
class样式
- v-bind:将
js中的变量的值应用于css中,变量值一般用小写单词表示
