113.【Vue-细刷-04】(三)

简介: 113.【Vue-细刷-04】

(二十六)、全局事件总线 (兄弟组件)

1.全局事件分析

$ emit是触发、$ on是绑定。

兄弟组件可以借助全局事件总线进行数据联系

  1. 都能够被全部组件能看得到
  2. 支持被绑定事件

满足上面的条件只能是 vm。因为vm被vc继承,放在vm上就能够实现共享。且每一个组件的vc都是经过一次extend(),所以每一个vc都是不一样的。只能放在vm上了。

1. $on('绑定的事件名',触发谁) 绑定自定义事件
2. $emit('触发的事件名',参数) 自定义分发事件
3. $off('解绑的事件名') 解绑自定义监视监听
4. $once('绑定的事件名',触发谁) 绑定事件监听,但只能处理一次

2.全局事件 $bus

(1).Vue原型数据被所有人共享

提示:放在vue的原型上的数据谁都能看的到 Vue.prototype.x=vvv

我们希望越早放数据越好,所以我们想到main.js

import  Vue  from 'vue'  // 引入阉割版本的vue
import  App  from './App.vue' // 引入App.vue组件
Vue.config.productionTip = false;
Vue.prototype.p=200;  // eg: 原型上添加p值为200
new Vue({
    render:h=>h(App)
}).$mount('#app');

App.vue

<template>
  <div class="app">
    <h2>我是App组件</h2>
    <Demo1/>
    <Demo2/>
  </div>
</template>
<script>
import { watch } from 'vue'
// TODO: 引入组件
import Demo1 from './components/Demo1.vue'
import Demo2 from './components/Demo2.vue'
export default {
    name: "APP",
    // TODO: 注册组件
    components:{
      Demo1,
      Demo2,
    },
    data() {
      return {
        name:'jsxs'
      }
    },
    watch:{
      name:{
           immediate:true,
      handler(){
          console.log(this)
      }
      }
    }
}
</script>
<style>
    .app {
      background-color: brown;
      padding: 10px;
    }
</style>

(2).在Vue原型上存放Vue的实列

利用main.js的生命周期钩子函数帮我们存放Vue的实列

import  Vue  from 'vue'  // 引入阉割版本的vue
import  App  from './App.vue' // 引入App.vue组件
Vue.config.productionTip = false;
new Vue({
    beforeCreate(){
        Vue.prototype.p=this;
    },
    render:h=>h(App)
}).$mount('#app');

我们可以在所有的组件中获取到属性p 也就是对应的Vue实列

官方推荐我们使用 $bus去替换掉属性p也就是如下。

  • $ bus: 并不是Vue自带的,不像$emit等是Vue自带的
import  Vue  from 'vue'  // 引入阉割版本的vue
import  App  from './App.vue' // 引入App.vue组件
Vue.config.productionTip = false;
new Vue({
    beforeCreate(){
        Vue.prototype.$bus=this;  // 1.安装事件总线
    },
    render:h=>h(App)
}).$mount('#app');

3.全局事件总线 (Demo1接受Demo2的数据)

main.js

import  Vue  from 'vue'  // 引入阉割版本的vue
import  App  from './App.vue' // 引入App.vue组件
Vue.config.productionTip = false;
new Vue({
    beforeCreate(){
        Vue.prototype.$bus=this;
    },
    render:h=>h(App)
}).$mount('#app');

App.vue

<template>
  <div class="app">
    <h2>我是App组件</h2>
    <Demo1/>
    <Demo2/>
  </div>
</template>
<script>
import { watch } from 'vue'
// TODO: 引入组件
import Demo1 from './components/Demo1.vue'
import Demo2 from './components/Demo2.vue'
export default {
    name: "APP",
    // TODO: 注册组件
    components:{
      Demo1,
      Demo2,
    },
}
</script>
<style>
    .app {
      background-color: brown;
      padding: 10px;
    }
</style>

Demo1.vue: 接受数据

发送数据用$on进行绑定事件

mounted() {
      this.$bus.$on('A',this.demo1);  // 假如demo2被触发,我们就调用demo1
    },
<template>
  <div class="demo1">
    <h2>我是Demo1</h2>
    <h2>{{username1}}</h2>
  </div>
</template>
<script>
export default {
    name: "Demo1",
    data() {
      return {
        username1:'demo1',
      }
    },
    methods: {
      demo1(x){
        this.username1=x;
      }
    },
    mounted() {
      this.$bus.$on('A',this.demo1);  // 假如demo2被触发,我们就调用demo1
    },
}
</script>
<style>
    .demo1 {
        background-color: antiquewhite;
    }
</style>

Demo2.vue: 发送数据

接受消息用$emit

$emit 是触发 $on是绑定
 methods: {
      send_data(){
        this.$bus.$emit('A',this.username2);
      }
    },
<template>
  <div class="demo2">
    <h2>我是Demo2</h2>
    <button @click="send_data">点我切换数据</button>
  </div>
</template>
<script>
export default {
    name: "Demo2",
    data() {
      return {
        username2:'demo2',
      }
    },
    methods: {
      send_data(){
        this.$bus.$emit('A',this.username2);
      }
    },
}
</script>
<style>
    .demo2 {
        background-color:  rgb(12, 196, 116);
    }
</style>

未点击按钮

点击按钮之后

4.全局事件总线(双向发送数据)

main.js

import  Vue  from 'vue'  // 引入阉割版本的vue
import  App  from './App.vue' // 引入App.vue组件
Vue.config.productionTip = false;
new Vue({
    beforeCreate(){
        Vue.prototype.$bus=this;
    },
    render:h=>h(App)
}).$mount('#app');

App.vue

<template>
  <div class="app">
    <h2>我是App组件</h2>
    <Demo1/>
    <Demo2/>
  </div>
</template>
<script>
import { watch } from 'vue'
// TODO: 引入组件
import Demo1 from './components/Demo1.vue'
import Demo2 from './components/Demo2.vue'
export default {
    name: "APP",
    // TODO: 注册组件
    components:{
      Demo1,
      Demo2,
    },
    data() {
      return {
        name:'jsxs'
      }
    },
    watch:{
      name:{
           immediate:true,
      handler(){
          console.log(this)
      }
      }
    }
}
</script>
<style>
    .app {
      background-color: brown;
      padding: 10px;
    }
</style>

Demo1.vue

<template>
  <div class="demo1">
    <h2>我是Demo1</h2>
    <h2>{{username1}}</h2>
    <button @click="send_data2">点击我发送数据到Demo2</button>
  </div>
</template>
<script>
export default {
    name: "Demo1",
    data() {
      return {
        username1:'demo1',
      }
    },
    methods: {
      demo1(x){
        this.username1=x;
      },
      // 发送消息到demo1
      send_data2(){
        console.log('xxxxxxxxx')
        this.$bus.$emit('B',this.username1);
      }
    },
    // 接受demo2传递过来的日记
    mounted() {
      this.$bus.$on('A',this.demo1);  // 绑定A事件,假如A被触发。就调用demo1这个方法
    },
}
</script>
<style>
    .demo1 {
        background-color: antiquewhite;
    }
</style>

Demo2.vue

<template>
  <div class="demo2">
    <h2>我是Demo2</h2>
    <button @click="send_data">点我切换数据</button>
    <h2>{{username2}}</h2>
  </div>
</template>
<script>
export default {
    name: "Demo2",
    data() {
      return {
        username2:'demo2',
      }
    },
    // 发送数据到demo1
    methods: {
      demo2(x){
        this.username2=x;
      },
      // 发送数据
      send_data(){
        this.$bus.$emit('A',this.username2);// 触发A事件 并传递参数
      }
    },
    // 接受数据
    mounted() {
      this.$bus.$on('B',this.demo2)  //绑定b事件,假如b事件被触发就调用demo2这个方法
    },
}
</script>
<style>
    .demo2 {
        background-color:  rgb(12, 196, 116);
    }
</style>

相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
228 2
|
11天前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
221 137
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
660 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
902 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
662 77
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
165 0
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
323 1
|
7月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
5月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
417 17
下一篇
开通oss服务