Vue 组件间六种通信方式详解
版权申诉
91 浏览量
更新于2024-09-10
收藏 173KB PDF 举报
Vue 组件间通信六种方式
在 Vue.js 中,组件实例的作用域是相互独立的,这意味着不同组件之间的数据无法相互引用。因此,组件间通信变得非常重要。根据不同的使用场景,选择合适的通信方式是非常关键的。本文总结了 Vue 组件间通信的六种方式:props、$emit/$on、Vuex、$parent/$children、$attrs/$listeners 和 provide/inject。
1. Props
Props 是 Vue 中最基本的组件间通信方式。父组件可以通过 props 将数据传递给子组件。子组件可以通过 props 接收父组件传递的数据。
例如,在 App.vue 父组件中,我们可以通过 props 将用户数据传递给 Users.vue 子组件:
```html
// App.vue 父组件
<template>
<div id="app">
<users v-bind:users="users"></users>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
users: ["Henry", "Bucky", "Emily"]
}
},
components: {
"users": Users
}
}
```
在 Users.vue 子组件中,我们可以通过 props 接收父组件传递的数据:
```html
// Users.vue 子组件
<template>
<div class="hello">
<ul>
<li v-for="user in users">{{ user }}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
users: {
type: Array
}
}
}
</script>
```
2. $emit/$on
$emit/$on 是一种基于事件的通信方式。子组件可以通过 $emit 触发事件,而父组件可以通过 $on 监听事件。
例如,在 Users.vue 子组件中,我们可以通过 $emit 触发事件:
```html
// Users.vue 子组件
<template>
<div class="hello">
<button @click="$emit('addUser', 'New User')">添加用户</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld'
}
</script>
```
在 App.vue 父组件中,我们可以通过 $on 监听事件:
```html
// App.vue 父组件
<template>
<div id="app">
<users @addUser="handleAddUser"></users>
</div>
</template>
<script>
export default {
name: 'App',
methods: {
handleAddUser(user) {
console.log(`添加用户:${user}`);
}
}
}
</script>
```
3. Vuex
Vuex 是一个状态管理器,可以帮助我们管理应用程序的状态。我们可以使用 Vuex 来实现组件间通信。
例如,我们可以创建一个 store.js 文件:
```javascript
import Vuex from 'vuex';
const store = new Vuex.Store({
state: {
users: ["Henry", "Bucky", "Emily"]
},
mutations: {
addUser(state, user) {
state.users.push(user);
}
}
});
export default store;
```
然后,在 App.vue 父组件中,我们可以使用 Vuex 来获取状态:
```html
// App.vue 父组件
<template>
<div id="app">
<users></users>
</div>
</template>
<script>
import store from './store';
export default {
name: 'App',
computed: {
users() {
return store.state.users;
}
}
}
</script>
```
4. $parent/$children
$parent/$children 是一种基于组件树的通信方式。我们可以使用 $parent 来访问父组件,而使用 $children 来访问子组件。
例如,在 App.vue 父组件中,我们可以使用 $children 来访问子组件:
```html
// App.vue 父组件
<template>
<div id="app">
<users ref="users"></users>
</div>
</template>
<script>
export default {
name: 'App',
mounted() {
console.log(this.$refs.users); // 访问子组件
}
}
</script>
```
5. $attrs/$listeners
$attrs/$listeners 是一种基于组件树的通信方式。我们可以使用 $attrs 来访问父组件传递的属性,而使用 $listeners 来访问父组件传递的事件。
例如,在 Users.vue 子组件中,我们可以使用 $attrs 来访问父组件传递的属性:
```html
// Users.vue 子组件
<template>
<div class="hello">
<ul>
<li v-for="user in $attrs.users">{{ user }}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld'
}
</script>
```
6. Provide/Inject
Provide/Inject 是一种基于依赖注入的通信方式。我们可以使用 Provide 来提供数据,而使用 Inject 来 inject 数据。
例如,在 App.vue 父组件中,我们可以使用 Provide 来提供数据:
```html
// App.vue 父组件
<template>
<div id="app">
<users></users>
</div>
</template>
<script>
export default {
name: 'App',
provide: {
users: ["Henry", "Bucky", "Emily"]
}
}
</script>
```
在 Users.vue 子组件中,我们可以使用 Inject 来 inject 数据:
```html
// Users.vue 子组件
<template>
<div class="hello">
<ul>
<li v-for="user in users">{{ user }}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
inject: ['users']
}
</script>
```
选择合适的通信方式取决于不同的使用场景。了解这些通信方式可以帮助我们更好地开发 Vue 应用程序。
2020-12-09 上传
2020-10-16 上传
2023-05-01 上传
2023-08-17 上传
2023-10-08 上传
2023-05-10 上传
2023-12-29 上传
2023-09-13 上传
2023-02-06 上传
weixin_38663544
- 粉丝: 4
- 资源: 970
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦