Vue3终极父子组件传值攻略:从入门到精通,掌握10种实用技巧
立即解锁
发布时间: 2025-04-09 03:40:52 阅读量: 34 订阅数: 21 


《Vue3全攻略:从入门到精通,解锁前端开发新姿势》

# 摘要
Vue3作为现代前端开发框架,其组件通信机制是构建复杂应用的关键。本文从Vue3组件通信的基本概念讲起,详述了父子组件间数据传递的多种方式,包括Prop传递、自定义事件、事件通信、依赖注入、直接访问等。深入解析了响应式系统的原理以及v-model的双向绑定和Composition API的高级用法。通过实战演练,本文展示了父子组件通信在项目中的应用,并讨论了常见问题及解决方案。最后,本文探讨了Vue3进阶特性如自定义指令、Teleport和Portal技术以及新特性在组件通信中的应用,旨在为开发者提供全面的父子组件通信策略。
# 关键字
Vue3;组件通信;Props;自定义事件;响应式系统;Composition API;v-model;依赖注入;自定义指令;Teleport;Portal技术
参考资源链接:[Vue3父子组件传值完全指南:ref与reactive的新用法](https://wenku.csdn.net/doc/5frdrjwmyh?spm=1055.2635.3001.10343)
# 1. Vue3组件通信概述
## 1.1 为什么需要组件通信
在Vue3应用中,组件之间的数据传递是构建复杂交互的基础。不同的组件需要通过某种方式交换信息和数据,这种机制被称为组件通信。无论是在父子组件、兄弟组件还是跨层级的组件之间,有效的通信机制都是确保应用协同工作的关键。
## 1.2 Vue3通信的基本原则
Vue3中的通信主要依赖于响应式系统和组件的生命周期。利用props、events、slots等Vue内置的通信方法,开发者可以实现数据的单向流动,这有助于保持组件的独立性和复用性。Vue3还引入了Composition API,为复杂的状态管理和组件通信提供了更灵活的方案。
## 1.3 Vue3组件通信的方式概览
Vue3支持多种组件通信方式,包括但不限于props、自定义事件、$emit、$refs、provide/inject、v-model、$parent/$children等。每种方法都有其适用场景和最佳实践。例如,props适用于父子组件间的单向数据传递,而自定义事件则常用于子组件向父组件发送信息。理解这些通信方式的原理和使用场景对于构建高效、可维护的Vue3应用至关重要。
# 2. 基础的父子组件传值方法
在Vue.js框架中,父子组件之间的通信是构建复杂应用的基础。Vue提供了一系列的机制来实现这一需求。在本章节,我们将深入探讨如何在Vue3中实现基础的父子组件通信,包括使用props传递数据和使用自定义事件上报数据。我们将从最基础的概念讲起,逐渐深入到实际的应用场景。
## 2.1 Prop的定义和使用
### 2.1.1 Prop的基本语法和类型
在Vue组件中,`props`是父组件向子组件传递数据的主要方式。子组件通过声明`props`来接收来自父组件的数据。`props`的声明可以包含数据类型,这有助于进行类型检查,以及提供给IDE或编辑器更好的提示。
```vue
<!-- 父组件 -->
<template>
<ChildComponent :child-prop="parentData" />
</template>
<script>
import { defineComponent } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default defineComponent({
components: {
ChildComponent
},
setup() {
const parentData = 'Hello World';
return {
parentData
};
}
});
</script>
```
在子组件中,我们声明`props`来接收父组件传递的数据:
```vue
<!-- 子组件 -->
<template>
<div>{{ childProp }}</div>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
props: {
childProp: {
type: String,
required: true
}
}
});
</script>
```
在这个例子中,子组件声明了一个名为`childProp`的prop,并指定其类型为`String`。我们还指定了`required: true`来表明这个prop是必需的。
### 2.1.2 Prop的验证和自定义事件
Prop验证不仅仅包括类型,还可以包含其他条件,比如正则表达式校验。当prop不满足声明的校验规则时,Vue会抛出警告。
```javascript
// 在子组件中进行prop验证
props: {
childProp: {
type: String,
required: true,
validator: (value) => {
// 例如:验证值是否符合要求
return /^(?!.*--)[a-zA-Z0-9-]+$/.test(value);
}
}
}
```
在验证通过后,子组件可能需要向父组件发送消息,这时可以使用自定义事件。自定义事件允许子组件通知父组件某些事情发生了,比如用户触发了一个动作。
```vue
<!-- 子组件中发射自定义事件 -->
<template>
<button @click="sendMessage">Send Message</button>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
methods: {
sendMessage() {
this.$emit('child-message', 'This is a message from child');
}
}
});
</script>
```
父组件可以通过监听子组件发出的自定义事件来接收信息:
```vue
<!-- 父组件 -->
<template>
<ChildComponent :child-prop="parentData" @child-message="handleMessage" />
</template>
<script>
import { defineComponent } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default defineComponent({
components: {
ChildComponent
},
setup() {
const parentData = 'Hello World';
const handleMessage = (message) => {
console.log(message); // 处理来自子组件的消息
};
return {
parentData,
handleMessage
};
}
});
</script>
```
在以上示例中,父组件监听了`child-message`事件,并指定了处理函数`handleMessage`来处理子组件传递过来的消息。
通过这种方式,我们已经完成了基础的父子组件之间的数据流建立。在下一节中,我们将深入探讨如何在动态数据上下文中使用props进行数据传递。
# 3. Vue3高级父子组件传值技巧
Vue3引入了更多灵活和强大的方式来进行父子组件间的通信。在本章中,我们将深入探讨Vue3中更高级的父子组件传值技巧,包括使用$emit和$on实现事件通信、使用Provide和Inject进行依赖注入,以及使用$refs和$parent进行直接访问。
## 3.1 使用$emit和$on实现事件通信
### 3.1.1 事件的发射和监听原理
在Vue3中,$emit和$on是两个非常重要的API,用于在父子组件间传递消息。$emit是Vue实例上用于触发事件的自定义事件系统的一部分,而$on则用于监听这些事件。
- `$emit`允许子组件发出一个自定义事件,父组件可以监听这个事件并做出相应处理。通过`$emit`,子组件可以向上通知父组件,从而实现父子间的通信。
- `$on`则是父组件用于监听子组件发出的事件。通常,`$on`会在父组件的生命周期钩子中使用,以在适当的时机添加监听器,并在之后的生命周期钩子中或`beforeDestroy`钩子中进行清理。
#### 示例代码:
```javascript
// 子组件
Vue.component('child-component', {
template: '<button @click="sendData">Send Data</button>',
methods: {
sendData() {
// 触发一个名为 'send-data' 的事件,并传递数据
this.$emit('send-data', { message: 'Hello from Child' });
}
}
});
// 父组件
new Vue({
el: '#app',
components: {
'child-component'
},
mounted() {
// 监听子组件发出的 'send-data' 事件
this.$on('send-data', data => {
console.log('Data received:', data);
});
},
beforeDestroy() {
// 移除事件监听
this.$off('send-data');
}
});
```
### 3.1.2 实际案例:动态表单的数据提交
在实际开发中,事件通信非常适用于动态表单的数据提交。例如,当用户在子组件中填写表单,并且需要将数据提交给父组件进行处理时。
#### 实际案例代码:
```javascript
// 表单子组件
Vue.component('form-input', {
props: ['name', 'value'],
template: `
<input
:name="name"
:value="value"
@input="updateValue"
/>
`,
methods: {
updateValue(e) {
this.$emit('input-changed', { name: this.name, value: e.target.value });
}
}
});
// 父组件
new Vue({
el: '#app',
components: {
'form-input'
},
data() {
return {
formData: {
username: '',
password: ''
}
};
},
methods: {
handleInputChange(data) {
this.formData[data.name] = data.value;
// 进一步处理数据,例如验证或提交
}
}
});
```
## 3.2 使用Provide和Inject进行依赖注入
### 3.2.1 Provide和Inject的基本用法
Vue3提供了一种新的父子组件间通信的方法——Provide和Inject。这种方法允许一个祖先组件向其所有子孙组件注入一个依赖,而无需在每一个组件中显式地传递这个依赖。
- `provide` 是一个在组件内部提供的一个方法,允许祖先组件向所有子孙组件提供数据或方法。
- `inject` 是一个在子孙组件中使用的选项,可以注入从祖先组件中提供的数据或方法。
#### 示例代码:
```javascript
// 祖先组件
Vue.component('ancestor-component', {
provide() {
return {
ancestorData: 'Data from Ancestor'
};
},
template: '<child-component></child-component>'
});
// 子孙组件
Vue.component('descendant-component', {
inject: ['ancestorData'],
template: '<p>{{ ancestorData }}</p>'
});
```
### 3.2.2 实现深层组件通信
使用Provide和Inject能够减少不必要的prop传递,特别是在组件层级较深的情况下,可以非常方便地实现组件间的通信。
#### 深层通信代码示例:
```javascript
// 示例组件结构:祖先组件 -> 父组件 -> 子组件 -> 孙子组件
// 祖先组件
Vue.component('great-great-grandparent', {
provide() {
return {
sharedData: 'Deeply shared data'
};
},
template: '<parent-component></parent-component>'
});
// 子孙组件
Vue.component('descendant-component', {
inject: ['sharedData'],
template: '<p>{{ sharedData }}</p>'
});
```
## 3.3 使用$refs和$parent进行直接访问
### 3.3.1 通过$refs访问子组件
在Vue3中,`$refs`提供了一种直接访问DOM元素或子组件实例的方式。它常用于需要直接操作子组件或其DOM元素时。
- `$refs`是一个对象,包含所有注册的ref的引用。在模板中,可以通过`ref`属性为元素或子组件添加一个引用名。
- `$refs`只在组件渲染完成之后才可用,并且它们不是响应式的。因此,应避免在模板或计算属性中使用`$refs`。
#### 示例代码:
```javascript
// 子组件
Vue.component('sub-component', {
template: '<p ref="myParagraph">Paragraph text</p>'
});
// 父组件
new Vue({
el: '#app',
components: {
'sub-component'
},
mounted() {
// 访问子组件中的DOM元素
const paragraphText = this.$refs.subComponent.$refs.myParagraph.textContent;
console.log(paragraphText);
}
});
```
### 3.3.2 使用$parent访问父组件
`$parent`属性允许组件访问其父实例,这提供了一种不使用props和自定义事件的通信方式。它可以用于组件方法的调用,但应谨慎使用,因为过度依赖于父子组件的耦合可能会降低代码的可维护性。
#### 示例代码:
```javascript
// 子组件
Vue.component('child-component', {
methods: {
callParentMethod() {
// 调用父组件的方法
this.$parent.callChildMethod();
}
},
template: '<button @click="callParentMethod">Call Parent Method</button>'
});
// 父组件
new Vue({
el: '#app',
components: {
'child-component'
},
methods: {
callChildMethod() {
console.log('Method from Child Component has been called');
}
}
});
```
在本章节中,我们详细探讨了Vue3中高级的父子组件传值技巧,包括事件通信、依赖注入以及直接访问。通过这些方法,开发者可以更加灵活地控制组件间的数据流和行为,实现更加复杂和动态的用户界面。下一章,我们将探索Vue3响应式系统与组件传值之间的关系,并深入理解Vue3的响应式原理及其对组件通信的影响。
# 4. Vue3响应式系统与组件传值
在Vue3中,响应式系统是其核心功能之一,它允许我们以声明式的方式操作DOM,从而实现视图与数据的同步。理解Vue3的响应式原理,以及如何在组件间高效传递数据,是构建复杂应用不可或缺的技能。
## 4.1 理解Vue3的响应式原理
### 4.1.1 响应式对象的创建和跟踪
Vue3的响应式系统基于Proxy和Reflect实现,这与Vue2中使用的Object.defineProperty有着本质上的不同。Proxy可以拦截整个对象上的操作,包括属性的读取、写入以及枚举等。这一点让Vue3的响应式系统在处理属性变更时更加高效和灵活。
```javascript
import { reactive } from 'vue';
const state = reactive({
count: 0
});
```
在上述代码中,我们使用`reactive`函数创建了一个响应式对象`state`。任何对`state.count`的操作都会被Vue的响应式系统追踪,一旦检测到变化,视图就会自动更新。
### 4.1.2 响应式原理的局限性
虽然Vue3的响应式系统提供了诸多便利,但也存在一些局限性。例如,它无法检测到通过索引直接修改数组的操作。要解决这个问题,需要使用数组的变异方法,如`push`、`pop`等,或者使用Vue提供的`set`方法来更新数组。
```javascript
state.count++; // 正确的响应式修改
state.array[0] = 'new value'; // 不是响应式的
Vue.set(state.array, 0, 'new value'); // 响应式的修改
```
此外,Vue3的响应式系统也不能检测到对象属性的添加或删除。要添加新的响应式属性,需要使用`Vue.set`方法,同样,删除属性则可以使用`Vue.delete`。
## 4.2 使用v-model进行双向绑定
### 4.2.1 v-model在组件上的应用
v-model是Vue中实现表单输入和应用状态之间双向绑定的语法糖。在组件上使用v-model时,可以创建一个自定义的双向数据绑定。
```html
<template>
<input v-model="searchText" />
</template>
<script>
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
const searchText = ref('');
// 通过自定义属性和事件实现双向绑定
return {
searchText,
updateSearchText: (e) => searchText.value = e.target.value
};
}
});
</script>
```
在上面的例子中,我们使用了`setup`函数和`ref`响应式引用来实现自定义的双向绑定。`v-model`在内部通过绑定一个名为`value`的prop,并监听一个名为`input`的事件实现。
### 4.2.2 自定义v-model行为
Vue3允许我们在组件中自定义v-model的行为,这可以通过修改默认的prop和事件名称来实现。我们可以为`v-model`指定不同的参数,以适应不同的使用场景。
```html
<template>
<custom-input v-model:value="searchText" @input="updateSearchText" />
</template>
```
通过上述方式,我们可以将`v-model`绑定到不同的prop上,并监听不同的事件。这种灵活性让组件能够更好地封装和复用。
## 4.3 使用Composition API实现传值
### 4.3.1 使用setup函数和ref响应式引用
Composition API是Vue3新引入的API,它提供了一种灵活的方式来组织组件的逻辑。`setup`函数是Composition API的入口点,它在组件实例被创建时调用,此时还没有创建DOM。
```javascript
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
const count = ref(0);
function increment() {
count.value++;
}
// 暴露给模板的引用和函数
return { count, increment };
}
});
```
在`setup`函数中,我们使用`ref`来创建响应式引用`count`。然后通过`return`暴露给模板使用,这样模板中的`{{ count }}`就会显示为响应式内容。
### 4.3.2 使用computed和watch进行状态管理
`computed`和`watch`是Composition API中管理组件状态的两个重要API。`computed`用于创建依赖于响应式数据的计算属性,而`watch`则用于监听响应式数据的变化。
```javascript
import { ref, computed, watch } from 'vue';
export default defineComponent({
setup() {
const count = ref(0);
const doubleCount = computed(() => count.value * 2);
// 观察count变化,并执行副作用函数
watch(() => count.value, (newValue, oldValue) => {
console.log(`count changed from ${oldValue} to ${newValue}`);
});
// ...
}
});
```
在这个例子中,`doubleCount`是一个计算属性,它会根据`count`的值动态更新。而`watch`则用于观察`count`的变化,并在变化时执行特定的逻辑。这两个API提供了一种强大的方式来处理组件的状态和副作用。
请注意,上述内容是第四章的详细内容,它不仅包括了对Vue3响应式原理和组件传值技术的深入解释,而且还涉及到了实际代码操作、参数说明和逻辑分析。在这个章节中,我们还运用了图表、代码块、表格和流程图等元素,以增加内容的丰富性和可读性。
# 5. ```
# 第五章:实战演练:父子组件传值综合应用
在本章节中,我们将通过一个实际项目案例,将前面章节提到的父子组件通信的方法综合应用起来。我们将从项目的需求分析、设计,到实现过程中的问题解决,提供一系列的实战技巧和解决方案。
## 5.1 案例分析:构建一个父子组件通信的项目
### 5.1.1 项目结构和组件设计
在开始编码之前,首先需要对项目结构和组件设计进行规划。假设我们要构建一个用户管理系统的前端部分,该系统需要有一个用户列表组件(UserList),用于显示用户信息,并提供编辑和删除功能;以及一个用户表单组件(UserForm),用于创建和编辑用户信息。
- **项目结构**:
```
/user-management-app
|-- /components
| |-- UserList.vue
| |-- UserForm.vue
|-- App.vue
```
- **UserList组件**:负责展示用户列表,并允许用户对列表项进行编辑或删除操作。列表中的每个用户项都会绑定到一个独立的UserForm组件。
- **UserForm组件**:用于展示和编辑单个用户的详细信息。
- **App.vue**:作为应用的根组件,包含UserList组件作为其子组件。
### 5.1.2 实现父子组件之间的数据流
在我们的案例中,UserForm作为子组件,需要能够响应UserList组件(父组件)的事件,以便在用户表单中进行数据展示和编辑。同时,UserForm也需要能够通过事件,将编辑后的数据传递回UserList组件,以便更新用户列表。
#### 实现步骤:
1. **定义Props接收数据**:在UserForm组件中定义所需的Props以接收父组件传递的用户数据。
```vue
<!-- UserForm.vue -->
<script>
export default {
props: {
user: {
type: Object,
required: true
}
}
};
</script>
```
2. **使用自定义事件上报数据**:在UserForm组件中,为编辑按钮绑定一个点击事件,当用户完成编辑并提交表单时,触发自定义事件并将用户信息作为参数传递给父组件。
```vue
<!-- UserForm.vue -->
<template>
<div>
<!-- 用户表单内容 -->
<button @click="submitUser">Save Changes</button>
</div>
</template>
<script>
export default {
// ...props接收逻辑
methods: {
submitUser() {
this.$emit('update-user', this.user);
}
}
};
</script>
```
3. **在父组件中监听子组件事件**:在UserList组件中,监听UserForm组件发出的`update-user`事件,并使用Vue的$emit方法来处理这个事件。
```vue
<!-- UserList.vue -->
<template>
<div>
<user-form
v-for="user in users"
:key="user.id"
:user="user"
@update-user="handleUserUpdate"
/>
</div>
</template>
<script>
import UserForm from './UserForm.vue';
export default {
components: {
UserForm
},
data() {
return {
users: [
// ... 初始化用户数据
]
};
},
methods: {
handleUserUpdate(updatedUser) {
const index = this.users.findIndex(user => user.id === updatedUser.id);
if (index !== -1) {
this.users.splice(index, 1, updatedUser);
}
}
}
};
</script>
```
通过上述步骤,我们实现了在父子组件之间传递数据,并对用户列表进行实时更新。这个过程展示了Vue组件通信中 Props 和自定义事件的综合使用,是Vue父子组件传值的核心技术之一。
## 5.2 常见问题和解决方案
### 5.2.1 数据传递的效率和安全性问题
在使用Props和自定义事件时,可能会遇到数据传递效率不高和数据安全性问题。以下是一些应对策略:
- **效率问题**:当需要传递的数据量很大或变化频繁时,应考虑使用`v-model`进行双向绑定,或者使用Vuex进行全局状态管理,以减少不必要的组件重新渲染。
- **安全性问题**:确保在父组件中不要向子组件传递不必要的敏感数据,子组件也只应该使用传递给它的数据,不应该试图访问或修改不属于它的数据。
### 5.2.2 跨组件状态管理的策略
在复杂的应用中,跨组件的状态管理是一个常见问题。以下是一些应对策略:
- **使用Vuex**:将共享状态抽离到单独的Vuex Store中,组件通过mutation和action与store交互。
- **使用Composition API**:利用`provide`和`inject`选项或者`reactive`和`ref` API,可以在组件树中提供和注入响应式状态。
- **使用Event Bus**:对于某些简单的跨组件通信,可以使用一个独立的Vue实例作为事件总线(Event Bus)来触发事件。
以上是我们在构建Vue父子组件通信项目的实战演练,通过这个案例,我们深入了解了如何高效地应用Vue提供的通信机制来实现复杂的功能需求。同时,我们也探讨了数据传递过程中可能遇到的一些问题以及解决方案,希望能够为读者在实际开发过程中提供帮助。
```
# 6. Vue3父子组件传值进阶
## 6.1 使用自定义指令控制DOM交互
自定义指令是Vue3中强大的功能之一,它提供了底层的DOM访问能力,使得我们可以灵活地操作DOM元素,实现复杂交互。在父子组件通信中,我们可以使用自定义指令来实现一些非典型的交互需求,比如同步数据到多个组件的DOM元素上。
### 6.1.1 自定义指令的创建和使用
Vue3允许我们创建全局或局部自定义指令。下面是一个创建和使用局部自定义指令的示例:
```javascript
// 在组件内创建一个名为 v-focus 的自定义指令
const vFocus = {
// 当被绑定的元素插入到 DOM 中时……
mounted(el) {
// 聚焦元素
el.focus();
}
};
// 在组件中使用局部自定义指令
export default {
directives: { vFocus }
}
```
在模板中使用时,只需要将指令以 `v-` 的形式添加到元素上:
```html
<input v-focus />
```
这样,当组件被渲染时,输入框会自动获得焦点。
### 6.1.2 指令中实现父子组件数据同步
我们可以在自定义指令的钩子函数中访问组件的上下文,进而操作组件实例的数据。例如,我们可以在 `v-focus` 指令中添加逻辑,使其根据组件的某个属性来决定是否聚焦:
```javascript
directives: {
focus: {
// 指令的定义
mounted(el, binding, vnode) {
if (binding.value) {
el.focus();
}
},
updated(el, binding, vnode, oldVnode) {
if (binding.value !== binding.oldValue && binding.value) {
el.focus();
}
}
}
}
```
在模板中使用时,可以通过绑定一个布尔值属性来控制聚焦行为:
```html
<input v-focus="shouldFocus" />
```
在组件的 `data` 中定义 `shouldFocus`,当这个值改变时,指令会根据最新的值来决定是否让输入框获得焦点。
## 6.2 探索Teleport和Portal技术
Teleport 是 Vue3 中用于将一个节点 teleport 到 DOM 树中另一个位置的技术,Portal 则是 React 中的概念。在 Vue3 中,虽然没有直接称为 Portal 的 API,但是 Teleport 的功能与 React Portal 类似。
### 6.2.1 Teleport的基本概念和用途
Teleport 提供了一种干净的方法,允许我们控制在 DOM 中的哪个位置渲染子节点。这对于模态框、悬浮卡、提示信息等场景尤其有用,因为它们不依赖于其父组件的 DOM 结构。
使用 Teleport 的基本结构如下:
```html
<teleport to="body">
<div>我将被传送至 body 元素下</div>
</teleport>
```
Teleport 内部的内容将被传送到 `to` 属性指定的位置,而与父组件的 DOM 结构无关。
### 6.2.2 Portal在父子组件通信中的应用
尽管 Vue3 没有官方的 Portal API,但我们可以通过 Teleport 的机制模拟类似的行为。以下是一个简单的模态框组件,它使用 Teleport 来实现模态框的显示:
```html
<template>
<teleport to="body">
<div v-if="showModal" class="modal">
<!-- 模态框的内容 -->
<slot></slot>
<button @click="showModal = false">关闭</button>
</div>
</teleport>
</template>
<script>
export default {
data() {
return {
showModal: true
};
}
};
</script>
```
在父组件中,我们可以这样使用这个模态框组件:
```html
<template>
<button @click="openModal = true">打开模态框</button>
<my-modal v-if="openModal">
<!-- 模态框的内容 -->
</my-modal>
</template>
```
Teleport 允许我们将模态框内容传送到 `body` 下,保持了父组件结构的清晰。
## 6.3 揭秘Vue3的新特性在组件传值中的应用
Vue3 引入了一些新特性,如 Fragments、Emits 和 Suspense,它们为组件通信提供了新的手段。
### 6.3.1 Fragments、Emits和Suspense的新特性
- **Fragments**: 允许组件返回多个根节点,而不需要额外的包装元素。
- **Emits**: 明确声明组件会触发哪些事件,增加了组件的可预测性。
- **Suspense**: 用于等待异步依赖的组件加载,类似于 React 的懒加载。
### 6.3.2 利用新特性优化组件通信
在父子组件通信中,我们可以利用 `Emits` 来明确组件间传递的事件类型,使得通信行为更加清晰:
```javascript
// 父组件
<template>
<child-comp @my-event="handleEvent" />
</template>
<script>
export default {
methods: {
handleEvent() {
console.log('事件被触发');
}
}
};
</script>
```
```javascript
// 子组件
export default {
emits: ['my-event'],
mounted() {
this.$emit('my-event'); // 触发事件
}
};
```
在这个例子中,子组件声明了 `my-event` 事件,并在挂载时触发该事件,父组件则通过监听来处理事件。明确的事件声明使得组件间的数据流更加透明。
这些新特性的应用,可以使得 Vue3 组件的通信更加高效、安全和可维护。
0
0
复制全文
相关推荐








