Vue中的$attrs和$listener的使用

                                                                <span style="font-size:14px; text-align:center;">关注“</span><span style="font-size:14px; font-weight:bolder; text-align:right;">青年码农</span><span style="font-size:14px; text-align:center;">”</span><p><span style="font-size:14px">回复“</span><span style="font-size:14px;font-weight:bolder">特效源码</span><span style="font-size:14px">”可获取各种资料</span></p><blockquote><p>前面讲了关于vue组件间数据传递,如果没有看过,关注公众号,有历史推荐,讲的比较详细,有代码,新手也能看懂,今天说一说$attrs和$listener。</p></blockquote><p><span style="font-size:15px">疫情之前,在家关了这么久,也没怎么更新,最近在看大佬的项目,学习下新的思路。</span><span style="font-size:15px">之前项目上,父子组件传递数据,都是用props去接收和</span><span style="font-size:15px">this.$emit触发父组件方法。这</span><span style="font-size:15px">次我们用$attrs和$listener,都是在2.4.0新增。</span></p><p><span style="font-size:16px"><strong>$attrs</strong></span><span style="font-size:15px"/></p><p><span style="font-size:15px">官方解释:包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。</span></p><p><span style="font-size:15px">通俗易懂的说就是用$attrs可以获取父组件传递过来的所有属性,不包含class,style和props中接收的。比如父组件:</span></p>// father组件<br/><span style="font-size:inherit">&lt;<span style="font-size:inherit">template</span>></span><br/>  <span style="font-size:inherit">&lt;<span style="font-size:inherit">div</span> <span style="font-size:inherit">id</span>=<span style="font-size:inherit">"father"</span>></span><br/>    <span style="font-size:inherit">&lt;<span style="font-size:inherit">child</span> <span style="font-size:inherit">prem</span>=<span style="font-size:inherit">"参数"</span> @<span style="font-size:inherit">focus</span>=<span style="font-size:inherit">"fatherFn"</span>></span><br/>    <span style="font-size:inherit">&lt;/<span style="font-size:inherit">child</span>></span><br/>  <span style="font-size:inherit">&lt;/<span style="font-size:inherit">div</span>></span><br/><span style="font-size:inherit">&lt;/<span style="font-size:inherit">template</span>></span><br/><p><span style="font-size:15px">子组件我们还是用porps接收,代码就不贴了,如果子组件中又引用了其他组件,那我们常规做法是子组件中在通过设置属性再传递到孙子组件,或者用vuex,现在我们可以使用<span style="font-size:15px">$attrs</span></span><br/></p>// child组件<br/><span style="font-size:inherit">&lt;<span style="font-size:inherit">template</span>></span><br/>  <span style="font-size:inherit">&lt;<span style="font-size:inherit">div</span> <span style="font-size:inherit">id</span>=<span style="font-size:inherit">"child"</span>></span><br/>    <span style="font-size:inherit">&lt;<span style="font-size:inherit">son</span> <span style="font-size:inherit">v-bind</span>=<span style="font-size:inherit">"$attrs"</span> <span style="font-size:inherit">v-on</span>=<span style="font-size:inherit">"$listener"</span>></span><span style="font-size:inherit">&lt;/<span style="font-size:inherit">son</span>></span><br/>  <span style="font-size:inherit">&lt;/<span style="font-size:inherit">div</span>></span><br/><span style="font-size:inherit">&lt;/<span style="font-size:inherit">template</span>></span><br/><p><span style="font-size:15px">在son组件中,可以直接使用</span><br/></p><span style="font-size:inherit">// son组件</span><br/>{{ $attrs.prem }}<br/><p><span style="font-size:15px"/><span style="font-size:15px">或者用props接收</span></p><span style="font-size:inherit">props</span>: {<br/>  <span style="font-size:inherit">prem</span>:{<br/>    type:String,<br/>    default:<span style="font-size:inherit">"默认值"</span><br/>  }<br/>}<span style="font-size:15px"/><p><span style="font-size:15px">使用<span style="font-size:15px">$attrs的好处是:</span><br/></span></p><ol><li><p><span style="font-size:15px">在子组件中不用再通过props来接收来自父组件的信息</span></p></li><li><p><span style="font-size:15px"><span style="font-size:15px">在子组件中调用</span><span style="font-size:15px">孙子组件,绑定$attrs,</span>孙子组件就可以直接接收父组件的内容</span></p></li><li><p><span style="font-size:15px">多层传递省时省力</span></p></li></ol><p><span style="font-size:16px"><strong>$listener</strong></span></p><p><span style="font-size:15px">官方解释:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。</span></p><p><span style="font-size:15px">$listeners,它是一个对象,里面包含了作用在这个组件上的所有监听器。</span></p><p><span style="font-size:15px">子组件打印<br/></span></p><span style="font-size:inherit">console</span>.log(<span style="font-size:inherit">this</span>.$listeners)<br/><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/8877503-6f670ac7d31c2ed4.jpeg" img-data="{&quot;format&quot;:&quot;jpeg&quot;,&quot;size&quot;:3594,&quot;height&quot;:96,&quot;width&quot;:465}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/><br/></div><p><span style="font-size:15px"><span style="font-size:15px">可以用对象解构<br/></span></span></p><span style="font-size:inherit">const</span> { <span style="font-size:inherit">focus</span> } = this.<span style="font-size:inherit">$listeners</span>;<br/><p><span style="font-size:15px"><span style="font-size:15px"><span style="font-size:15px">$listeners</span>的作用很明显,就是在高层组件像低层组件传参(上面讲到的<span style="font-size:15px">$attrs</span>),或者其他方式,那低层组件如何向高层组件传递数据呢,用<span style="font-size:15px">$listeners</span>即可。解构后,和调用正常函数一样。</span></span><br/></p>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容