vue.js --父子组件通信

父子组件通信

父子组件通信:子组件使用父组件数据(属性和方法)。vue是单项数据流,因此在通常情况下都是父组件传递数据给子组件使用,子组件触发父组件的事件,并传递给父组件所需要的参数。

父组件向子组件通信

子组件通过props接收

父组件调用子组件并通过自定义属性传入数据,子组件通过props接收父组件传递的数据,进行验证使用。
代码演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue父子组件通信</title>
    <!-- 使用CDN引入Vue -->
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
    <script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            //父组件通过自定义属性 count 传参
            template:`<demo :count="num"/>`
        })
        app.component('demo', {
        	//子组件通过 props 接收父组件传递的参数
            props:['count'],
            //子组件在模板中使用父组件传递过来的参数
            template:`<div>{{count}}</div>`
        })
        const vm = app.mount('#root');
    </script>
</body>
</html>

页面效果:
在这里插入图片描述

子组件向父组件通信

$emit自定义事件

子组件通过$emit自定义事件,向父组件进行传值;

父组件使用子组件自定义事件,通过事件方法接收子组件的传值;

代码演示:

	    <script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num = param;
                }
            },
            //父组件使用子组件自定义事件
            template:`<demo :count="num" @add-one="handleAddOne"/>`
        })
        app.component('demo', {
            props:['count'],
            methods: {
                handleClick(){
                	//子组件通过$emit自定义事件,向父组件传值
                    this.$emit('addOne', this.count + 5);
                }

            },
            template:`<div @click="handleClick">{{count}}</div>`
        })
        const vm = app.mount('#root');
    </script>

页面效果:

初始状态
在这里插入图片描述
点击一次
在这里插入图片描述
点击两次
在这里插入图片描述

点击触发事件,页面效果符合预期。

v-model改造$emit传递父组件数据

$emit传递单个父组件数据

代码演示:

<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model="num"/>`
        })
        app.component('demo', {
            props:['modelValue'],   // props 接受参数必须是 modelValue
            methods: {
                handleClick(){
                    this.$emit('update:modelValue', this.modelValue + 5);
                     // update:modelValue 也是固定写法
                }

            },
            template:`<div @click="handleClick">{{modelValue}}</div>`
        })
        const vm = app.mount('#root');
    </script>

props 参数可以换成其他参数名(如:app),但要在子组件上修改为 v-model:其他参数名(如:v-model:app)。

	<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model:app="num"/>`
        })
        app.component('demo', {
            props:['app'],  
            methods: {
                handleClick(){
                    this.$emit('update:app',this.app + 5); 
                }

            },
            template:`<div @click="handleClick">{{app}}</div>`
        })
        const vm = app.mount('#root');
    </script>

$emit传递多个父组件数据

代码演示:

<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0,
                    num1: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model:app="num" v-model:app1="num1"/>`
        })
        app.component('demo', {
            props:['app',"app1"],  
            methods: {
                handleClick(){
                    this.$emit('update:app',this.app + 5); 
                },
                handleClick1(){
                    this.$emit('update:app1',this.app1 + 5); 
                }

            },
            template:`
            <div @click="handleClick">{{app}}</div>
            <div @click="handleClick1">{{app1}}</div>
            `
        })
        const vm = app.mount('#root');
    </script>

总结

父子组件通信vue是单项数据流,父组件传递数据给子组件使用,子组件触发父组件事件对数据进行处理

父组件向子组件通信:使用props传递数据

子组件向父组件通信:使用$emit触发父组件的事件

(完)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱划水de鲸鱼哥~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值