
v-show
v-show
不支持在 <template>
元素上使用,也不能和 v-else
搭配使用。
当 v-if
和 v-for
同时存在于一个元素上的时候,v-if
会首先被执行。
同时使用 v-if
和 v-for
是不推荐的,因为这样二者的优先级不明显。
v-for
同时使用 v-if
和 v-for
是不推荐的,因为这样二者的优先级不明显。
当它们同时存在于一个节点上时,v-if
比 v-for
的优先级更高。
这意味着 v-if
的条件将无法访问到 v-for
作用域内定义的变量别名。
reactive()
创建一个响应式对象或数组
1 | <script setup> |
局限性:
- 仅对对象类型有效(对象、数组和
Map
、Set
这样的集合类型),而对string
、number
和boolean
这样的 原始类型 无效。 - 因为 Vue 的响应式系统是通过属性访问进行追踪的,因此我们必须始终保持对该响应式对象的相同引用。
这意味着我们不可以随意地“替换”一个响应式对象,因为这将导致对初始引用的响应性连接丢失:
1 | let state = reactive({ count: 0 }) |
同时这也意味着当我们将响应式对象的属性赋值或解构至本地变量时,或是将该属性传入一个函数时,我们会失去响应性:
1 | const state = reactive({ count: 0 }) |
ref()
Vue 提供了一个 ref()
方法来允许我们创建可以使用任何值类型的响应式ref
1 | <script setup> |
computed()
计算属性值会基于其响应式依赖被缓存。
一个计算属性仅会在其响应式依赖更新时才重新计算。 只要 依赖 不改变,无论多少次访问 都会立即返回先前的计算结果,而不用重复执行 getter 函数
Getter 不应有副作用
不要在 getter 中做异步请求或者更改 DOM!
一个计算属性的声明中描述的是如何根据其他值派生一个值。因此 getter 的职责应该仅为计算和返回该值。
避免直接修改计算属性值
从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算。
watch()、watchEffect()
侦听数据源类型
watch
的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:
1 | const x = ref(0) |
注意,你不能直接侦听响应式对象的属性值。
需要用一个返回该属性的 getter 函数:
1 | const obj = reactive({ count: 0 }) |
1 | watch(todoId, async () => { |
watchEffect()
允许我们自动跟踪回调的响应式依赖。上面的侦听器可以重写为:
1 | watchEffect(async () => { |
要手动停止一个侦听器,请调用 watch
或 watchEffect
返回的函数:
1 | const unwatch = watchEffect(() => {}) |
需要异步创建侦听器的情况很少,请尽可能选择同步创建。如果需要等待一些异步数据,你可以使用条件式的侦听逻辑:
1 | // 需要异步请求得到的数据 |
ref
引用在元素上,则获取的是DOM元素;
1 | <script setup> |
引用在选项式API子组件上:被引用的组件实例和该子组件的 this
完全一致。这意味着父组件对子组件的每一个属性和方法都有完全的访问权。当然也因此,应该只在绝对需要时才使用组件引用。大多数情况下,你应该首先使用标准的 props 和 emit 接口来实现父子组件交互。
引用在组合式子组件上:父组件无法访问到一个使用了 <script setup>
的子组件中的任何东西,除非子组件在其中通过 defineExpose
宏显式暴露:
1 | <script setup> |
组件基础
传递 props
defineProps();
1 | <!-- Child.vue --> |
监听事件
defineEmits();
1 | <!-- Child.vue --> |
v-modal
在组件上使用v-modal。
方法一:
1 | <!-- CustomInput.vue --> |
1 | <CustomInput v-model="searchText" /> |
方法二:
1 | <!-- CustomInput.vue --> |
透传 Attributes
“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on
事件监听器。最常见的例子就是 class
、style
和 id
。
禁用 Attributes 继承
如果你使用了 <script setup>
,你需要一个额外的 <script>
块来书写这个选项声明:
1 | <script> |
多根节点的 Attributes 继承
和单根节点组件有所不同,有着多个根节点的组件没有自动 attribute 透传行为。如果 $attrs
没有被显式绑定,将会抛出一个运行时警告。
1 | <header>...</header> |
1 | <script setup> |
虽然这里的 attrs
对象总是反映为最新的透传 attribute,但它并不是响应式的 (考虑到性能因素)。你不能通过侦听器去监听它的变化。
- Post title: Vue3查缺补漏
- Create time: 2022-03-02 16:35:00
- Post link: 2022/03/02/vue3查缺补漏/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.