1.父传子,子传父
简单介绍组件通信
在现在的开发环境下,不管前后端开发都是组件化模块化,这是因为组件的优势无比的巨大,可以进行多次的复用增加开发效率,也可以分类鲜明,便于维护,而我今天所写的就是开发中分割成不同的组件互相传递数据和互动
我的工作中常用地组件通信大致分为三类: 父传子 , 子传父 , 跨组件传值
父子组件的确认方法:我将 B 组件import引入到 A 组件中,那么 B 就是 A 的子组件,A 就是 B 的父组件
1.父传子 props
<template> <div id="app"> <!-- 这里的text就是子组件props里定义的text,这两个名字得一致 并且传递的数据也要符合 type 规定的数据类型 text就是传递字符串,:text就是传递动态数据 --> <Son text="我是引入过来的子组件" /> <Son :text="Son" /> //Son子组件 </div> </template> <script> import Son from './components/son.vue'; export default { data () { return { Son: '我是引入过来的子组件' } }, components: { Son } }
2.子传父 $emit
<template> <div> <h2>son组件</h2> <p>props:{{ text }}</p> <button @click="changeTextFn">改变文字</button> </div> </template> <script> export default { // 在此处定义props props: { // props中定义 接收父组件数据的自定义属性,叫什么都可以,我随便起了个text text: { type: String, // type 是用来规定此属性接收到的数据的数据类型 default: "未传递时默认的文字" // 这个default是当这个 text 没有接收到传递的数据时的默认值 } }, methods: { // 按钮点击事件 changeTextFn () { // 发起自定义事件,名字叫什么都行,第一个参数是事件名,之后再跟着的都是传递的参数 this.$emit('changeFn', '传递的参数') } } } </script>
我先在原有的代码上添加了一个<button>按钮,在点击调用的函数中,通过 $emit 来发起事件并且可以传递参数
格式: this.$emit('changeFn', '我想变成三娃')
格式: this.$emit('自定义事件名', 传递的参数)
父组件: 行内监听子组件的 自定义事件名(函数上不用写参数,在 methods 中直接写形参就行)
<template> <div id="app"> <Son :text="Son" @changeFn="changeFn" /> </div> </template> <script> import Son from './components/son.vue'; export default { data () { return { Son: '我是引入过来的子组件' } }, components: { Son }, methods: { // 监听子组件自定义事件 changeFn (newText) { // 这里的形参接受到的就是子组件中 第二个参数传递的数值 this.Son= newText } } } </script>
3.跨组件通信 event-bus
如果两个组件的关系非常的复杂或者没有未产生直接联系,那么通过父子组件通讯是非常麻烦的。这时候可以使用通用的组件通讯方案:事件总线(event-bus)
按照我的习惯,我会将事件总线创建到 main.js 中,这个使用原理是将bus挂载到Vue原型上,这样就可以保证所有的组件都能通过 this.bus 访问到事件总线,从而通过同一个事件总线监听同一个事件,具体原理和父子传参差不多,都是 $emit 传递数据, 只不过接收变成了$on