全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Vue自定义事件(详解)

前面的话

父组件使用props传递数据给子组件,子组件怎么跟父组件通信呢?这时,Vue的自定义事件就派上用场了。本文将详细介绍Vue自定义事件

事件绑定

每个 Vue 实例都实现了事件接口 (Events interface),即

使用 $on(eventName) 监听事件
使用 $emit(eventName) 触发事件

[注意]Vue 的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是 $on 和 $emit 不是addEventListener 和 dispatchEvent 的别名

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件

[注意]不能用 $on 侦听子组件抛出的事件,而必须在模板里直接用 v-on 绑定

<div id="example">
 <parent></parent>
</div>
<script>
var childNode = {
 template: `<button @click="incrementCounter">{{ counter }}</button>`,
 data(){
  return {
   counter: 0
  }
 },
 methods:{
  incrementCounter(){
   this.counter ++;
   this.$emit('increment');
  }
 },
}
var parentNode = {
 template: `
 <div class="parent">
  <p>{{total}}</p>
  <child @increment="incrementTotal"></child>
  <child @increment="incrementTotal"></child>
 </div>
 `,
 components: {
  'child': childNode
 },
 data(){
  return {
   'total':0
  }
 },
 methods:{
  incrementTotal(){
   this.total ++;
  }
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
  'parent': parentNode
 }
})
</script>

命名约定

自定义事件的命名约定与组件注册及props的命名约定都不相同,由于自定义事件实质上也是属于HTML的属性,所以其在HTML模板中,最好使用中划线形式

<child @pass-data="getData"></child>

而子组件中触发事件时,同样使用中划线形式

 this.$emit('pass-data',this.childMsg)

数据传递

子组件通过$emit可以触发事件,第一个参数为要触发的事件,第二个事件为要传递的数据

this.$emit('pass-data',this.childMsg)

父组件通过$on监听事件,事件处理函数的参数则为接收的数据

getData(value){
   this.msg = value;
}
<div id="example">
 <parent></parent>
</div>
<script>
var childNode = {
 template: `
 <div class="child">
  <div>
   <span>子组件数据</span>
   <input v-model="childMsg" @input="data">
  </div>
  <p>{{childMsg}}</p>
 </div>
 `,
 data(){
  return{
   childMsg:''
  }
 },
 methods:{
  data(){
   this.$emit('pass-data',this.childMsg)
  }
 }
}
var parentNode = {
 template: `
 <div class="parent">
  <div>
   <span>父组件数据</span>
   <input v-model="msg">
  </div>
  <p>{{msg}}</p>
  <child @pass-data="getData"></child>
 </div>
 `,
 components: {
  'child': childNode
 },
 data(){
  return {
   'msg':'match'
  }
 },
 methods:{
  getData(value){
   this.msg = value;
  }
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
  'parent': parentNode
 }
})
</script>

sync修饰符

在一些情况下,可能会需要对一个 prop 进行双向绑定。事实上,这正是Vue1.x中的 .sync修饰符所提供的功能。当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定的值。这很方便,但也会导致问题,因为它破坏了单向数据流的假设。由于子组件改变 prop 的代码和普通的状态改动代码毫无区别,当光看子组件的代码时,完全不知道它何时悄悄地改变了父组件的状态。这在 debug 复杂结构的应用时会带来很高的维护成本,上面所说的正是在 2.0 中移除 .sync 的理由

从 2.3.0 起重新引入了 .sync 修饰符,但是这次它只是作为一个编译时的语法糖存在。它会被扩展为一个自动更新父组件属性的 v-on 侦听器

<comp :foo.sync="bar"></comp>

会被扩展为:

<comp :foo="bar" @update:foo="val => bar = val"></comp>

当子组件需要更新 foo 的值时,它需要显式地触发一个更新事件:

this.$emit('update:foo', newValue)

因此,可以使用.sync来简化自定义事件的操作,实现子组件向父组件的数据传递

<div id="example">
 <parent></parent>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
var childNode = {
 template: `
 <div class="child">
  <div>子组件数据:{{childMsg}}</div>
  <input v-model="childMsg">
  <button @click=add >+1</button>
 </div>
 `,
 data(){
  return{
   childMsg: 0
  }
 },
 methods:{
  add(){
   this.childMsg++;
   this.$emit('update:foo',this.childMsg);
  }
 }
};
var parentNode = {
 template: `
 <div class="parent">
  <p>父组件数据:{{msg}}</p>
  <child :foo.sync="msg"></child>
 </div>
 `,
 components: {
  'child': childNode
 },
 data(){
  return {
   'msg':0
  }
 }
};
// 创建根实例
new Vue({
 el: '#example',
 components: {
  'parent': parentNode
 }
})
</script>

以上这篇Vue自定义事件(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# vue自定义事件  # node.js中事件触发器events的使用方法实例分析  # VUE DOM加载后执行自定义事件的方法  # vue子组件使用自定义事件向父组件传递数据  # 浅谈Vue.js 组件中的v-on绑定自定义事件理解  # Vue.js自定义事件的表单输入组件方法  # Vue.js组件通信之自定义事件详解  # Vue组件之自定义事件的功能图解  # vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】  # 从Node.js事件触发器到Vue自定义事件的深入讲解  # 自定义  # 绑定  # 也会  # 给大家  # 修饰符  # 改变了  # 是在  # 都不  # 第一个  # 很高  # 希望能  # 第二个  # 作为一个  # 详细介绍  # 因为它  # 可以使用  # 以其  # 这篇  # 这在  # 不能用 


相关文章: 建站主机选择指南:服务器配置与SEO优化实战技巧  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  制作宣传网站的软件,小红书可以宣传网站吗?  Swift中循环语句中的转移语句 break 和 continue  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  高防服务器租用如何选择配置与防御等级?  如何快速重置建站主机并恢复默认配置?  5种Android数据存储方式汇总  如何用PHP快速搭建CMS系统?  平台云上自主建站:模板化设计与智能工具打造高效网站  内网网站制作软件,内网的网站如何发布到外网?  ui设计制作网站有哪些,手机UI设计网址吗?  linux top下的 minerd 木马清除方法  网站制作公司排行榜,抖音怎样做个人官方网站  独立制作一个网站多少钱,建立网站需要花多少钱?  如何快速搭建高效WAP手机网站?  孙琪峥织梦建站教程如何优化数据库安全?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  专业网站建设制作报价,网页设计制作要考什么证?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何通过西部数码建站助手快速创建专业网站?  如何通过VPS搭建网站快速盈利?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  PHP正则匹配日期和时间(时间戳转换)的实例代码  已有域名如何快速搭建专属网站?  智能起名网站制作软件有哪些,制作logo的软件?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  开源网站制作软件,开源网站什么意思?  如何在IIS中新建站点并配置端口与IP地址?  建站之星如何实现五合一智能建站与营销推广?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  代购小票制作网站有哪些,购物小票的简要说明?  微信推文制作网站有哪些,怎么做微信推文,急?  如何使用Golang table-driven基准测试_多组数据测量函数效率  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何设置并定期更换建站之星安全管理员密码?  如何破解联通资金短缺导致的基站建设难题?  免费视频制作网站,更新又快又好的免费电影网站?  上海网站制作开发公司,上海买房比较好的网站有哪些?  建站主机空间推荐 高性价比配置与快速部署方案解析  教学论文网站制作软件有哪些,写论文用什么软件 ?  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站主机服务器选型指南与性能优化方案解析  实现虚拟支付需哪些建站技术支撑?  如何在VPS电脑上快速搭建网站?  宝塔建站后网页无法访问如何解决?  高端建站如何打造兼具美学与转化的品牌官网?  如何用AWS免费套餐快速搭建高效网站?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。