组件间的传值

组件间的传值

如果A组件中引入了B组件 ,这样我们称A组件为父组件,B为子组件

父组件传值给子组件

  • 在子组件标签上定义一个ref属性

      <组件名 ref="xxx"></组件名> 
    
  • 在需要给子组件传值的地方写入:

    this.$refs.xxx   //这就代表了子组件xxx的vue实例
    //这里xxx代码标签中定义的ref属性名这里就可访问到子组件里面的data属性与methods方法
    //如要修改子组件里面data里的某个值:          this.$refs.xxx.子组件里data属性名
    //如果需要调用子组件里面methods里某个方法:   this.$refs.xxx.子组件里面methods里方法名   
    

子组件传值给父组件

    this.$parent    //这就代表父组件的vue实例
    //如要修改父组件里面data里的某个值:         this.$parent.父组件里data属性名
    //如果需要调用父组件里面methods里某个方法:   this.$parent.父组件里面methods里方法名   

注意:ref获取到的dom信息在这里与document.getElementById是有本质 区别的

//两个组件,这个是father.vue
<template>
  <div>
    <button @click="btnClick">点我获取数据</button>
    <div>你选中的当前歌曲:{{localSong}}</div>
    <son ref="son" id="son"></son>
  </div>
</template>
<script>
// 组件使用,导包,注册,使用
//1:导包
import axios from "axios";
import son from "./son.vue";
export default {
  data() {
    return {
      songs: [],
      localSong: ""
    };
  },
    //2:注册
  components: {
    son
  },
  methods: {
    btnClick() {
      window.console.log("ref访问:", this.$refs.son.$el);
      window.console.log("原生访问:", document.getElementById("son"));
      //要调接口,是不是要使用axios
      //装包,导包,用包
      axios({
        url:
          "https://autumnfish.cn/search?keywords=神话&_t=" + Math.random() * 100
      }).then(res => {
        //   父组件传递子组件值,在子组件上定义一个ref,通过this.$refs.名字,我们就能访问子组件的实例,也就是可访问子组件data属性与methods方法
        this.$refs.son.songs = res.data.result.songs;
        this.$refs.son.alertEvent();
        window.console.log(res.data.result.songs);
      });
    }
  }
};
</script>
<style>
</style>
//son.vue
<template>
  <ul>
    <li v-for="(item, index) in songs" :key="index" @click="liCLick(item.name)">{{item.name}}</li>
  </ul>
</template>
<script>
// 子组件访问父组件里的data与methods更简单,只需要this.$parent就够了
export default {
  data() {
    return {
      songs: []
    };
  },
  methods: {
    liCLick(name) {
      this.$parent.localSong = name;
      window.console.log("访问父组件:", name, this.$parent);
    },
    alertEvent() {
      alert(123);
    }
  }
};
</script>
<style>
</style>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容