vuejs组件通信的eventHub(巴士)

迈不过友情╰ 2022-05-13 08:34 381阅读 0赞

eventHub以我理解,他有点像vuex

eventHub是什么?

但是又是缩小版的,可以说是乞丐版,因为他所操作的东西并不多。

但是作为组件之间的通信已经足够了,因为你用vuex不得不引用vuex

而且你还需要做不少的配置,在大型或者中型项目处理起来十分方便。

但是一两个组件之间传递数据,或者组件比较少的情况下还要这样操作,需要一个备用方案。

eventHub如何使用?

1.如果你是外部js 引用的话,可以这样写

  1. // event-bus.js
  2. // 组件通过它来通信
  3. var eventHub = new Vue()
  4. export default eventHub
  5. // 主页面
  6. <template>
  7. <div>
  8. <button @click="find">发送</button>
  9. </div>
  10. </template>
  11. <script>
  12. import Subscriber from './components/Subscriber' //这里是假设的目录,需要自己定义
  13. import eventHub from './js/event-bus' //这里是假设的目录,需要自己定义
  14. export default {
  15. methods:{
  16. find(){
  17. eventHub.$emit('delete-todo', 'hello')
  18. // 第一个参数是信号的名称
  19. // 第二个参数是发送的参数
  20. }
  21. }
  22. }
  23. </script>
  24. // 组件1
  25. // components名称:Subscriber
  26. <template>
  27. </template>
  28. <script>
  29. export default {
  30. created(){
  31. eventHub.$on('delete-todo',backing )
  32. // 这里是接收信号
  33. // 第一个参数是信号名称
  34. // 第二个参数是回调的函数名称
  35. },
  36. methods:{
  37. backing(site){
  38. console.log(site)
  39. }
  40. }
  41. }
  42. </script>
  43. // 点击按钮「发送」 后
  44. // 打印: hello

这里是把他独立成一个js 引用,如果不想每次用的时候都在组件里面定义应该怎么做呢?

1.在入口文件里面引用

#

假设你用的是脚手架工具,引用文件名叫 main.js

  1. import Vue from 'vue'
  2. import App from './App'
  3. // 全局组件之间通信
  4. Vue.prototype.$eventHub= Vue.prototype.$eventHub || new Vue() // 巴士
  5. new Vue({
  6. el: '#app',
  7. template: '<App/>',
  8. components: {App},
  9. data: {
  10. eventHub: new Vue()
  11. }
  12. })

组件部分:

主页面: HelloWorld.vue

  1. <template>
  2. <div class="hello">
  3. <h1 @click="go">传递</h1>
  4. <back></back>
  5. </div>
  6. </template>
  7. <script>
  8. import back from "@/components/Background";
  9. export default {
  10. name: "HelloWorld",
  11. methods: {
  12. go() {
  13. this.$eventHub.$emit("add-todo", "哈哈");
  14. }
  15. },
  16. components: {
  17. back
  18. }
  19. };
  20. </script>

引用组件:

  1. <template>
  2. <div>
  3. <div>background</div>
  4. <div class="">
  5. <button @click="move">发送bb</button>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. bb: "我是订阅者"
  14. };
  15. },
  16. created() {
  17. this.$eventHub.$on("add-todo", this.move);
  18. // 绑定接收回调过来的事件处理
  19. },
  20. methods: {
  21. move(ab) {
  22. console.log("发送");
  23. console.log(ab);
  24. console.log("我获取到参数");
  25. }
  26. }
  27. };
  28. </script>
  29. <style>
  30. </style>

最终打印:

  1. 发送
  2. 哈哈
  3. 我获取的参数

发表评论

表情:
评论列表 (有 0 条评论,381人围观)

还没有评论,来说两句吧...

相关阅读

    相关 react通信

    一、状态机setState是一个异步操作 setState用来修改state中的初始状态,但是它异步操作,不能在setState之后马上获取到最新的数据。可以使用setS

    相关 vue通信

    对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的常用方式的总结。 props和$emit(常用) $attrs和$listeners