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>
  • 相关阅读:
    [原创]手把手教你如何把二维码插件zxing加入到android和ios项目中
    解决通过Intent调用系统拍照程序,返回图片太小的问题[android] 【转】
    SVN Command
    取得ie 里面 自定义函数或者属性的集合 使用RuntimeObject()
    scrum 开发模型
    javascript AOP 实现,ajax回调函数使用比较方便
    印度英语的特点
    AspectJS
    java 打jar包 转
    XP 开发模式
  • 原文地址:https://www.cnblogs.com/grow-up-up/p/12883399.html
Copyright © 2011-2022 走看看