VUE中父子组件传参(简单明了)

· 父组件向子组件传递参数

child.vue如下

<template>

    <div class="childClass">

        <h3>子组件内容</h3>

        <p :class="num==6?redclass:blueclass">当父组件内容传递给子组件时,该行变成红色</p>

        <p>父组件向子组件传递的参数是:{{num}}</p>
    
    </div>

</template>

<style lang='css'>

.redclass {

    color:red;

}

.blueclass {

    color:blue;

}

</style>



<script>

export default {

    data(){

        return {

            redclass:'redclass',
    
            blueclass:'blueclass',

        }

    },

    props:['num'], //使用字符串数组的形式!!

    // props:{ //当props是一个对象时,他包含验证要求

    // num:{

        // type:Number,

        // default:100,

    // },

    // }

}

</script>

 

parent.vue如下

<template>

    <div cals="parent">

        <h3>这是父组件的内容</h3>

        <hr>

        <Child :num="parentNum"></Child>

    </div>

</template>

<script>

import Child from './child.vue'

export default {

    components:{ Child },

    data(){

        return {

            parentNum:6,

        }

    },

}

</script>

 

实现原理如下:

· 子组件在props中创建一个属性如上的num,用来接收父组件中传递过来的值;

· 父组件中注册子组件,如components:{Child}

· 父组件中使用子组件标签,并在子组件标签中添加子组件props中创建的属性,如 <Child :num=””></Child>

· 把需要传递给子组件的值赋值给该属性,如<Child :num=”value”></Child>

 

------------------------------------------------------------------------------------------

 

· 组件向父组件传递参数

 

parent.vue如下

<template>

    <div cals="parent">

        <h3>这是父组件的内容</h3>

        <p :class='num==8?redclass:blueclass'>当子组件向父组件传递参数成功后,该行文字变红色</p>

        <p>父组件从子组件获取的参数是:{{num}}</p>

        <hr>

        <Child @listenToChildEvent="showMsgFromChild"></Child>

    </div>

</template>

<style>

    .redclass {

color:red;

}

    .blueclass {

color:blue;

}

</style>



<script>

import Child from './child.vue'

export default {

    components:{ Child },

    data(){

        return {

            num:0, //声明需要接受子组件参数的属性

            redclass:'redclass',

            blueclass:'blueclass',

       }

    },

    methods:{

        showMsgFromChild(data){

            this.num=data; //将子组件触发该事件时传递的参数赋值给父组件的属性

            console.log(data);

        }

    }

}

</script>

child.vue如下

<template>

    <div class="childClass">

        <h3>子组件内容</h3>

        <p>子组件向父组件传递的参数是:{{childNum}}</p>

        <button @click="sendMsgToParent()">点击传递参数</button>

    </div>

</template>

<script>

export default {

    data(){

        return {

            childNum:8,

        }

    },

    methods:{

        sendMsgToParent(){

            this.$emit('listenToChildEvent',this.childNum);

        }

    }

}

</script>

实现原理如下:

·父组件使用子组件标签,子组件标签中使用 v-on绑定自定义事件来监听该事件的触发 ,以及该自定义事件的相应函数(接收处理子组件传递的参数),如<Child @listenToChildEvent="showMsgFromChild()"></Child>          showMsgFromChild(data){ this.num=data; }
·子组件中触发该自定义事件,并传递子组件中的参数,如
sendMsgToParent(){ this.$emit('listenToChildEvent',this.childNum); }

 

注意:

1、props是可以是字符串数组,也可以是对象(可以类型验证、设置默认值等) ;

2、使用.native修饰监听事件,开发中使用了element-ui 的框架标签时候,使用事件绑定无效。这时候需要使用.native 修饰v-on:event ,可以在框架标签或组件的根元素上监听一个原生事件,例如

<my-component v-on:click.native="doTheThing"></my-component>

 

 

 

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3.0,父组件向子组件传递参数有多种方式。一种方式是通过props进行传递,另一种方式是通过自定义事件进行传递。 对于使用props进行传递的情况,父组件可以在子组件标签定义一个属性,然后在子组件使用props接收该属性的值。例如,父组件可以这样定义子组件的标签:`<son :type="father"></son>`,然后在子组件使用props接收父组件传递的值,例如:`props: { type: [String, Number },` [2。 对于通过自定义事件进行传递的情况,父组件可以在子组件的标签定义一个自定义事件,并在子组件使用defineEmits来向父组件传递参数。例如,父组件可以这样定义子组件的标签:`<sonOne msg="我是父组件的msg" @get-child-data="getChildData"></sonOne>`,然后在子组件使用defineEmits定义一个事件,并通过emits触发该事件来向父组件传递参数。例如,在子组件可以这样定义事件并触发:`const emits = defineEmits(); emits('getChildData', num);`,然后在父组件可以通过定义一个方法来接收子组件传递参数,并进行处理。。同时,在子组件使用reactive来定义响应式数据,以便接收父组件传递参数。例如,在子组件可以这样定义响应式数据:`const state = reactive({ fatherData: props.msg })` [3。 总结来说,在Vue 3.0,父组件可以通过props或自定义事件来向子组件传递参数,然后子组件可以使用props接收父组件传递的值,或使用defineEmits和emits来触发自定义事件并向父组件传递参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue2和vue3 父子组件传参及区别](https://blog.csdn.net/weixin_50370865/article/details/128413462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [vue3.0父子组件传递参数](https://blog.csdn.net/weixin_49596018/article/details/118700349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值