props/emit
父子组件通信provide/inject
祖孙组件通信useAttrs
传递父作用域里除 class 和 style 除外的非 props 属性集合vuex/pinia
通用v-model
ref/expose
前面4中比较常见,这里就不啰嗦了,主要记录一下后两种的用法。
v-model不仅可以用作DOM节点的双向绑定,也可以用于组件之间。
假设A组件是父组件,B组件是子组件
// A.vue
<script setup>
import { ref } from "vue";
import B from "./B.vue";
const count = ref(1);
</script>
<template>
<span>{{ count }}</span>
<B v-model="count" />
</template>
当v-model用于组件之间时,可以看做是
<B :modelValue="count" @update:model-value="count = $event" />
子组件B.vue
// B.vue
<script setup>
const emit = defineEmits(["update:modelValue"]);
const props = defineProps(["modelValue"]);
console.log(props.modelValue); // 获取prop
// 更新modelValue
function onClick() {
emit("update:modelValue", props.modelValue + 1);
}
</script>
v-model
相当于v-model:modelValue
,也可以传递其他参数,例如v-model:count
,如果这样子组件的modelValue也要改为count。
// A.vue
<B v-model:count="count" />
// B.vue
<script setup>
const emit = defineEmits(["update:count"]);
const props = defineProps(["count"]);
console.log(props.count);
function onClick() {
emit("update:count", props.count + 1);
}
</script>