子组件调用父组件方法_14、父组件向子组件通信

7bd4c9cc8ae5c90944cc946e4c1f83f4.png

本文重点:

1. 不使用 v-bind 传递数据;
2. 使用 v-bind 传递数据;
3. 以上两者的区别。

先把重要的知识点写在前面:

  • 子组件使用 props 接收父组件传过来的数据;
  • props 的值可以是数组,也可以是对象,本文先使用数组;
  • props 中定义的属性, 子组件可以直接使用。

简单来说,父组件向子组件传递数据可以分为以下几个步骤:

  1. 在父组件绑定数据;
  2. 在子组件使用 props 接收数据;
  3. 在子组件使用数据。

一、父组件直接向子组件传递数据(不使用 v-bind)

<div id="app">
    <child-component msg="你的晚安"></child-component>    // 2. 渲染子组件,并传递 msg
</div>

var app = new Vue({
  el: '#app',
  data: {},
  components: {    // 1.定义子组件
    'child-component': {
      props: ['msg'],  // 3. 子组件使用 props 接收父组件传递的 msg
      template: '<h1>{{ msg }}</h1>'  // 4. 在 template 中使用 msg
    }
  }
})

渲染:

2d90b7eaf2df35fc92bc17ae3d550ed4.png

二、使用 v-bind 绑定数据

<div id="app">
    <input type="text" v-model="text">  // 1.input 中使用 v-model 动态绑定了父组件中的 text
    <child-component :dong="text"></child-component>  // 2.在子组件上绑定 dong 属性,值为父组件中的 text
</div>

var app = new Vue({
  el: '#app',
  data: {
    text: '是下意识的侧影'
  },
  components: {
    'child-component': {
      props: ['dong'],  // 3.接收 dong 属性
      template: '<h2>{{ dong }}</h2>'  // 4.使用 dong 属性
    }
  }
})

渲染效果默认是这样的:

4b7f27b8734fd076d9b96e559453cb20.png

因为子组件中的内容,是父组件通过使用 v-bind 传递过来的,传过来的就是父组件中的 text。而父组件中的 input 又使用了 v-model 绑定了 text,所以,当改变 input 中的内容时,父组件中的 text 就会改变,text 又传递到子组件,子组件中的内容也会跟着改变。如:

89ab69ac8e2e63dd4dbaec4df0348108.png

三、不使用 v-bind 和 使用 v-bind 的区别

<div id="app">
    <dong-component dong="[1, 2, 3]"></dong-component>    // 3.dong组件没有用 v-bind,传了一个数组
    <liang-component :liang="[1, 2, 3]"></liang-component>  // 4.liang组件用了 v-bind,传了一个数组
</div>

var app = new Vue({
  el: '#app',
  data: {},
  components: {
    'dong-component': {    // 1.dong组件
      props: ['dong'],  // 5.接收 dong
      template: '<h2>{{ dong.length }}--{{ typeof dong }}</h2>'  // 6.显示数组的长度和类型
    },
    'liang-component': {  // 2.liang组件
      props: ['liang'],  // 7. 接收 liang
      template: '<h2>{{ liang.length }}--{{ typeof liang }}</h2>'  // 8. 显示数组的长度和类型
    }
  }
})

渲染效果:

df336c6751bbef632df049033d336b7b.png

可以看到,没有使用 v-bind 的子组件,看起来像是传了一个数组,可其实并不是数组,而是字符串。使用的 v-bind 的子组件,看起来传的是数组,其实它真的是数组。

总结成一句话就是:不使用 v-bind,传的是字符串;使用 v-bind,传的是什么就是什么。

你也可以尝试传递其他类型的值试一试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值