Vue组件通信的五种方法
前言
我们通常会把整个页面被分成小组件,这些组件有自己的功能和 UI。 有时,我们需要一种方法来在这些组件之间进行通信。
我们可以使用 Vuex(状态管理工具)来存储数据并跨组件使用。 但有时,我们需要一种方法将数据从一个组件发送到另一个组件,而无需使用 Vuex 存储。
请看下面
共有五种方法可以进行通信
1、使用Props (父组件通信子组件)
2、使用Events 事件(子组件通信父组件)
3、使用Event Bus 事件总线(父通信子,子通信父)
4、使用provide/inject 提供和注入对(父组件通信子组件)
5、使用this.$refs (子组件通信父组件)
第一种:Props
[父到子]使用Props可以将我们需要传输的数据从父组件传递到子组件。下面我们将使用props从parent.vue发送数据到child.vue
<!-- child.vue 代码 -->
<template><div>{{message}}</div>
</template><script>
export default {name: "child",props: ['message'] // 定义一个名为message的变量,在页面进行渲染
}
</script>
<!-- parent 组件 代码 -->
<template><div><!-- 使用子组件 child,绑定一个参数,参数名为message,值为当前组件变量名为message的值--><child :message="message"/> </div>
</template><script>
import Child from "./child"; <!-- 使用子组件 -->export default {name: "parent",components: {Child},data() {return {message: '我是父类的数据'}}
}
</script>
第二种:Events
[子到父]通过子组件触发事件将数据发送到父组件,父组件使用v-on进行捕获,捕获时需要和发送事件同名,还可以检索参数
this.$emit(‘事件名’, args1, args2, args3,…) 就是一种触发事件的方法
<!-- child 子组件 代码 -->
<template><div><div @click="sendMessageToParent"></div></div>
</template><script>
export default {name: "child",message: "数据",methods: {sendMessageToParent() {// 点击后触发一个事件 事件名为childSuccess,参数为messagethis.$emit("childSuccess", this.message);}}
}
</script>
<!-- parent 父组件 代码 -->
<template><div><!-- 使用子组件 监听事件名为childSuccess的事件,一旦监听到后触发getData方法--><child @childSuccess="getData"/></div>
</template><script>
import Child from "./child";
export default {name: "parent",components: {Child},methods: {getData(_val) {// _val 就是子组件的事件携带的参数console.log(_val)}}
}
</script>
第三种:Event Bus
[父到子,子到父]当两个需要互相通信的组件不存在父子关系的时候,需要手动去监听组件上的事件的时候,就可以使用此方法(事件总线)。所以事件总线用于在任何两个组件之间进行通信(组件不需要具有父子关系)。
操作方法: 在一个组件使用this. r o o t . root. root.emit(‘事件名’,args1,args2,args3,…); 在另一个组件中使用this. r o o t . root. root.on(‘相同的事件名’,args1,args2,args3,…)
<!--component_one 组件 监听事件-->
<template>
</template><script>
export default {name: "component_one",mounted() {this.$root.$on("success", (msg) => {console.log(msg)})}
}
</script>
<!--component_two组件 发布事件-->
<template><div @click="sendMessageToComponentOne"><router-link to="/component_one">点我!</router-link></div>
</template><script>
export default {name: "component_two",methods: {sendMessageToComponentOne() {let msg = '你好呀!';this.$root.$emit("success",msg)}}
}
</script>
第四种:provide/inject
[父到子]此类主要是用于更深层嵌套组件的结构,使用这种方式可以更快捷更方便,且子孙后代后可以使用inject
<!-- parent 父组件 -->
<template><child />
</template><script>
import Child from "./child";
export default {name: "parent",components: {Child},provide() {return {"eventName": "参数"}}
}
</script>
<!-- child 子组件 -->
<template><div>{{eventName}}</div>
</template><script>
export default {name: "child",inject: ['eventName'],}
</script>
第五种:this.$refs
[子到父]一般都不推荐使用此种方法进行数据通信。 使用这种方式的时候,我们需要为子组件一个引用id
<!-- child 子组件 -->
<template>
</template><script>
export default {name: "child",data() {return {value: '你好呀!'}}
}
</script>
<!-- parent 父组件 -->
<template><child ref="child"/>
</template><script>
import Child from "./child";
export default {name: "parent",components: {Child},data() {return {message: null}},mounted() {// 获取子组件上的value值this.message = this.$refs.child.value;}
}
</script>
Vue组件通信的五种方法相关推荐
- Vue组件通信的五种方式
Vue组件通信的五种方式 文章目录 Vue组件通信的五种方式 一. props/$emit(父子通信) 二. vuex(组件之间通信) 三. 事件总线EventBus(组件之间通信) 四. provi ...
- vue组件通信的几种方法
vue中我们最常使用的就是父子之间的通信还有全局数据管理vuex了,下面粗略说一下vue组件通信的几种方法 组件通信的几种方式 1.父子组件通信 2.兄弟组件通信 3.跨多层级组件通信 4.任意组件( ...
- vue 组件通信的几种方式
前言 在vue中, 组件的关系不外乎以下三种: 组件是需要通信的,在开发中,常用到的通信方式有:vuex.eventBus.以及props与emit.$parent与$children,除此之外,还 ...
- vue组件通信的几种方式
vue组件通信的几种方式 最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Chil ...
- Vue组件传值的三种方法
Vue组件传值的三种方式 1.父传子 父传子使用props: 1.父组件:即在使用的子组件标签上,自定义一个绑定数据,这里我使用的是"mymsg",将父组件的msg绑定在其上. 2 ...
- vue组件通信的八种方式
一.props / $emit 父组件通过props的方式向子组件传递数据,而通过$emit 子组件可以向父组件通信. 1. 父组件向子组件传值 下面通过一个例子说明父组件如何向子组件传递数据:在子组 ...
- vue组件之间传值几种方法
方法一.父子组件传值 通过props向下传递 父组件 <div class="menu_header"><Menu :msgChild="msg1&qu ...
- Vue组件通信的7个方法
1.props和$emit 父组件向子组件传递数据是通过prop传递的,子组件传递数据给父组件是通过$emit触发事件来做到的 Vue.component("child",{ da ...
- Vue组件通信——父子组件通信的四种方法
引入组件 全局引入 在main.js文件中引入并注册 import ChildrenDemo from '@/views/components/ChildrenDemo' Vue.component( ...
- vue组件通信(传值)
vue组件通信有以下几种方式可以实现(个人总结) 一.父组件到子组件传值方式: 一般通过在父组件中给子组件绑定属性的方式进行传值,子组件通过props来接收. 实例: //父组件 <templa ...
最新文章
- Django源码分析4:staticfiles静态文件处理中间件分析
- Codeforces 1016F	Road Projects
- 网络知识科普 | 你未必了解的DNS
- Java定时任务以及ScheduledThreadPoolExecutor需要注意的问题
- spirng底层实现原理
- B00004 atoi函数
- [.Net] 一句话Linq(递归查询)
- Atitit 代码的导航 1.1.代码的层次导航 语句 函数方法 类 包 1.2.4.4. 代码可视化 流程图 一个方法内,多个代码行的关系图 语句to方法	2 1.3.4.5. 类图 类结构
- 关于在networkx中使用louvain算法报错的问题
- 自制EDL工程线进坚果R1手机9008端口刷机记录
- MapGIS出现“存储服务错误,可能未启动”问题解决方案
- 交换机设备登录账号权限1_h3c交换机设置用户权限
- 金属塑性成形计算机模拟仿真,金属塑性成形计算机模拟的若干进展
- 语音合成 GAN Vocoders 总览
- 小程序里长按微信公众号二维码跳转到公众号关注页
- swift和swiftui_SwiftUI和UIStackflow问题
- html 设置响应X-frame,X-Frame-Options(点击劫持)漏洞分析及web配置修复
- 微信小程序——消息推送配置
- 归一化处理matlab,MATLAB 中数据归一化处理
- Home Assistant入门1-1:在树莓派上安装官方系统