
在 Vue 3 的 Script-Setup 模式中,通过 `<script setup>` 标签,将模板、状态和行为逻辑整合,提供紧凑、可读性强的代码结构。使用 `defineExpose` 宏方法,子组件可以显式暴露内部数据和方法给父组件,使父组件能够直接访问子组件的数据。父组件通过子组件的引用来获取子组件的数据,实现组件间直接通信。但需注意,过度使用直接通信可能导致组件耦合性增加,应根据实际情况谨慎使用。
在 Vue 3 中,Script-Setup 模式通过使用 <script setup> 标签来代替传统的 <script> 标签,将模板、状态和行为逻辑都放在一个地方。这种模式使得代码更加紧凑和可读,并且提供了更好的 TypeScript 支持。
在 Script-Setup 模式中,子组件通过使用 'defineExpose' 宏方法来显式地暴露内部数据和方法给父组件。这样父组件就能够通过子组件的引用来直接访问子组件的数据。
下面是一个简单的示例,展示了如何在子组件中使用 'defineExpose' 宏方法暴露数据给父组件:
<template>
<div>
<button @click="increment">{{ count }}</button>
</div>
</template>
<script setup>
import { ref, defineExpose } from 'vue';
const count = ref(0);
const increment = () => {
count.value++;
};
defineExpose({
count,
increment
});
</script>在上面的例子中,子组件暴露了 'count' 和 'increment' 两个数据给父组件使用。
一旦子组件通过 'defineExpose' 宏方法暴露了数据,父组件就可以使用子组件的引用来访问这些数据。
下面是一个父组件的示例,展示了如何通过子组件的引用获取子组件的数据:
<template>
<div>
<ChildComponent ref="child" />
<button @click="logChildCount">Log Child Count</button>
</div>
</template>
<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const child = ref(null);
const logChildCount = () => {
if (child.value) {
console.log(child.value.count.value);
}
};
</script>在上面的例子中,通过使用 'ref' 函数将子组件的引用保存在 'child' 变量中。然后,我们可以通过 'child.value' 来访问子组件的实例,并进一步访问子组件的数据,如 'child.value.count.value'。
通过使用 'defineExpose' 宏方法,我们可以在 'Script-Setup' 模式下实现父组件获取子组件数据的功能。这种方式使得组件之间的通信更加直接和灵活。然而,需要注意的是,过度使用父子组件之间的直接通信可能会导致组件的耦合性增加,因此在实际使用中应该根据具体情况进行权衡和选择。