zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Cypress系列(32)- url() 命令详解
    Cypress系列(31)- title() 命令详解
    Cypress系列(30)- 操作浏览器的命令
    Cypress系列(29)- 获取页面全局对象的命令
    Cypress系列(28)- scrollTo() 命令详解
    Cypress系列(27)- scrollIntoView() 命令详解
    Cypress系列(26)- 聚焦与失焦命令的详解
    Cypress系列(25)- submit() 命令详解
    Cypress系列(24)- 操作页面元素的命令
    urlencoded、json 格式详解
  • 原文地址:https://www.cnblogs.com/llcdbk/p/12173530.html
Copyright © 2011-2022 走看看