Vue非父子组件传值(Bus/总线/发布订阅模式/观察者模式)

我们在之前已经知道了父子传值。父组件传递过来了的值,在子组件通过props接受,然后就可以使用了。

也学过了隔代传值,均是通过props逐层传递实现。那么,兄弟节点之间怎么传值呢?

通过bus实现方式如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
   <div id="app">
       <child content=‘Dell‘></child>
       <child content=‘Lee‘></child>

   </div>

<script src="js/vue.js"></script>
<script>
  //给每个Vue绑定一个bus属性,其实他是一个Vue实例
  Vue.prototype.bus = new Vue()

  Vue.component(‘child‘,{
    data:function() {
      return {
        //为了避免直接修改父组件传过来的值,把父组件的值来一份拷贝
        msg:this.content
      }
    },
    props:{
      content:String
    },
    template:‘<div @click="handleClick">{{msg}}</div>‘,
    methods:{
      handleClick:function(){
        //子组件会向父组件触发change事件,同时把msg传过去
          this.bus.$emit(‘change‘,this.msg)
      }
    },
    //这个组件挂载的时候,会执行的一个函数
    mounted:function(){
      //通过bus监听change事件,当change事件触发的时候,进行操作
      var this_ = this
      this.bus.$on(‘change‘,function(message) {
        console.log(message)
        this_.msg=message
      })
    }
  })

    // 1. 创建Vue的实例
    let vm = new Vue({
        el: ‘#app‘,

    });
</script>
</body>
</html>

  

原文地址:https://www.cnblogs.com/skyflask/p/10985963.html

时间: 2024-10-08 23:20:03

Vue非父子组件传值(Bus/总线/发布订阅模式/观察者模式)的相关文章

Vue中兄弟组件间传值-(Bus/总线/发布订阅模式/观察者)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="root"> <child content="Nay"></child> &

vue 非父子组件传值

1 <template> 2 <div id="news"> 3 4 我是新闻组件 5 <br> 6 7 <button @click="emitHome()">给Home组件广播数据</button> 8 9 <br> 10 </div> 11 12 </template> 13 14 15 <script> 16 //引入 vue实例 17 import

【vue】父组件主动调用子组件 /// 非父子组件传值

一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="header"></v-header> <hr> 首页组件 <button @click="getChildData()">获取子组件的数据和方法</button> </div> 父组件主动获取子组件的数据和方法: 1

Vue2.0的三种常用传值方式、父传子、子传父、非父子组件传值

Vue常用的三种传值方式有: 父传子 子传父 非父子传值 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递.父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息 1. 父组件向子组件进行传值 父组件: <template> <div> 父组件: <input type="text" v-model="name"> <!-- 引入子组件 --> <child :abc=

Vue中非父子组件传值的问题

非父子组件之间的通信,必须要有公共的实例(可以是空的),才能使用 $emit 获取 $on 的数据参数,实现组件通信 第一个组件的数据传递给第二个组件 公共实例文件bus.js,作为公共数控中央总线 import Vue from "vue"; export default new Vue(); 第一个组件 first.vue import Bus from '../bus.js'; export default { name: 'first', data () { return {

Vue组件通信之非父子组件传值

前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是我总结的父子传值相关的知识,可供参考: https://www.cnblogs.com/ViavaCos/p/11712131.html 然后大概回顾一下父子传值的过程: 根据上述信息可知,如果两个组件需要传递值那么需要这两个组件之间是父子关系才能传递数据. 那么如果有这样一个组件,既可以帮你传递数

Vue父子组件和非父子组件传值问题

父组件跟子组件之间的传值(具体参考lonzhubb商城) 1.父组件传值给子组件形式,ifshop是要传的对象,右边ifshop代表要传的这个对象的数据 <v-select  :ifshop="ifshop"  :clickType="clickType" @close="close" @addShop="sureAddShop"></v-select> 2.子组件接收父组件的数据用props prop

vue非父子组件间通信

有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bus = new Vue() // 触发组件 A 中的事件 bus.$emit('id-selected', 1) // 在组件 B 创建的钩子中监听事件 bus.$on('id-selected', function (id) { // ... }) 在更多复杂的情况下,你应该考虑使用专门的 状态管

vue非父子组件之间值传递

非父子之间通过一个空的vue实例作为事件总线,相当于一个中转站.这个中转站是所有组件都可以看到的,大家通过这个中转站接收和触发事件. import Vue from 'vue' import App from './App' import router from './router' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, data:{ eventHub: