组件的传参(组件的通讯方式)--子传父(vue2)

189 阅读2分钟

组件的通讯方式(组件的传参)

1.父传子[juejin.cn/post/743114…]

2.子传父

3.后代传参/祖孙传参

4.事件总线

5.vuex

子传父

一、引入子组件

index是父,son是子,在同一个文件下

image.png

步骤一 引入组件

// 第一步 引入组件
import son from "./son.vue";

步骤二 注册组件

  // 第二步 注册组件
  components: {
    // son: son,
    // 简写:如果属性和属性值是一样的那么就可以直接简写
    son
  },

步骤三 使用组件

<son></son>

二、开始子传父

首先给子级添加变量

data(){
return{
  str:"我是子组件---子父",
  arr:[11,22,33,44,55],
  obj:{
    name:"呵呵呵呵"
  }
}

},

两种方法:1.给子组件绑定一个自定义方法,值为接收子组件中参数的函数,然后到子组件内部通过this.$emit方法发送数据;2.给子组件绑定一个ref名称,然后通过this.$refs.名称来获取子组件实例

方法一:this.$emit

给子组件绑定自定义方,值为接受子组件中的参数的函数,这个函数会默认接受一个形参,这个形参就是接收的数据,注意这个函数不允许加()

<son @abc="handleSearch" @def="handleArr"></son>

然后在子组件(son.vue)中发送数据

handleClick(){
  console.log(this);
  // this.$emit("给子组件绑定的自定义方法名",传给父亲的参数)
  this.$emit("abc",this.str)
},
handleArr(){
  this.$emit("def",this.arr)
},

最后到父组件中接收数据

handleSearch(val){
  console.log(val);
  // 将接收到的数据赋值给data中的变量
  this.s=val
},
handleArr(val){
  this.a=val
}

方法二:this.$refs.名称

给子组件添加ref名称

<son ref="son"></son>

然后通过this.$refs.son来获取子组件实例

   handleClick(){
  // 当ref在标签上的时候获取的是dom元素
  // 当ref在组件上的时候获取的是这个组件的实例(这个组件中定义的所有的函数和变量)
  // console.log(this.$refs.名称,"获取dom元素");
  console.log(this.$refs.son,"获取当前son组件的vue实例");
  console.log(this.$refs.son.obj,"可以直接获取儿子中定义的变量");
}

这里可以通过this.$refs.son来调用子组件里面的函数,我理解为可以实现父传子,函数里面的参数为父组件里面的变量,然后在子组件中接收数据

// 直接调用儿子组件的方法,传递参数
this.$refs.son.handleHhh(this.str)
handleHhh(val){
  console.log(val,"val为父组件传过来的数据");
}

代码

子组件

<template>
  <div class="son">
    <h1>我是儿子组件</h1>
    <button @click="handleClick">发送</button>
    <button @click="handleArr">发送</button>
  </div>
</template>

<script>
export default {
  data(){
    return{
      str:"我是子组件---子父",
      arr:[11,22,33,44,55],
      obj:{
        name:"呵呵呵呵"
      }
    }
  },
  methods:{
    // 第五步  发送数据
    handleClick(){
      console.log(this);
      // this.$emit("给子组件绑定的自定义方法名",传给父亲的参数)
      this.$emit("abc",this.str)
    },
    handleArr(){
      this.$emit("def",this.arr)
    },
    handleHhh(val){
      console.log(val,"hello");
    }

  },
  mounted(){
    // 默认发送数据
    this.handleClick()
    
  }
}
</script>

<style lang="scss" scoped>
.son{
  background: green;
  color: #fff;
  padding: 10px 20px;
}
</style>

<!-- 
    子传父:子组件在父组件中使用,然后子组件绑定自定义方法,值为接受参数的函数,然后到子组件内部通过this.$emit方法发送数据

    给子组件标签中添加名字ref,然后直接调用儿子组件的方法,传递参数和获取变量
-->

父组件

<template>
  <div class="zifu">
    <h1>我是父组件</h1>
    <!-- 给元素起一个名字 -->
    <h2 ref="demo">{{ s }}--{{ a }}</h2>
    <button @click="handleClick">点击</button>
    <!-- 第三步 使用组件 -->
     <!-- 第四步 给子组件绑定自定义方,值为接受子组件中的参数的函数,这个函数会默认接受一个形参,这个形参就是接收的数据,注意这个函数不允许加() -->
    <zifuson 
    @abc="handleSearch" 
    @def="handleArr"
    ref="son"
    ></zifuson>
  </div>
</template>
<script>
  // 第一步 引入组件
  import zifuson from "./son.vue";
export default {
  data(){
    return{
      s:null,
      a:null,
      str:"我是父组件"
    }
  },
  methods:{
    handleSearch(val){
      console.log(val);
      // 将接收到的数据赋值给data中的变量
      this.s=val
    },
    handleArr(val){
      this.a=val
    },
    handleClick(){
      // 当ref在标签上的时候获取的是dom元素
      // 当ref在组件上的时候获取的是这个组件的实例(这个组件中定义的所有的函数和变量)
      console.log(this.$refs.demo,"获取dom元素");
      console.log(this.$refs.son,"获取当前son组件的vue实例");
      console.log(this.$refs.son.obj,"可以直接获取儿子中定义的变量");
      // 直接调用儿子组件的方法,传递参数
      this.$refs.son.handleHhh(this.str)
    }
  },
  // 第二步 注册组件
  components:{
    zifuson,
  }
}
</script>

<style lang="scss" scoped>
.zifu::v-deep{
  background-color: pink;
  padding: 50px 30px;
  color: #fff;
  h1{
    color: #fff;
    padding: 10px 0;
  }
}
</style>