vue 组件传值踩坑日记 2

这里介绍一下适合兄弟组件和父子,祖孙组件之间的传值方式-事件总线,废话不多说,直接上代码

总结:说白了这东西就是一种发布订阅的模式,发数据的一方用$emit发,各个接听方用$on接受对应key的事件,on的时候,就选择在DOM挂在完毕以后进行监听,通过这样的事件去修改数据,完成传递工作,感兴趣的同学可以吧这个代码拿下去直接调试运行一下看看

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <com1></com1>
    </div>
    <template id="com1">
      <div>
        <h1>我是父组件</h1>
        <span>我接受孙组件的数据:{{msg}}</span>
        <input type="text" ref="txtMsg" v-model="msg" />
        <com2></com2>
        <com3></com3>
      </div>
    </template>
    <template id="com2">
      <div>
        <h3>我是兄弟组件2</h3>
        <button @click="SendMsg">
          发送到兄弟组件3
        </button>
        <span>
          我要接受兄弟组件com3的值:{{receiveTitle}},{{receiveMsg}}
        </span>
      </div>
    </template>
    <template id="com3">
      <div>
        <h3>我是兄弟组件3</h3>
        <button @click="sendMsg">
          发送到兄弟组件2
        </button>
        <span>
          我要接受兄弟组件com2的值:{{receiveTitle}},{{receiveMsg}}
        </span>
        <com4></com4>
      </div>
    </template>
    <template id="com4">
      <div>
        <h5>我是孙组件</h5>
        <span>
          我要接受来自祖组件com1的值:{{sunMsg}} 我要改变祖组件的值
          <input type="text" ref="txtMsg" v-model="sunMsg" />
        </span>
      </div>
    </template>
    <script src="/lib/vue/vue.js"></script>
    <script type="text/javascript">
      var eventBus = new Vue();
      var com4 = {
        name: "com4",
        template: "#com4",
        data() {
          return {
            sunMsg: ""
          };
        },
        watch: {
          sunMsg() {
            eventBus.$emit("SetGrandFatherMsg", this.sunMsg);
          }
        },
        mounted() {
          eventBus.$on("SetSunMsg", msg => {
            //console.log(msg);
            this.sunMsg = msg;
          });
        }
      };

      var com2 = {
        name: "com2",
        template: "#com2",
        data() {
          return {
            com2Title: "你好",
            com2Msg: "这是来自com2的消息",
            receiveTitle: "",
            receiveMsg: ""
          };
        },
        mounted() {
          eventBus.$on("SendCom2Msg", (title, msg) => {
            this.receiveMsg = msg;
            this.receiveTitle = title;
          });
        },
        methods: {
          SendMsg() {
            eventBus.$emit("SendCom3Msg", this.com2Title, this.com2Msg);
          }
        }
      };

      var com3 = {
        name: "com3",
        template: "#com3",
        data() {
          return {
            com3Title: "hello",
            com3Msg: "This is the message from to COM3",
            receiveTitle: "",
            receiveMsg: ""
          };
        },
        mounted() {
          eventBus.$on("SendCom3Msg", (title, msg) => {
            this.receiveMsg = msg;
            this.receiveTitle = title;
          });
        },
        components: {
          com4
        },
        methods: {
          sendMsg() {
            eventBus.$emit("SendCom2Msg", this.com3Title, this.com3Msg);
          }
        }
      };

      var com1 = {
        name: "com1",
        template: "#com1",
        data() {
          return {
            msg: ""
          };
        },
        mounted() {
          eventBus.$on("SetGrandFatherMsg", msg => {
            this.msg = msg;
          });
        },
        watch: {
          msg: {
            handler: function(newVal, oldVal) {
              console.log(this.msg);
              eventBus.$emit("SetSunMsg", this.msg);
            }
          }
        },
        components: {
          com2,
          com3
        }
      };

      new Vue({
        el: "#app",
        components: {
          com1
        }
      });
    </script>
  </body>
</html>

原文地址:https://www.cnblogs.com/llcdbk/p/12173530.html

时间: 2024-11-09 06:01:11

vue 组件传值踩坑日记 2的相关文章

vue 组件传值踩坑日记 1

今天在用平时很少用到的传值方式,是V2.4以后新加入属性$attrs $listener 以及inheritAttrs. 总结:这样形式的代码适合套娃模式的组件传递,却不适合兄弟组件的传值,那样的传值方式,需要创建一个事件总线,说白了就是新new一个空的vue,详见,我的第二篇日志<vue 组件传值踩坑日记 2> 废话不多说,直接上代码,大家可以边看注释边测试一下效果吧 <!DOCTYPE html> <html lang="en"> <hea

vue + element-ui 制作tab切换(切换vue组件,踩坑总结)

本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件. 1.vue如何使用element-ui 上一篇文章已经分享了如何在vue中使用element-ui创建tab组件切换内容(需要了解的朋友点击链接查看) 2.创建相应文件. a.创建父组件 src/components/tabZujian.vue b.创建自组件(被切换的组件)src/tabComponents 文件夹 + + tabComponents(目录) ---- tabZuji

SpringBoot踩坑日记-定时任务不定时了?

问题描述br/>springboot定时任务用起来大家应该都会用,加两注解,加点配置就可以运行.但是如果仅仅处在应用层面的话,有很多内在的问题开发中可能难以察觉.话不多说,我先用一种极度夸张的手法,描述一下遇到的一个问题.@Componentpublic class ScheduleTest {@Scheduled(initialDelay = 1000,fixedRate = 2*1000)public void test_a(){System.out.println("123"

vue 组件传值

vue 组件传值分为 父传子.子传父.非父子传值 父组件访问子组件的值 子组件中通过this.$emit('childName',childData) 父组件通过v-on监听一个事件  @childName = "childData"    methods:{ childData (data) { console.log(data) } } 父组件通过 ref 获取子组件的值 在子组件通过ref,在父组件中通过this.$refs.refsName访问子组件中的值 注意:当 ref 和

米忽悠踩坑日记-1

米忽悠踩坑日记-1            --知不足,而后进 进入米哈游差不多一个半月了,就以刚刚上线的某个任务作为节点写一篇踩坑日记吧. 1.安全意识,尽量考虑到玩家各种奇奇怪怪的操作以及有可能想刷道具的行为. 2.日志方面,记录玩家的每一步操作,成功或者失败,需要记录清楚,uid,region以及其他的信息,如奖励的ID,更新一次游戏玩家数据也记录 3.在写代码时候不要总想着先实现逻辑再来优化结构,因为一个小任务的代码量不一定少,而且任务排的很紧,如果不从一开始就保持良好的结构自己看起来简直

vue配置环境踩坑

Vue 环境配置踩坑 目录 Vue 环境配置踩坑 windows下cnpm -v :无法将"cnpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. windows下cnpm -v :无法将"cnpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. npm和cnpm都是在git的全局环境下下载的 且安装完cnpm,nodejs文件夹下就已经有了node_cache.node_global这两个文件夹: 而且在用户变量里path变量路径已经存在

vue+ vue-router + webpack 踩坑之旅

说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少不了res.render("xx",data)    这句话的意思就是去查找相应的模板文件然后在用数据去渲染在将渲染好的页面去返回给浏览器,给浏览器去解析,渲染模板其实就是做的替换字符串+拼接字符串的活  各种的模板引擎也有各个优化的点(比如可以将对应的模板编译的函数保存在内存中,然后在通

vue组件传值

如何实现父子组件之间的传值 1.父组件向子组件传值 1.在子组件中设置props:['commentId'] //子组件用来接收父组件传递过来值的属性名称 2.在父组件的自定义子组件标签中设置<subComponent :commentId="this.$route.params.photoId"></subComponent>//父组件传递值给子组件 2.子组件向父组件传值 1.在父组件的自定义标签中设置一个自定义函数<subComponent v-on

Vue组件传值、refs、插槽

一.组件传值 1.父组件向子组件传值 因为子组件本身不能拿到父组件的data数据来用,所以在子组件里用props接收,props是一个数组 父组件向子组件传值 <div id="app"> <com1 :parent="msg" :parentarr="arr"></com1> </div> <template id="com"> <div> {{pare