disabling attribute inheritance

欢迎来到我的博客

你好!我叫Joy,很高兴您来到这里,这是我第一个博客的第一篇内容,以后将会更多。我学习js再到vue,都是自学的过程,在这个过程中我经常会遇到各种问题,我猜想你们也在经历这些,希望您能在这里有所收获。如果发现问题或者您有什么建议,都可以给我留言,enjoy yourself!

前序

只所以会写这个博客,是因为在学习这块内容的时候对官方例子很疑惑,经过研究之后,才搞明白$attrs和inheirtAttrs的使用。个人觉得这块内容可以让component使用父级的props更加方便,所以在这里做一个学习笔记。

disabling attribute inheritance的官方例子解析

<base-input v-model='username' required placeholder='Enter your username'></base-input>
Vue.component('base-input',{
	inheritAttrs : false,
	props : ['label','value'],
	template:`
		<label>
		{{ label }}
		<input v-bind='$attrs' v-bind:value='value' v-on:input='$emit('input',$event.target.value)'>
		</label>
		`
})

以上代码在google chrome里显示如下:
在这里插入图片描述
$attrs的作用是从父级那里继承除了class 和 style和props里属性之外的attributes。attributes指的是v-bind:value之类的,但是不涵盖v-bind:class和v-bind:style.也不包含 类似v-on:input,v-on:这一系列,以上例子就是继承了required和placeholder='Enter your username’这两个特性。v-model 等同于 v-bind:value and v-on:input 所以都会继承value属性。

<base-input v-bind:value='username' v-on:input='myInput' required placeholder='Enter your username'></base-input>
Vue.component('base-input',{
	props : ['label'],
	template:`
		<label>
		<input v-bind='$attrs' v-on:input='$emit('input',$event.target.value)'>
		<button v-bind='$attrs'>submit</button>
		<div v-bind='$attrs'></div>
		</label>
		`
})
new Vue({
	el : '.app',
	data : {
		username : ''
		},
	methods : {
		myInput : function (){
			this.username=event.target.value
		}
	}
})

在这里插入图片描述
当我在input框里面输入‘nihao’时,value随之变为nihao,这样就把父级的value属性继承了。但是,input与其它元素不同,虽然input并不显示value属性,但是,这个元素里面存在value属性,而作为对比的button和div都直接显示有value属性。
inheritAttrs功能比较简单,就是将其在元素上的属性进行隐藏。

Vue.component('base-input',{
       inheritAttrs : false,
        props : ['label'],
        template : `
            <label>
                <input v-bind='$attrs' @input='$emit("input",$event.target.value)'>
                <button v-bind='$attrs'>submit</button>
                <div v-bind='$attrs'></div>
            </label>
        `
    })

在这里插入图片描述
原本label上面的一系列属性进行隐藏,目的就是让代码看上去更干净。
再拓展:

 <div class='app'>
      <father-blog :name='myName' :lastName='myLastName' :age='40' :sex='mySex'></father-blog>
 </div>
new Vue({
       el : '.app',
       data : {
           myName : 'xiang',
           myLastName : 'wang',
           mySex : 'man'
      },
       components : {
           'father-blog' : {
               props : ['age','name','sex'],
               template : `
                   <div>
                       <child-blog v-bind='$attrs' :sex='sex'></child-blog>
                   </div>
               `,
               components : {
                   'child-blog' : {
                       template : `
                           <div class='child'></div>
                       `
                   }
               }
           }
       }
   })

在这里插入图片描述
若在father的component里面有props : [‘age’,‘name’,‘sex’],那么template里面的child-blog组件使用v-bind='$attrs'就不会继承全部的属性,之前说过,会剔除props里面的属性,以及class和style属性,所以这里只显示为lastname属性。
例如想在child-blog组件里继承props已有的属性sex,则需要<child-blog v-bind='$attrs' :sex='sex'>进行重新绑定.
另外需要注意的就是,vue里面对字母大小写不敏感,所以在创建组件名字的时候,不建议使用大头峰拼写,而使用-来连接,child-blog来替代 childBlog.且在该例子中,我使用:lastName ,但HTML显示为lastname,而且在vue底层也只有lastname,没有lastName。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值