zoukankan      html  css  js  c++  java
  • vue组件之间的通信

    父组件 ---> 子组件
    属性props
    在子组件调用时给子组件写入属性,在子组件内部用props注册后,会添加到子组件的实例上
    在子组件中不能直接修改props的传入值
    只能时父组件传给子组件,不能‘隔代‘
    父组件:HelloWord
    <template>
      <div class="hello">
        <!-- 使用自组件 -->
        <child :message="msg"> </child>
      </div>
    </template>
    
    <script>
    import child from './Children1.vue'
    
    /* eslint-disable */
    export default {
      name: "HelloWorld",
      components: {child},
      data() {
        return {
          msg: "这是一个父组件的信息",
        }
      },
    };
    </script>
    
    
    子组件:child
    <template>
      <div id="child">
        <a href="www.baidu.com/">{{message}}</a>
      </div>
    </template>
    
    <script type="text/javascript">
    /* eslint-disable */
    export default {
      // name: "child",
      props: ['message'],
    };
    </script>
    
    效果:
    
    特性$attrs
    解决了props ‘隔代‘ 传值时反复注册props的弊端
    组件是在调用时写入属性
    // 子组件:child
    <template>
      <div id="child">
        <p>{{$attrs.message}}</p>
      </div>
    </template>
    
    <script type="text/javascript">
    /* eslint-disable */
    export default {}
    </script>
    
    效果:
    
    $refs
    通过调用子组件函数,然后进行处理
    // 父组件: HelloWorld
    <template>
      <div class="hello">
        <!-- 使用自组件 -->
        <!-- <child1 :message="msg"></child1>
        <child2></child2> -->
        <child3 ref="child3"></child3>
      </div>
    </template>
    
    <script>
    import child1 from './Child1.vue'
    import child2 from './Child2.vue'
    import child3 from './Child3.vue'
    
    /* eslint-disable */
    export default {
      name: "HelloWorld",
      components: {child1, child2, child3},
      data() {
        return {
          msg: "这是一个父组件的信息, 但是我要显示在子组件上",
        }
      },
      mounted() {
        this.$refs['child3'].fun(this.msg);
        console.log(this.$refs.child3);
        console.log(this.$refs.child3.msg);
      }
    };
    </script>
    
    
    
    // 子组件:Child
    <template>
      <div>{{childMsg}}</div>
    </template>
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: '我是子组件的msg',
          childMsg: '',
        }
      },
      methods: {
        fun(str) {
          console.log(str);
          this.childMsg = str;
        }
      },
    }
    </script>
    
    效果:
    
    $children
    通过调用子组件函数,然后进行处理
    // 父组件: HelloWorld
    <template>
      <div class="hello">
        <!-- 使用自组件 -->
        <!-- <child1 :message="msg"></child1>
        <child2></child2> -->
        <child3 ref="child3"></child3>
      </div>
    </template>
    
    <script>
    import child1 from './Child1.vue'
    import child2 from './Child2.vue'
    import child3 from './Child3.vue'
    
    /* eslint-disable */
    export default {
      name: "HelloWorld",
      components: {child1, child2, child3},
      data() {
        return {
          msg: "这是一个父组件的信息, 但是我要显示在子组件上",
        }
      },
      mounted() {
        this.$children[0].fun(this.msg);
        console.log(this.$children[0]);
        // console.log(this.$refs.child3);
        // console.log(this.$refs.child3.msg);
      }
    };
    </script>
    
    
    
    // 子组件:Child
    <template>
      <div>{{childMsg}}</div>
    </template>
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: '我是子组件的msg',
          childMsg: '',
        }
      },
      methods: {
        fun(str) {
          this.childMsg = str;
        }
      },
    }
    </script>
    
    
    子组件 ---> 父组件
    通过自定义事件$emit
    // 父组件: HelloWorld
    <template>
      <div class="hello">
        <!-- 使用自组件 -->
        <!-- <child1 :message="msg"></child1>
        <child2></child2>-->
        <!-- <child3 ref="child3"></child3> -->
        <child4 @getmsg="fun"></child4>
        <p>{{childMsg}}</p>
      </div>
    </template>
    
    <script>
    /* eslint-disable */
    import child1 from "./Child1.vue";
    import child2 from "./Child2.vue";
    import child3 from "./Child3.vue";
    import child4 from "./Child4.vue";
    
    export default {
      name: "HelloWorld",
      components: { child1, child2, child3, child4 },
      data() {
        return {
          msg: "这是一个父组件的信息, 但是我要显示在子组件上",
          childMsg: '',
        };
      },
      mounted() {
        // this.$children[0].fun(this.msg);
        // console.log(this.$children[0]);
        // console.log(this.$refs.child3);
        // console.log(this.$refs.child3.msg);
      },
      methods: {
        fun: function(s) {
          this.childMsg = s;
        }
      }
    };
    </script>
    
    
    
    
    // 子组件:Child
    <template>
      <div>{{childMsg}}</div>
    </template>
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: "我是子组件的msg",
          childMsg: ""
        };
      },
      mounted: function() {
        console.log(this.$emit("getmsg", this.msg));
        // this.childMsg = this.$emit("getmsg", this.msg);
      }
    };
    </script>
    
    效果:
    
    
    兄弟组件通过共同父辈组件搭桥
    $parent
    $root
    $children
    $emit
    其他方法和$emit类似,仅写一个例子
    // common
    <template>
      <div class="c">
        <h3>事件链传递数据</h3>
        <appA :msg-from-b="msgFromB" @msg-a-change="aSay"></appA>
        <appB :msg-from-a="msgFromA" @msg-b-change="bSay"></appB>
      </div>
    </template>
    
    <script>
    /* eslint-disable */
    import A from './A'
    import B from './B'
    export default {
      data: function() {
        return {
          msgFromA: 'A 还没说话',
          msgFromB: 'B 还没说话',
        }
      },
      methods: {
        aSay: function(msg) {
          this.msgFromA = msg;
        },
        bSay: function(msg) {
          this.msgFromB = msg;
        },
      },
      components: {
        appA: A,
        appB: B,
      }
    }
    </script>
    
    
    // A
    <template>
      <div>
        <h3>A模块</h3>
        <p>B说: {{msgFromB}}</p>
        <button @click="aSay">A 把自己的信息传给B</button>
      </div>
    </template>
    
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: "我是A"
        };
      },
      methods: {
        aSay: function() {
          this.$emit("msg-a-change", this.msg);
        }
      },
      props: ["msgFromB"]
    };
    </script>
    
    
    // B
    <template>
      <div>
        <h3>B模块</h3>
        <p>A说: {{msgFromA}}</p>
        <button @click="bSay">B 把自己的信息传给B</button>
      </div>
    </template>
    
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: '我是B',
        }
      },
      methods: {
        bSay: function() {
          this.$emit('msg-b-change', this.msg);
        }
      },
      props: ['msgFromA'],
    }
    </script>
    
    效果:
    
    
    
    
    隔代传递
    $attrs
    如上文
    provide/inject
     上辈组件provide
    子孙组件inject
    // 组件长辈/子辈顺序: App--->HelloWorld--->child4,所示例子中是App中provide,在child4中inject
    // App
    <template>
      <div id="app">
        <img src="./assets/logo.png" />
        <!-- <router-view/> -->
        <Hello></Hello>
        <Com></Com>
      </div>
    </template>
    
    <script>
    /* eslint-disable */
    import Hello from "./components/HelloWorld";
    import Com from "./components/brother/Common";
    
    export default {
      name: "app",
      provide() {
        return {
          rootMsg: '根信息',
        }
      },
      components: {
        Hello,
        Com
      }
    };
    </script>
    
    <style>
    #app {
      font-family: "Avenir", Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
    
    
    
    // 子孙组件inject
    <template>
      <div>
        {{childMsg}}
        <p>{{rootMsg}}</p>
      </div>
    </template>
    <script>
    /* eslint-disable */
    export default {
      data: function() {
        return {
          msg: "我是子组件的msg",
          childMsg: "",
          child4Msg: 'child4Msg......',
        };
      },
      inject: ['rootMsg'],
    };
    </script>
    
    效果:
     https://note.youdao.com/web/#/file/WEB1e40c3ee5241312ee63dc8c180aa2973/note/WEBd925acc08e1b9a82e5803c641345b4da/
    你对生活笑,生活不会对你哭。
  • 相关阅读:
    hadoop系列二:HDFS文件系统的命令及JAVA客户端API
    hadoop系列一:hadoop集群安装
    解决tomcat下面部署多个项目log4j的日志输出会集中输出到一个项目中的问题
    HandlerMethodArgumentResolver数据绑定无效
    MyBatis 元素类型为 "configuration" 的内容必须匹配 ".....
    jquery.uploadify 异常 “__flash__removeCallback”未定义
    fusioncharts图例(legend)属性
    Flex Error #2156问题
    HTML注释引起的问题
    Asp.net Mvc4 使用Cas单点登录
  • 原文地址:https://www.cnblogs.com/adanxiaobo/p/11691386.html
Copyright © 2011-2022 走看看