vue父子组件之间相互传值

Posted shanchui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue父子组件之间相互传值相关的知识,希望对你有一定的参考价值。

1. 子组件使用父组件方法,并向父组件传值

子组件代码

<template>
  <div class="menu">
    <div class="item-group" v-for="(item,index) in menu">
      <router-link :to="item.url"  tag="div" class="wrap" @click.native="handlerClick(item.txt)">
        <!-- .native实现原生事件 -->
        <div :class="item.icon"></div>
        <div class="txt">{{item.txt}}</div>
      </router-link>
    </div>
  </div>
</template>

<script>
  export default{
    name:"Menu",
    props:{
      menu:{
        type:Array
      }
    },
    data(){
      return{
        show:false
      }
    },
    methods:{
      //子组件使用父组件方法,并向父组件传值
      handlerClick(txt){
        this.$emit("func",txt)
      },
    }
  }
</script>

父组件代码:

<template>
  <div class="recommend">
    <Menu :menu="nav" @func="show" ></Menu>
    <Menu :menu="more" style="background-color: #f5f5f5; padding:10px 0px" v-show="state"></Menu>
    <div class="song-list-area">
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
    </div>
  </div>
</template>

<script>
  import Menu from "../comment/menu.vue"
  export default{
    name:"Recommend",
    data(){
      return{
        nav:[
          {id:0,txt:"乐库",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:1,txt:"猜你喜欢",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:2,txt:"每日推荐",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:3,txt:"排行榜",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:4,txt:"更多",icon:"iconfont icon-aixin_line",hiden:false,url:"/"}
        ],
        more:[
          {id:0,txt:"音乐相册",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:1,txt:"相亲",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:2,txt:"偶遇",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:3,txt:"音乐速配",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:4,txt:"语音直播",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:5,txt:"探索",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:6,txt:"游戏中心",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:7,txt:"唱片店",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:8,txt:"首唱会",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:9,txt:"铃声彩铃",icon:"iconfont icon-aixin_line",hiden:false,url:"/"}
        ],
        state:false
      }
    },
    components:{
      Menu
    },
    mounted() {

    },
    methods:{
      show(data){
        console.log("data",data)
        this.nav.forEach((item,index)=>{
          if(item.txt==data){
            this.state=! this.state
          }
        })
      },
    }
  }
</script>

主要是子组件使用this.$emit("定义父组件方法名称",参数)  

父组件就可以使用 @定义父组件方法的名称="方法名"

 

 

2.父组件使用子组件方法  ,并向子组件传递数据

子组件代码:

<template>
  <div class="menu">
    <div class="item-group" v-for="(item,index) in menu">
      <router-link :to="item.url"  tag="div" class="wrap" @click.native="handlerClick">
        <!-- .native实现原生事件 -->
        <div :class="item.icon"></div>
        <div class="txt">{{item.txt}}</div>
      </router-link>
    </div>
  </div>
</template>

<script>
  export default{
    name:"Menu",
    props:{
      menu:{
        type:Array
      }
    },
    data(){
      return{
        show:false
      }
    },
    methods:{
      handlerClick(txt){
        console.log(txt)
      },


      // 子组件使用父组件方法,并向父组件传值
      // handlerClick(txt){
      //   this.$emit("func",txt)
      // },
    }
  }
</script>

父组件代码:

<template>
  <div class="recommend">
    <Menu :menu="nav" ref="nav"></Menu>
    <input type="button" value="点击" @click=handlerClick()>
    <Menu :menu="more" style="background-color: #f5f5f5; padding:10px 0px" v-show="state"></Menu>
    <div class="song-list-area">
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
      <div class="song-group">
        <img src="" alt="">
        <p>原来那些歌的原曲在这里</p>
      </div>
    </div>
  </div>
</template>

<script>
  import Menu from "../comment/menu.vue"
  export default{
    name:"Recommend",
    data(){
      return{
        nav:[
          {id:0,txt:"乐库",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:1,txt:"猜你喜欢",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:2,txt:"每日推荐",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:3,txt:"排行榜",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:4,txt:"更多",icon:"iconfont icon-aixin_line",hiden:false,url:"/"}
        ],
        more:[
          {id:0,txt:"音乐相册",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:1,txt:"相亲",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:2,txt:"偶遇",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:3,txt:"音乐速配",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:4,txt:"语音直播",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:5,txt:"探索",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:6,txt:"游戏中心",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:7,txt:"唱片店",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:8,txt:"首唱会",icon:"iconfont icon-aixin_line",hiden:false,url:"/"},
          {id:9,txt:"铃声彩铃",icon:"iconfont icon-aixin_line",hiden:false,url:"/"}
        ],
        state:false
      }
    },
    components:{
      Menu
    },
    mounted() {

    },
    methods:{
      handlerClick(){
        this.$refs.nav.handlerClick("我是父组件向子组件传递的值")
      }
      // show(data){
      //   console.log("data",data)
      //   this.nav.forEach((item,index)=>{
      //     if(item.txt==data){
      //       this.state=! this.state
      //     }
      //   })
      // },
    }
  }
</script>

主要是在父组件使用的子组件上添加 ref="名称"  在父组件方法中使用this.$refs.名称.子组件方法名称(传递的参数)

子组件定义方法  子组件方法名称(参数){console.log(参数)}

 

 

3.父组件向子组件传递数据也可以通过  在子组件中使用props定义传递的数据类型等

在父组件中的子组件使用中绑定数据

以上是关于vue父子组件之间相互传值的主要内容,如果未能解决你的问题,请参考以下文章

Vue中父子组件之间相互传值的方法

Vue父子组件之间的相互通信

vue组件之间相互传值的方式

vue父子组件之间的通信

VUE父子组件之间的传值,以及兄弟组件之间的传值

Vue 父子组件、兄弟组件传值