Vue2组件通信方式包括如下几种方式

  • props、$emit(父传子props,子传父$emit)
  • $emit、$on(即EventBus传值,依赖全局Vue干线)
  • provide、inject(父组件通过provide提供参数,子孙组件通过inject注入参数)
  • $attrs、$listeners(创建高层次组件时使用,attrs包含了父组件中没有被props声明的参数,listeners包含了父组件中不含.native修饰器的事件监听器)
  • Vuex通信

1、父子传参(props和$emit)

父组件

//父组件
<template><div class="main-panel">//子组件<banner-module :lang="test" @textFun="textFun" /><ensure-module :lang="test" /></div>
</template><script>
//引入子组件
import bannerModule  from './tabs/banner/index.vue'
import ensureModule from './tabs/ensure/index.vue'
export default {data () {return {test: 1    }},//声明子组件components :{bannerModule,ensureModule},methods:{textFun(val){console.log(val)}}
}
</script><style></style>

子组件不可直接改变父组件的值,需要定义新的变量接受父组件的传递值,将新值使用$emit返回给父组件

<template><div class="product-banner"><div class="product-notice"><p>{{num}}</p></div><van-button @click="addtest">新增</van-button></div>
</template><script>
export default {//props接受props :{lang : {type : Number,default : 1}},data(){return{num: this.lang}},methods: {addtest(){//不可以直接改变父组件的值,需要定义新的变量this.num ++//通知父组件接受新值this.$emit("textFun", this.num)}}
}
</script>
<style scoped>
</style>

2、$emit和$on(全局组件通信)

利用Vue实例作为中央事件总线,来触发和监听事件。实现父子、兄弟、跨级之间的通信

//A组件
<template><div class="main-panel">{{test}}<div @click="sendBData">发送</div></div>
</template><script>
import eventBus from './utils/bus.js'
export default {data () {return {test: 1    }},methods:{sendBData(){this.test ++ //发送receiptData方法到全局VueeventBus.$emit("receiptData", this.test)}}
}
</script>
//B组件
<template><div class="main-panel">{{number}}</div>
</template><script>
import eventBus from './utils/bus.js'
export default {data () {return {number: 0  }},created(){//监听receiptData方法eventBus.$on("receiptData", (val)=>{this.number = val})},methods:{}
}
</script>

bus.js

import Vue from "vue"
var eventBus  =  new Vue()
export default eventBus

3、provide、inject

provide是一个对象,或者是一个返回对象的函数;inject 是一个字符串数组,或者是一个对象

provideinject绑定不是响应的,所以A组件中值改变,B组件中是不会改变的。

//A组件
<template><div class="main-panel">{{text}}<p @click="changeText">修改</p></div>
</template><script>
export default {provide() {return: {name: "A组件", //无法修改app: this,test: this.text}     },data () {return {text: 1,name: 'A',    }},methods: {changeText(){this.text++  //修改后B组件视图不更新this.name = 'C' //修改后B组件视图会更新}}
}
</script>
//B组件
<template><div class="main-panel"><p>组件A的名称:{{app.name}}</p><p>组件A的text:{{text}},组件B的text:{{num}}</p></div>
</template><script>
import eventBus from './utils/bus.js'
export default {inject: ['name', 'app', 'text'],data () {return {num: 1    }}
}
</script>

4、$attrs、$listeners

A组件向B(子组件)使用props传递了message参数,C组件是B组件的子组件,这时候如果A向C传递参数的话就用到$attrs 监听C返回的变化就用到了listeners

//A组件
<template><div class="main-panel"><B :message="message" @getCData="getCData" @getBData="getBData"></B></div>
</template><script>
import B from '...B.vue'
export default {data () {return {message:'hello',messageC:'hello C',}},components: {B},methods:{getCData(val){console.log("这是C的参数",val)},getBData(val){console.log("这是B的参数",val)}}
}
</script>

C组件可以直接触发getCData在于B在调用C的时候使用v-on绑定了$listeners属性
通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的

上面这句话的意思是:如果我们在给B传递数据时,多传递一个名字叫做messageB的参数,但是在B组件中没有去接受messageB参数,那么在C组件中也可以访问到messageB,而message是访问不到的

//B组件
<template><div class="main-panel"><p>A组件传给B组件的参数: {{message}}</p><button @click="sendBData">和A交互</button><C v-bind="$attrs" v-on="$listeners"></C></div>
</template><script>
import C from '...C.vue'
export default {props: {messsage: {type: String,default: ''} },data () {return {b: 1}},components: {C},methods:{sendBData(){this.$emit("getBData", this.b++)}}
}
</script>
//C组件
<template><div class="main-panel"><p>A组件传给C组件的参数: {{$attrs.messageC}}</p><button @click="sendCData">和A交互</button></div>
</template><script>
export default {data () {return {c: '我是C组件'}},components: {C},methods:{sendCData(){this.$emit("getCData", this.c)}}
}
</script>

5、Vuex

Vuex是专为 Vue.js 应用程序开发的状态管理模式,收集管理应用的所有组件状态。解决了多个视图依赖同一状态和来自不同视图的行为更改同一个状态的问题

Vuex包含5大模块(state,getters,mutations,actions,modules),后边会有介绍Vuex的文章。

Vuex通信类似于EventBus

创建store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({state: {  //声明state状态树message: {title: '',content: '',},messageB: ''},mutations: {    //mutation中提交需要改变的方法sendMessage(state, obj) {state.message = {title: obj.title,content: obj.content,}},sendBMessage(state, val){state.messageB = val.BMsg}}
})

在组件A中获取Vuex的数据,同理可在B组件中获取。如果通过A要改变B的数据可通过单独提供给B的方法修改

//A组件
<template><div class="main-panel"><p>获取到的title:{{title}},获取到的content:{{content}}<div @click="sendB">点击发送</div><B /></div>
</template><script>
import B from '...B.vue'
export default {data () {return {bMessage: '我是B组件'}},components: {B},computed:{title(){return this.$store.state.message.title},content(){return this.$store.state.message.content}},methods: {sendB(){// 触发sendBMessage,将B组件的数据存放到store里去this.$store.commit('sendBMessage', {BMsg: this.bMessage})}}
}
</script>

Vue2组件通信方式相关推荐

  1. 【Vue.js】vue2组件间通信方式总结

    目录 一.props传参 1.父组件 ==> 子组件 2.子组件 ==> 父组件 二.组件的自定义事件 三.全局事件总线 四.消息订阅和发布 五.vuex 六.插槽 1.默认插槽 2.具名 ...

  2. c++中获取蓝图组件_Vue组件通信方式居然有这么多?你了解几种

    作者:梨香 链接:https://juejin.im/post/6887709516616433677 vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知 ...

  3. Vue 组件通信方式居然有这么多?你了解几种

    ↓推荐关注↓ 前端技术编程 专注于分享前端技术:JS,HTML5,CSS3,Vue.js,React,Angular 等前端框架和前端开源项目推荐! 0篇原创内容 公众号 vue组件通信的方式,这是在 ...

  4. vue的组件通信方式

    组件通信方式 一.props / $emit 1. 父组件向子组件传值 2. 子组件向父组件传值 二. $children / $parent 三.provide/ inject 四.ref / re ...

  5. 超实用的 Vue 组件通信方式大汇总(8种)

    文章目录 前言 一.Vue组件关系 二.Vue组件通信方式 1. props / $emit 1.1 props 父传子 1.2 $emit 子传父 1.3 父子组件双向绑定 1.3.1 v-mode ...

  6. vue3组件通信方式

    vue3七种组件通信方式 面试题经常会问到vue3组件间的通信方式,下文列举了七种常见的通信方式. props emit v-model refs provide/inject eventBus Vu ...

  7. reactjs组件通信方式总结

    组件通信方式总结 组件间的关系: 父子组件 兄弟组件(非嵌套组件) 祖孙组件(跨级组件) 几种通信方式: 1.props:(1).children props(2).render props2.消息订 ...

  8. vue 修改div宽度_Vue 组件通信方式及其应用场景总结(1.5W字)

    前言 相信实际项目中用过vue的同学,一定对vue中父子组件之间的通信并不陌生,vue中采用良好的数据通讯方式,避免组件通信带来的困扰.今天笔者和大家一起分享vue父子组件之间的通信方式,优缺点,及其 ...

  9. Vue2组件间通信——父传子值props

    Vue2组件间通信--父传子值props Vue2中组件间通信系列,本篇是关于父组件向子组件传值的介绍,这里我会用通俗的语言帮助大家理解props配置项 功能: 子组件可以接收到父组件传递的数据信息, ...

  10. Vue2组件封装 Vue组件封装

    写在前面 虽然是Vue2组件封装,主要的内容是记录一下我对封装组件的一些要点和我的看法 --原学习视频来源于b站黑马从0到1封装组件库 什么是组件 都说Vue是组件化开发,确实有道理,别说按钮输入框这 ...

最新文章

  1. Linux学习(一)--目录结构
  2. 基于LSTM的股票价格预测(完整金融类代码)
  3. nginx 高并发配置参数(转载)
  4. P3320:寻宝游戏(生成树)
  5. mysql数据库的设计
  6. 前端基础3-1——JavaScript
  7. 没有bug队——加贝——Python 练习实例 13,14
  8. .net Thrift 之旅 (二) TServer
  9. Python调用API接口的几种方式
  10. Excel中 对「对话气泡(吹き出し)」中的文字添加删除线 等操作
  11. Windows端口扫描关闭工具
  12. Python分词、情感分析工具SnowNLP使用方法
  13. 计算机丢失dll文件怎么弄,电脑开机提示dll文件丢失怎么办?
  14. python学习笔记(八)传递任意数量的实参
  15. 2238. Number of Times a Driver Was a Passenger
  16. 12.14黄金白银欧美盘走势分析及期货原油操作建议
  17. Q1月活大涨70%,后浪会成B站的流量萌新吗?
  18. 【超全面】机器学习中的超参优化方法总结
  19. Centos7安装freeswitch-1.10.8(2023)
  20. web前端开发基础教程一

热门文章

  1. [微信小程序开发者工具] × #initialize
  2. A goal-driven tree-structured neural model for math word problems论文阅读
  3. 公司邮箱地址格式是什么?邮箱地址怎么写?邮箱地址大全
  4. rpm -ivh *rpm 是什么意思
  5. 液晶电视的驱动板与逻辑板维修
  6. 飞鱼星路由器如何限制外网访问服务器网站,飞鱼星路由器指定ip/mac禁止上网设置教程...
  7. web前端网页设计期末课程大作业:中华传统文化题材网页源码——基于HTML实现中国水墨风书画艺术网站(12个页面)
  8. 东京通勤概况及奥运会交通措施
  9. 最大网络流的多种解法(洛谷P3376 网络最大流 为例)
  10. 软件测试kpi绩效考核表,测试工程师绩效考核表.xls