Vue-笔记

本文详细介绍了在Vue.js中父子组件之间的通信方式,包括使用props从父组件向子组件传递数据,以及通过自定义事件从子组件向父组件发送消息。示例代码展示了如何定义props的类型、默认值以及如何触发和监听自定义事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父子组件之间的通信

(1)props向子组件传递数据
(2)通过自定义事件向父组件发送消息
(3)在真实开发中,vue实例和子组件的通信和父组件和子组件的通信过程是一样的

在这里插入图片描述

父组件向子组件通信,只需要添加 props

<div id="app">
        <cpn v-bind:cmovies="movies" :cmessage="message"></cpn>
    </div>
    <template id="cpn">
        <div>
            <p>{{cmovies}}</p>
            <p>{{cmessage}}</p>
        </div>
    </template>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        //父传子:propos
        const cpn={
            template:'#cpn',
            // props:['cmovies','cmessage']
            props:{
                //1.类型限制
                //  cmovies:Array,
                // cmessage:String 

                //2.提供一些默认值 以及必传值
                cmessage:{
                    type:String,
                    default:'abc', //设置默认值
                    required:true
                },
                //3.类型是对象或者数组时,默认值必须是一个函数
                cmovies:{
                    type:Array,
                    default(){
                        return []
                    }
                },
                //4.自定义类型 
                author:Person
            }
        }

        function Person(firstName,lastName){
            this.firstName = firstName
            this.lastName = lastName
        }

        const app = new Vue({
            el:'#app',
            data:{
                message:'你好',
                movies:['海王','海泽旺']
            },
            components:{
                cpn
            }

        })
    </script>

父传子驼峰标识

通过v-bind 绑定不支持驼峰命名,但可以转成: - 如c-info
如果在组件里 包含很多标签,必须包含一个根 div 把里面标签包起来

子传父:自定义事件

在子组件中,通过$emit()来触发事件
在父组件中,通过v-on来监听子组件事件

 <!-- 父组件模板 -->
    <div id="app">
        <cpn @itemclick = "cpnClick"></cpn>
    </div>

    <!-- 子组件模板 -->
    <template id="cpn">
        <div>
            <button v-for="item in categories" 
                    @click="btnClick(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:'aaa',name:'热门推荐'},
                        {id:'bbb',name:'手机数码'},
                        {id:'ccc',name:'家用家电'},
                        {id:'ddd',name:'电脑办公'},
                    ]
                }
            },
            methods:{
                btnClick(item){
                    //发射事件 :自定义事件
                    this.$emit('itemclick',item)
                }
            }
        }

        //2.父组件
        const app = new Vue({
            el:'#app',
            data:{

            },
            components:{
                cpn
            },
            methods:{
                cpnClick(item){
                    console.log('cpnClick',item);
                }
            }
        })
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值