加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Vue.js 父子组件通讯的十种方法

发布时间:2019-06-01 17:42:54 所属栏目:教程 来源:gongph
导读:口试官:Vue 中父子组件通讯有哪些方法? 本身先想一分钟。 无能否定,此刻无论大厂照旧小厂都已经用上了 Vue.js 框架,简朴易上手不说,教程细致,社区活泼,第三方套件还多。 真的是前端开拓职员必备手艺。 并且在口试傍边也每每会问到关于 Vue 方面的各

既然作为一个语法糖,必定是某种写法的简写情势,哪种写法呢,看代码:

  1. <text-document  v-bind:title="doc.title"  v-on:update:title="doc.title = $event"></text-document> 

于是我们可以用 .sync 语法糖简写成如下情势:

  1. <text-document v-bind:title.sync="doc.title"></text-document> 

空话这么多,怎样做到“双向绑定” 呢?

让我们进段告白,告白之后越发出色!

... 好的,接待返来。

若是我们想实现这样一个结果:改变子组件文本框中的值同时改变父组件中的值。

怎么做?各位不妨先想想。先看段代码:

  1. <div id="app">  <login :name.sync="userName"></login> {{ userName }}</div> 
  2. let Login = Vue.extend({ 
  3.   template: ` 
  4.     <div class="input-group"> 
  5.       <label>姓名:</label> 
  6.       <input v-model="text"> 
  7.     </div> 
  8.   `, 
  9.   props: ['name'], 
  10.   data () { 
  11.     return { 
  12.       text: '' 
  13.     } 
  14.   }, 
  15.   watch: { 
  16.     text (newVal) { 
  17.       this.$emit('update:name', newVal) 
  18.     } 
  19.   } 
  20. }) 
  21.  
  22. new Vue({ 
  23.   el: '#app', 
  24.   data: { 
  25.     userName: '' 
  26.   }, 
  27.   components: { 
  28.     Login 
  29.   } 
  30. }) 

下面划重点,代码里有这一句话:

  1. this.$emit('update:name', newVal) 

官方语法是:update:myPropName 个中 myPropName 暗示要更新的 prop 值。

虽然假如你不消 .sync 语法糖行使上面的 .$emit 也能到达同样的结果。仅此罢了!

4. $attrs 和 $listeners

  • 官网对 $attrs 的表明如下:

包括了父浸染域中不作为 prop 被辨认 (且获取) 的特征绑定 (class 和 style 除外)。

当一个组件没有声明任何 prop 时,这里会包括全部父浸染域的绑定 (class 和 style 除外),而且可以通过 v-bind="$attrs" 传入内部组件——在建设高级此外组件时很是有效。

  • 官网对 $listeners 的表明如下:

包括了父浸染域中的 (不含 .native 修饰器的) v-on 变乱监听器。

它可以通过 v-on="$listeners" 传入内部组件——在建设更高条理的组件时很是有效。

我认为 $attrs 和 $listeners 属性像两个收纳箱,一个认真收纳属性,一个认真收纳变乱,都是以工具的情势来生涯数据。

看下面的代码表明:

  1. <div id="app">  <child    :foo="foo"    :bar="bar"    @one.native="triggerOne"    @two="triggerTwo">  </child></div> 

从 Html 中可以看到,这里有俩属性和俩要领,区别是属性一个是 prop 声明,变乱一个是 .native 修饰器。

  1. let Child = Vue.extend({ 
  2.   template: '<h2>{{ foo }}</h2>', 
  3.   props: ['foo'], 
  4.   created () { 
  5.     console.log(this.$attrs, this.$listeners) 
  6.     // -> {bar: "parent bar"} 
  7.     // -> {two: fn} 
  8.  
  9.  
  10.     // 这里我们会见父组件中的 `triggerTwo` 要领 
  11.     this.$listeners.two() 
  12.     // -> 'two' 
  13.   } 
  14. }) 
  15.  
  16. new Vue({ 
  17.   el: '#app', 
  18.   data: { 
  19.     foo: 'parent foo', 
  20.     bar: 'parent bar' 
  21.   }, 
  22.   components: { 
  23.     Child 
  24.   }, 
  25.   methods: { 
  26.       triggerOne () { 
  27.       alert('one') 
  28.     }, 
  29.     triggerTwo () { 
  30.       alert('two') 
  31.     } 
  32.   } 
  33. }) 

可以看到,我们可以通过 $attrs 和 $listeners 举办数据转达,在必要的处所举办挪用和处理赏罚,照旧很利便的。

虽然,我们还可以通过 v-on="$listeners" 一级级的往下转达,子子孙孙无限尽也!

一个插曲!

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读