其他分享
首页 > 其他分享> > Vue 父子组件的通信传参(props、$emit)

Vue 父子组件的通信传参(props、$emit)

作者:互联网

简述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HcTOE3E-1616682136689)(父子组件的通信.assets/image-20210325212816171.png)]

真实的开发中,Vue实例和子组件的通信和父组件和子组件的通信过程是一样的。所以在下面的代码中,我直接将Vue实例当做父组件,并且其中包含子组件来简化代码。

props数据验证(父传子)

<div id="app">
  <my_cpn :cmovies="movies" :cmessage="message"></my_cpn>
</div>

<template id="my_cpn">
  <div>
    <ul>
      <li v-for="movie in cmovies">{{movie}}</li>
    </ul>
    <p>{{cmovies}}</p>
    <p>{{cmessage}}</p>
  </div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
  const my_cpn ={
    template:'#my_cpn',
    // 传递数组
    // props:['cmovies','cmessage'],
    // 传递对象,控制传递类型的限制
    // 传递对象,提供一些默认值
    props:{
      // cmovies:Array,
      // cmessage:String,
      cmessage:{
        type: String,     // 限制类型
        default:"full",   // 设置默认值,默认值在没有传值的情况下,会自动显示默认值
        require:false     // 如果为True,那么就是必传值,不传就会报错
      },
      cmovies:{
        type:Array,
          //当为数组对象时,如果 default:[] 报错就用以下方式
        default(){
          return []
        }
      }
    },
    data(){
      return{

      }
    }
  }
  const app = new Vue({
    el:"#app",
    data:{
      message:'hello',
      movies:['海王','海贼王','海尔兄弟'],
    },
    components:{
      my_cpn
    }
  })
</script>


自定义事件(子传父)

<!--1.父组件模板-->
<div id="app">
  <cpn @itemclick="cpnclick"></cpn>
</div>
<!--2.子组件模板-->
<template id="cpn">
  <div>
<!--    创建分类按钮,并监听点击-->
    <button v-for="item in categories" @click="itemclick(item)">
      {{item.name}}
    </button>
  </div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
  // 1.子组件
  const cpn = {
    template: '#cpn',
    data(){
      return{
        categories:[
          {id:'100',name:'热门推荐'},
          {id:'101',name:'手机数码'},
          {id:'102',name:'家用电器'},
          {id:'103',name:'电脑办公'},
        ]
      }
    },
    methods:{
      itemclick(item){
        console.log(item);
        //将item传给父组件,自定义
        //this.$emit('名称',传送参数)
        this.$emit('itemclick',item)//可以理解触发@itemclick
      }
    }
  }
  //2.父组件
  const app = new Vue({
    el:"#app",
    data:{

    },
    components:{
      cpn
    },
    methods:{
      cpnclick(item){
        console.log('cpnclick',item);
      }
    }
  })
</script>

标签:传参,Vue,cpn,自定义,item,props,组件
来源: https://blog.csdn.net/weixin_43745075/article/details/115220414