父子组件的通信

父子组件

父传子

props()

我们在组件内,写入props(),这里我们有两个选择,一种就是数组的方式,一种是对象的方式,后者比较常见

第一种数组的方式
代码如下
我们这里将Vue实例当作父组件

 <div id="app">
        <mycpn :cmessage='message'></mycpn>
    </div>
    <template id="cpn">
        <div>  
            <div>
                <h2>{{cmessage}}</h2>
            </div>
        </div>
    </template>

      
    </script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>

        const app = new Vue({
            el: "#app",
            data:{
                message:'我是父亲'
            },
            components: {
                'mycpn': {
                    template: '#cpn',
                    props:['cmessage']
                  
                }
            }
        })

    </script>

我么使用的第一种方式为数组方式,在[]里边写入变量,这个变量的名字必须与它在父组件上的名字不同,写入变量后,在我们html代码里面,绑定父组件的值 像上面这样 :cmessage=‘message’ 这样一来,我们就实现了,组件间的通信
还有一种方式也是我们平时比较常写的方式,对象方式,先看代码

<div id="app">
        <mycpn :cmessage='message'></mycpn>
    </div>
    <template id="cpn">
        <div>  
            <div>
                <h2>{{cmessage}}</h2>
            </div>
        </div>
    </template>

      
    </script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <script>

        const app = new Vue({
            el: "#app",
            data:{
                message:'我是父亲'
            },
            components: {
                'mycpn': {
                    template: '#cpn',
                    //后边跟的是对象,对象后面跟的就是需要传入的类型
                    props:{
                        cmessage:String
                    }
                  
                }
            }
        })

    </script>

第二种方法,我们可以做很多东西,

  1. 你还可以做多个类型的筛选
    例如
 props:{
          cmessage:[String,Number]
       }
  1. 带有默认值
 props:{
          cmessage:{
          	type:Number,
          	default:100
          }
       }

这样一来,数据验证为数字类型,默认值为100
默认值这里我们要注意一点是,如果说传入的类型为对象或者数组,那么我们的default必须是一个函数

 props:{
          cmessage:{
          	type:Array,
          	default(){
          		return []
          	}
          }
       }
  1. 是否需要传值
 props:{
          cmessage:{
          	type:Number,
          	default:100,
          	required:true
          }
       }

数据验证为数字类型,默认值为100,必须传入数据,不然浏览器报错

子传父

子组件将数据传给父组件,会比较麻烦一点,但是其中的核心便是一个函数
$emit() 我将它称之为发射函数,意思就是将数据发射出来,接下来的例子,就是将子组件的事件发射到父组件上。
我们的这个例子如下请添加图片描述
按下按钮,将中间的数字增减,num为中间的数据,且在父组件(Vue实例)里边

代码如下
template模板

 <template id="cpn">
        <div>  
            <button @click="add()">+</button>
            {{cnum}}
            <button @click="jian()">-</button>
        </div>
    </template>

我们使用两个按钮来使得cnum的值加减,分别用两个函数来监听

在组件内部的方法里面,写入两个方法

  components: {
                'mycpn': {
                    props:['cnum'],
                    template: '#cpn',
                    methods: {
                    //将加的方法发射出去
                        add() {
                            this.$emit('numadd')
                        },
                     //将减的方法发射出去
                        jian() {
                            this.$emit('numjian')
                        }
                    },
                  
                }
            },

然后,我们在html代码里面,来接收这两个函数,并且监听

 <div id="app">
        <mycpn :cnum='num'
                @numadd="numadd"
                @numjian="numjian">
        </mycpn>
    </div>

我们使用v-on方法来监听这两个函数,这里我们就可以知道v-on不止可以监听Dom,还可以监听自定义事件

做完监听和接收之后,我们就可以处理来自子组件的数据了,当然我们这里要处理的是点击事件,如果我们按了加的事件,我们的num++,所以我们在Vue实例的方法里边分别写入逻辑
代码如下

 methods: {
              numadd(){
                 	this.num++
                },
              numjian(){
                    this.num--
                }
            },

这样我们就实现我们想要的效果了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

憨憨小江

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

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

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

打赏作者

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

抵扣说明:

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

余额充值