千家信息网

Vue2有哪些组件通讯

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下Vue2有哪些组件通讯,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!下面把每一种组件通信方式的写法一一列
千家信息网最后更新 2026年11月03日Vue2有哪些组件通讯

小编给大家分享一下Vue2有哪些组件通讯,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

下面把每一种组件通信方式的写法一一列出

1. props

父组件向子组件传送数据,这应该是最常用的方式了
子组件接收到数据之后,不能直接修改父组件的数据。会报错,所以当父组件重新渲染时,数据会被覆盖。如果子组件内要修改的话推荐使用 computed

// Parent.vue 传送// Child.vue 接收export default {  // 写法一 用数组接收  props:['msg'],  // 写法二 用对象接收,可以限定接收的数据类型、设置默认值、验证等  props:{      msg:{          type:String,          default:'这是默认数据'      }  },  mounted(){      console.log(this.msg)  },}

2. .sync

可以帮我们实现父组件向子组件传递的数据 的双向绑定,所以子组件接收到数据后可以直接修改,并且会同时修改父组件的数据

// Parent.vue

3. v-model

和 .sync 类似,可以实现将父组件传给子组件的数据为双向绑定,子组件通过 $emit 修改父组件的数据

// Parent.vue

4. ref

ref 如果在普通的DOM元素上,引用指向的就是该DOM元素;
如果在子组件上,引用的指向就是子组件实例,然后父组件就可以通过 ref 主动获取子组件的属性或者调用子组件的方法

// Child.vueexport default {    data(){        return {            name:"沐华"        }    },    methods:{        someMethod(msg){            console.log(msg)        }    }}// Parent.vue

5. $emit / v-on

子组件通过派发事件的方式给父组件数据,或者触发父组件更新等操作

// Child.vue 派发export default {  data(){      return { msg: "这是发给父组件的信息" }  },  methods: {      handleClick(){          this.$emit("sendMsg",this.msg)      }  },}// Parent.vue 响应export default {    methods:{        getChildMsg(msg){            console.log(msg) // 这是父组件接收到的消息        }    }}

6. $attrs / $listeners

多层嵌套组件传递数据时,如果只是传递数据,而不做中间处理的话就可以用这个,比如父组件向孙子组件传递数据时
$attrs:包含父作用域里除 class 和 style 除外的非 props 属性集合。通过 this.$attrs 获取父作用域中所有符合条件的属性集合,然后还要继续传给子组件内部的其他组件,就可以通过 v-bind="$attrs"

$listeners:包含父作用域里 .native 除外的监听事件集合。如果还要继续传给子组件内部的其他组件,就可以通过 v-on="$linteners"

使用方式是相同的

// Parent.vueexport default{    props:["name"], // 这里可以接收,也可以不接收    mounted(){        // 如果props接收了name 就是 { title:1111 },否则就是{ name:"沐华", title:1111 }        console.log(this.$attrs)    }}

7. $children / $parent

$children:获取到一个包含所有子组件(不包含孙子组件)的 VueComponent 对象数组,可以直接拿到子组件中所有数据和方法等
$parent:获取到一个父节点的 VueComponent 对象,同样包含父节点中所有数据和方法等

// Parent.vueexport default{    mounted(){        this.$children[0].someMethod() // 调用第一个子组件的方法        this.$children[0].name // 获取第一个子组件中的属性    }}// Child.vueexport default{    mounted(){        this.$parent.someMethod() // 调用父组件的方法        this.$parent.name // 获取父组件中的属性    }}

8. provide / inject

provide / inject 为依赖注入,说是不推荐直接用于应用程序代码中,但是在一些插件或组件库里却是被常用,所以我觉得用也没啥,还挺好用的

provide:可以让我们指定想要提供给后代组件的数据或方法
inject:在任何后代组件中接收想要添加在这个组件上的数据或方法,不管组件嵌套多深都可以直接拿来用

要注意的是 provide 和 inject 传递的数据不是响应式的,也就是说用 inject 接收来数据后,provide 里的数据改变了,后代组件中的数据不会改变,除非传入的就是一个可监听的对象
所以建议还是传递一些常量或者方法

// 父组件export default{    // 方法一 不能获取 methods 中的方法    provide:{        name:"沐华",        age: this.data中的属性    },    // 方法二 不能获取 data 中的属性    provide(){        return {            name:"沐华",            someMethod:this.someMethod // methods 中的方法        }    },    methods:{        someMethod(){            console.log("这是注入的方法")        }    }}// 后代组件export default{    inject:["name","someMethod"],    mounted(){        console.log(this.name)        this.someMethod()    }}

9. EventBus

EventBus 是中央事件总线,不管是父子组件,兄弟组件,跨层级组件等都可以使用它完成通信操作
定义方式有三种

/方法一:

// 抽离成一个单独的 js 文件 Bus.js ,然后在需要的地方引入// Bus.jsimport Vue from "vue"export default new Vue()

方法二 :直接挂载到全局

// main.jsimport Vue from "vue"Vue.prototype.$bus = new Vue()

方法三 :注入到 Vue 根对象上

// main.jsimport Vue from "vue"new Vue({    el:"#app",    data:{        Bus: new Vue()    }})

使用如下,以方法一按需引入为例

// 在需要向外部发送自定义事件的组件内import Bus from "./Bus.js"export default{    methods:{        handlerClick(){            // 自定义事件名 sendMsg            Bus.$emit("sendMsg", "这是要向外部发送的数据")        }    }}// 在需要接收外部事件的组件内import Bus from "./Bus.js"export default{    mounted(){        // 监听事件的触发        Bus.$on("sendMsg", data => {            console.log("这是接收到的数据:", data)        })    },    beforeDestroy(){        // 取消监听        Bus.$off("sendMsg")    }}

10. Vuex

Vuex 是状态管理器,集中式存储管理所有组件的状态。这一块内容过长,如果基础不熟的话可以看这个Vuex,然后大致用法如下

比如创建这样的文件结构

index.js 里内容如下:

import Vue from 'vue'import Vuex from 'vuex'import getters from './getters'import actions from './actions'import mutations from './mutations'import state from './state'import user from './modules/user'Vue.use(Vuex)const store = new Vuex.Store({  modules: {    user  },  getters,  actions,  mutations,  state})export default store

然后在 main.js 引入:

import Vue from "vue"import store from "./store"new Vue({    el:"#app",    store,    render: h => h(App)})

然后在需要的使用组件里:

import { mapGetters, mapMutations } from "vuex"export default{    computed:{        // 方式一 然后通过 this.属性名就可以用了        ...mapGetters(["引入getters.js里属性1","属性2"])        // 方式二        ...mapGetters("user", ["user模块里的属性1","属性2"])    },    methods:{        // 方式一 然后通过 this.属性名就可以用了        ...mapMutations(["引入mutations.js里的方法1","方法2"])        // 方式二        ...mapMutations("user",["引入user模块里的方法1","方法2"])    }}// 或者也可以这样获取this.$store.state.xxxthis.$store.state.user.xxx

11. $root

$root 可以拿到 App.vue 里的数据和方法

12. slot

就是把子组件的数据通过插槽的方式传给父组件使用,然后再插回来

// Child.vueexport default{    data(){        return {            user:{ name:"沐华" }        }    }}// Parent.vue

以上是"Vue2有哪些组件通讯"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

组件 数据 方法 属性 方式 事件 就是 这是 对象 内容 后代 监听 作用 写法 可以通过 篇文章 孙子 通讯 个子 元素 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 互联网新科技 深圳九邦互联网科技有限公司 华服互联网科技怎么样 互联网核心科技是什么 科技互联网技术 友谊互联网络科技 互联网科技视频素材 青岛中康互联网医疗科技有限公司 互联网科技创新服务 河南猎农互联网科技有限公司 青岛科技大学互联网大赛研究生 健康食品互联网创新科技园项目 国大互联网教育科技有限公司工作 广州新华互联网科技学校电竞方面 工业互联网山东科技大学 上海科技产业互联网平台 锡山区互联网智能科技产品供应 扫呗互联网科技有限公司 互联网的科技体现在哪里 花魁咖啡 互联网的科技创新 苏州大垚互联网科技 撒么互联网科技公司 科技伦理 互联网公司 阿里互联网科技公司 世界互联网科技公司市值排名 中国互联网有什么科技 互联网领先科技宣传片 知域互联网科技有限公司官网
0