VUE中组件常用的通信方式有哪些?

常见的通信方式都有哪些?

1. props $emit

子组件中通过props 接受父组件传递的参数,同时通过事件触发emit, 发送数据给父组件。父组件中通过事件绑定获取子组件传递的参数。
优先推荐这个种方法。原因有这些:1. 子组件中可以规范接受的参数,它是什么数据类型,以及默认值。2. 在通过emit传递给父级数据,保证数据的实时性。
基本代码展示:

// child
//子组件
<template>
  <div>
    <div  @click="sendMsg('i am your child')">父组件传递过来的:{{getdatafromfather}}</div>
  </div>
</template>

<script>
export default {
  props: ['getdatafromfather'],
  methods: {
    sendMsg(data) {
      this.$emit('getdatafromchild', data) // 触发父组件的方法,并传递参数data
    }
  }
}
</script>
// 父组件
<template>
  <div class="section">
    <child :getdatafromfather="fatherMsg" @getdatafromchild="getData"></child>
    <p>我自己的:{{fatherMsg}}</p>
    <p>子组件给我的:{{getMsg}}</p>
  </div>
</template>

<script>
import child from './child.vue'
export default {
  name: 'father',
  components: { child },
  data() {
    return {
      fatherMsg: 'vue man', // 父级本地的数据
      getMsg: '' // 由于子组件传递的数据
    }
  },
  methods: {
  // 事件绑定,由子组件触发
    getData(id) {
      this.getMsg = idx
    }
  }
}
</script>

2. $refs

ref 关键字 类似一个dom的id, 你可以通过给一个组件设置ref=“idRef”,并且通过$refs.idRef获取到这个组件的数据和方法且获取的数据不是响应式。特点是子组件中不需要做任何信息的配置。

// father
<template>
  <child ref="child"></component-a>
</template>
<script>
  import child from './child.vue'
  export default {
    components: { child },
    data() {
  		return {
  			fatherData: 'father'
		}
  	}
    mounted () {
      console.log(this.$refs.child.name);  // child
      this.$refs.child.sayHello();  // hello
    }
  }
</script>
// child
<template>
  <div></div>
</template>
<script>
  import child from './child.vue'
  export default {
  	data() {
  		return {
  			name: 'child'
		}
  	}
    components: { child },
    methods: {
		sayHello() {
			console.log('hello');
		}
    }
  }
</script>

3. children parent

1.使用$ parent 可以让组件访问父组件的实例(访问的是上一级父组件的属性和方法)
2.使用$ children 可以让组件访问子组件的实例,但是,$children并不能保证顺序,并且访问的数据也不是响应式的。
特点是:父子组件中代码,都不需要有改动, 方便直接访问。

// 使用 2 中的代码例子
// child.vue
mounted: {
	console.log($parent.fatherData);  // father
}
// 使用 2 中的代码例子
// father.vue
mounted: {
	console.log($children[0].name);  // child
}

4. eventbus 事件总线

eventBus事件总线适用于父子组件、非父子组件等之间的通信。特点是要在全局注册总线,适用于兄弟组件 和 父子组件通信。优先推荐兄弟组件的通信。因为项目大的时候,维护起来麻烦。下面是关键代码样例:

// event-bus.js

import Vue from 'vue'
export const EventBus = new Vue()
<template>
  <div>
    <a-dom></a-dom>
    <b-dom></b-dom>
  </div>
</template>

<script>
	import aDom from './aDom.vue'
	import bDom from './bDom.vue'
	export default {
  	components: { aDom, bDom }
	}
</script>
// a-dom.vue
<template>
  <div>
    <button @click="add">加法</button>    
  </div>
</template>

<script>
import {EventBus} from './event-bus.js' // 引入事件中心

export default {
  data(){
    return{
      num:0
    }
  },
  methods:{
    add(){
    // 事件分发
      EventBus.$emit('addition', {
        num:this.num++
      })
    }
  }
}
</script>
// b-dom.vue
<template>
  <div>求和: {{count}}</div>
</template>

<script>
import { EventBus } from './event-bus.js'
export default {
  data() {
    return {
      count: 0
    }
  },
  mounted() {
    EventBus.$on('addition', param => {
      this.count = this.count + param.num;
    })
  }
}
</script>

5. 依赖注入(provide/ inject)

该方式适合直系亲属通信。类似父与子,父与孙子等。推荐是在组件嵌套层级很深的情况,并且信息传递方向只能是高层级传递给低层级。注意: 依赖注入所提供的属性是非响应式的。
provide / inject是Vue提供的两个钩子,和data、methods是同级的。并且provide的书写形式和data一样。
provide 发送数据或方法
inject 接收数据或方法
下面是关键代码样例:

// father.vue
<template>
  <div>
    <ChildComponent />
  </div>
</template>
 
<script>
import Vue from 'vue'
import ChildComponent from './ChildComponent'
 
export default {
  components: {
    ChildComponent
  },
  provide() {
    return {
      foo: 'bar'
    }
  }
}
</script>
// child.vue/childschild.vue
<template>
  <div>
    {{ foo }}
  </div>
</template>
 
<script>
export default {
  inject: ['foo'],
  mounted() {
    console.log(this.foo) // 'bar'
  }
}
</script>

相关推荐

  1. VUE组件常用通信方式哪些

    2024-04-05 20:24:04       45 阅读
  2. Vue2常用组件通信方式几种

    2024-04-05 20:24:04       43 阅读
  3. Vue和React常用组件通信方式

    2024-04-05 20:24:04       20 阅读
  4. vue组件之间通信方式多少种

    2024-04-05 20:24:04       52 阅读
  5. vue组件之间通信方式哪些

    2024-04-05 20:24:04       26 阅读
  6. 【技术】Vue3 组件通讯方法哪些

    2024-04-05 20:24:04       33 阅读
  7. Vue2面试题:说一下组件通信哪些方式

    2024-04-05 20:24:04       56 阅读
  8. 在 Swift , enumerated() 哪些常用使用方式 ?

    2024-04-05 20:24:04       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 20:24:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 20:24:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 20:24:04       82 阅读
  4. Python语言-面向对象

    2024-04-05 20:24:04       91 阅读

热门阅读

  1. Linux内存管理 —— 通过实验学习和理解CoW(1)

    2024-04-05 20:24:04       37 阅读
  2. 2023年第15届12月STEMA

    2024-04-05 20:24:04       38 阅读
  3. 趋势跟踪-笔记

    2024-04-05 20:24:04       38 阅读
  4. 三、c++代码中的安全风险-open

    2024-04-05 20:24:04       36 阅读
  5. Linux空洞文件

    2024-04-05 20:24:04       39 阅读
  6. Docker

    Docker

    2024-04-05 20:24:04      29 阅读
  7. 方差分析注意事项

    2024-04-05 20:24:04       38 阅读
  8. Docker-部署、镜像容器管理、commit

    2024-04-05 20:24:04       45 阅读
  9. 设计模式——适配器模式06

    2024-04-05 20:24:04       41 阅读
  10. 设计模式|命令模式(Command Pattern)

    2024-04-05 20:24:04       31 阅读
  11. 每天学习python30分钟(第三天)

    2024-04-05 20:24:04       38 阅读
  12. 设计模式——单例模式04

    2024-04-05 20:24:04       41 阅读
  13. c#版基于Yolov8模型实现的实时视频检测

    2024-04-05 20:24:04       42 阅读
  14. 介绍 TensorFlow 的基本概念和使用场景

    2024-04-05 20:24:04       34 阅读
  15. c++day4

    2024-04-05 20:24:04       33 阅读