vue组件通信的几种方式

 

组件间通信场景大致分为以下几种

  1. 父组件向直接子组件传值。
  2. 子组件向直接父组件传值。
  3. 组件上下超过1级传值。

我们先来说第一种

1 父组件向直接子组件传值。

  • 方法1:通过props属性进行传值,props 可以是数组或对象,用于接收来自父组件的数据,官网使用说明。总结:子组件声明props,定义接受对象(可以指定接受对象的类型以及默认值),父组件通过v-bind:的方式进行传值。例子:
<!-- parent -->

<template>
  <div>
    <children v-bind:parentMessage="messge"></children>
    <!-- v-bind: 可以简写成:即 <children :parentMessage="messge"></children> -->
  </div>
</template>
<script>
import children from "./children";
export default {
  data() {
    return {
      messge: "i am from parent"
    };
  },
  components: {
    children
  }
};
</script>
<!-- children -->
<template>
    <div>
        <span>{{parentMessage}}</span>
    </div>
</template>
<script>
export default {
    props:{
        //指定类型
        parentMessage:{
            type:String,//可以指定多种类型用|链接,例如 type:String|Boolean|Number
            default:""
        }
    }
}
</script>
<!-- 父组件parent -->

<template>
  <div>
    <children ref='children'></children>
  </div>
</template>
<script>
import children from "./children";
export default {
  mounted(){
      //demo在此进行赋值调用
      this.$refs["children"].updateMessage('I am from parent');
  },
  components: {
    children
  }
};
</script>
<!-- 子组件 children -->
<template>
    <div>
        <span>{{message}}</span>
    </div>
</template>
<script>
export default {
    data(){
        return{
            message:"none"
        }
    },
    methods:{
        updateMessage(msg){
            this.message = msg;
        }
    }
}
</script>

2 子组件向直接父组件传值。

  •     通过子组件调用回调方法传参,语法:this.$emit('方法名字',参数值)。父组件监听子组件定义的“方法”,@"方法名字"=“本地方法名”。例子:
<!-- 父组件 parent -->

<template>
  <div>
    <children @handlerMessageChange="handlerMessageChange"></children>
  </div>
</template>
<script>
import children from "./children";
export default {
  methods:{
      handlerMessageChange(msg){
          console.log("子组件传递过来的参数:",msg);
      }
  },
  components: {
    children
  }
};
</script>
<!-- 子组件 children -->
<template>
    <div>
        <span @click="handlerClick">点我向父组件传参</span>
    </div>
</template>
<script>
export default {
    methods:{
        handlerClick(){
            this.$emit("handlerMessageChange",'i am from children');
        }
    }
}
</script>

3 组件上下超过1级传值。

  •  利用$parent、ref等方法。缺点容易乱,多层级不方便查找。
  • 利用vuex。优点:官方推荐方法。缺点:新的知识点需要系统了解学习。vuex官网
  • 利用provide/inject。优点:provide/inject是解决组件之间的通信问题的利器,不受层级结构的限制。(此方法提供的属性不是动态绑定的,非双向绑定)官网介绍。例子:
<!-- 父组件 parent -->

<template>
  <div>
    <children ></children>
  </div>
</template>
<script>
import children from "./children4";
export default {
  provide:function () {
    return{
        parentData:"i am parentData",//向子组件提供数据
    }
  },
  components: {
    children
  }
};
</script>
<!-- 子组件 children -->
<template>
    <div>
        <span @click="handlerClick">点我向父获取父组件的参数</span>
    </div>
</template>
<script>
export default {
    inject:['parentData'],
    methods:{
        handlerClick(){
            console.log(this.parentData);
        }
    }
}
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值