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

    组件之间如何通信,组件之间不同的关系,有不同的通信方式。

    (1)公用通信方式 :vuex

    不论组件是什么关系,都可以使用vuex,vuex状态管理器,可以把共享公共的数据都存储在这里,里面也有改变数据的方法。

    (2)父子组件通信方式: props/$emit 、$parent/$children 、provide/inject 

      (a)props/$emit:父组件通过props给子组件传数据,子组件通过$emit(事件名,参数)给父组件传新数据

    //父组件
    <template>
      <div>
          <child :message="mes" @postMessage="getMessage"></child>
          <div>{{mes}}</div>
      </div>
    </template>
    export default{
        data(){
            mes:"第一次消息"
        },
        methods:{
            // 接受子组件发起的$emit事件,传来的新数据
            getMessage(val){
                this.mes = val
            }
        }
    }
    
    // 子组件
    <template>
      <div>
          <p>我是子组件,props中message的值:{{message}}</p>
          <button @click="change">改变props中的message</button> 
      </div>
    </template>
    export default{
        props:["message"],
        methods:{
            change(){
                this.$emit("postMessage","第二次消息")
            }
        }
    }

      (b)$parent/$children:组件实例中有$parent、$children属性

      (c)provide/inject:这个比较适合跨级的组件,比如祖父组件与孙组件(描述的好奇怪啊)这种。

    //父(祖父)组件
    export default {
        name: "App",
        data() {
            return {
              a: "123"
            };
          },
          provide() {
            return {
              a: this.a,
              b: "bb"
            };
          }
      }

    // 子组件 export default{ inject:['a','b'], created(){ console.log(this.a,this.b) // 123 bb } }

    (3)兄弟组件通信方式: bus

    兄弟组件之间通信,通过创建一个新的vue实例,作为两者之间的桥梁,然后通过$emit 和 $on去触发接受事件。

    ps:$on接受事件之后,记得在beforeDestory移除,即$off。

    //首先创建一个文件BUS.js
    import Vue from 'vue';
    export default new Vue;
    
    // 子组件A
    <template>
      <div>
        <div>我是子组件A:{{num}}</div>
        <button @click="add">点击加1</button>
      </div>
    </template>
    import BUS from "../common/BUS.js";
    export default{
        data(){
            return {
                num:0
            }
        },
        methods:{
            add(){
                this.num+=1
                BUS.$emit("getNum",this.num)
            }
        }
    }
    
    // 子组件B
    <template>
      <div>
        <div>我是子组件:{{num}}</div>
      </div>
    </template>
    import BUS from "../common/BUS.js";
    export default{
        data(){
            return {
                num:0
            }
        },
        created(){
            BUS.$on("getNum",val=>{
                this.num = val
            })
        },
        beforeDestroy() {
            // 记得移除
            BUS.$off("getNum")
        }
    }
    
    // 父组件
    <templete>
        <div>
            <child-a></child-a>
            <child-b></child-b>
        </div>
    </templete>
  • 相关阅读:
    io学习
    asp.net文件上传进度条研究
    asp.net页面中的Console.WriteLine结果如何查看
    谨慎跟随初始目的不被关联问题带偏
    android 按钮特效 波纹 Android button effects ripple
    安卓工作室 日志设置
    安卓工作室 文件浏览器 android studio File browser
    一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
    新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial
    码云,git使用 教程-便签
  • 原文地址:https://www.cnblogs.com/grow-up-up/p/12883399.html
Copyright © 2011-2022 走看看