自定义组件绑定原生事件和自定义事件

在自定义组件的根元素上监听一个原生事件在和html原生标签上监听一个原生事件是有区别的

如在App.vue中:

<!-- 给自定义组件添加点击事件 print -->
<Article
  v-for="article in articleList"
  :key="article.title"
  :article="article"
  @click="print(article)"
></Article>

在Article.vue中:

<div class="article-title" @click="printTitle">{{ article && article.title }}</div>

点击文章列表的标题部分可以发现只有子组件的事件被执行了

如果要让父组件的方法也执行则需要用到修饰符

要让父组件的print执行,可以添加.native

<Article
  v-for="article in articleList"
  :key="article.title"
  :article="article"
  @click.native="print(article)"

></Article>

自定义事件

我们不能直接在子组件中直接修改父组件中传来的prop数据,所以可以通过自定义事件来完成

  1. 给子组件Article.vue绑定自定义事件:
    用v-on:upVote="handLikes"给Article.vue绑定自定义事件:
<!-- 自定义事件 upVote,调用该事件时会执行 handleLikes 方法 -->
<article
  v-for="article in articleList"
  :key="article.title"
  :article="article"
  v-on:upVote="handleLikes"
></article>

  1. 在Article.vue中调用自定义事件"upVote" :
<!-- 在 template 中直接调用自定义事件 upVote -->
<button @click="$emit('upVote')">点赞</button>

当方法需要参数时:

<button @click="childEvent">点赞</button>
methods: {
  childEvent: function() {
    // 调用自定义事件 upVote,这里的第二个参数最后会传到父组件中的 handleLikes 方法里
    this.$emit('upVote', this.article);
    // do other things
  }
}

$emit的第一个参数是自定义事件的名称后面的参数会成为自定义事件对应的方法的参数

总结,自定义事件可以:

  1. 在子组件中调用父组件的方法
  2. 把子组件的数据通过自定义事件参数的形式传给父组件

双向绑定

父组件App.vue中用修饰符.sync完成count的双向绑定:

<MyCount class="count" :count.sync="count"></MyCount>
// 在 `methods` 对象中定义方法
data: function() {
  return {
    count: 0
  }
}

子组件MyCount.vue中用update:count的模式触发事件,把count+1赋给count:

<div class="my-count">
  <button @click="$emit('update:count', count+1)">加一</button>
  {{ count }}
</div>

案例来自于优课达

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

-irony-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值