成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

vue插槽解決什么問題

vue插槽解決的問題:引入的子組件標(biāo)簽中間不允許寫內(nèi)容的。插槽(Slot)是vue為組件的封裝者提供的能力;允許開發(fā)者在封裝組件時,把不確定的、希望由用戶指定的部分定義為插槽;可以把插槽認為是組件封裝期間,為用戶預(yù)留的內(nèi)容的占位符。

vue插槽解決什么問題

本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

什么是插槽?

我們知道,在vue中,引入的子組件標(biāo)簽中間是不允許寫內(nèi)容的。為了解決這個問題,官方引入了插槽(slot)的概念。

插槽,其實就相當(dāng)于占位符。它在組件中給你的HTML模板占了一個位置,讓你來傳入一些東西。插槽又分為匿名插槽具名插槽以及作用域插槽

你可能不太明白,為什么我要給子組件中傳入HTML,而不直接寫在子組件中呢?答案是這樣的。你可以想象一個場景,你有五個頁面,這五個頁面中只有一個區(qū)域的內(nèi)容不一樣,你會怎么去寫這五個頁面呢?復(fù)制粘貼是一種辦法,但在vue中,插槽(slot)是更好的做法。

vue插槽解決什么問題

匿名插槽


匿名插槽,我們又可以叫它單個插槽或者默認插槽。與具名插槽相對,它不需要設(shè)置name屬性。(它隱藏的name屬性為default。)

例子:

文件目錄如下,Home組件是HelloWorld的父組件。

vue插槽解決什么問題

  • 在HelloWorld中寫一個匿名插槽

<template>   <div class="hello">      Helloworld組件       <div class = 'slotTxt'>        <slot></slot>      </div>    </div> </template>  <script> export default {  } </script>  <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="less"> .hello{   width:100%;   height:300px;   background:#ccc;   margin-top:50px;   .slotTxt{     width:500px;     height:200px;     margin:30px auto;     background:red;   } } </style>
登錄后復(fù)制

  • 在Home組件中引入子組件,并在子組件標(biāo)簽中寫入內(nèi)容

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <!-- 沒有插槽,這里的內(nèi)容不顯示 -->       <h1>我是helloworld中的插槽啊</h1>       </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script>
登錄后復(fù)制

效果

vue插槽解決什么問題

不難看出,HelloWorld標(biāo)簽中的內(nèi)容(紅色部分)已經(jīng)顯示出來了。

具名插槽


上面已經(jīng)說過,插槽有一個name屬性。與匿名插槽相對,加了name屬性的匿名插槽就是具名插槽。

  • HelloWorld組件中寫入name屬性分別為left和right的插槽

<template>   <div class="hello">      Helloworld組件       <div class = 'slotLeft'>        <slot name='left'></slot>      </div>       <div class = 'slotRight'>        <slot name='right'></slot>      </div>    </div> </template>  <script> export default {  } </script>  <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="less"> .hello{   width:700px;   height:300px;   background:#ccc;   margin: 0 auto;   margin-top:50px;   .slotLeft{     width:300px;     height:200px;     float:left;     background:red;   }   .slotRight{     width:300px;     height:200px;     float:right;     background:pink;   } } </style>
登錄后復(fù)制

  • Home組件通過在template上寫v-slot:name來使用具名插槽

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template v-slot:left>          <h1>name屬性為left</h1>        </template>       <template v-slot:right>          <h1>name屬性為right</h1>        </template>           </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

注意 v-slot 只能添加在template標(biāo)簽上 (只有一種例外情況)。

  • 效果

vue插槽解決什么問題

  • 例外情況(被廢棄的slot=‘name’)
    帶slot屬性的具名插槽自 2.6.0 起被廢棄,vue3.x被完全廢棄。只有vue3之前的cli可以使用。

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <h1 slot='left'>name屬性為left</h1>         <h1 slot='right'>name屬性為right</h1>       </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

效果同上。

  • 具名插槽的小知識點
    跟 v-on 和 v-bind 一樣,v-slot 也有縮寫,即把參數(shù)之前的所有內(nèi)容 (v-slot:) 替換為字符 #。例如 v-slot:header 可以被重寫為 #header。

作用域插槽


作用域插槽其實就是可以傳遞數(shù)據(jù)的插槽。子組件中的一些數(shù)據(jù)想在父組件中使用,必須通過規(guī)定的方法來傳遞。在官方文檔中提出了一條規(guī)則,**父級模板里的所有內(nèi)容都是在父級作用域中編譯的。子模板里的所有內(nèi)容都是在子作用域中編譯的。**如果你在父組件直接使用子組件中的值,是會報錯的。

匿名插槽的作用域插槽

為了讓 子組件中的數(shù)據(jù) 在父級的插槽內(nèi)容中可用,我們可以將 數(shù)據(jù) 作為 元素的一個特性綁定上去:

語法:v-bind:users="user"
登錄后復(fù)制

  • 子組件HelloWorld代碼

<template>   <div class="hello">      Helloworld組件        <div class='slotLeft'>        <slot v-bind:users="user"></slot>      </div>          </div> </template>  <script> export default {   data(){     return{       user:{         name:'oralinge',         age:18       }     }     } } </script>  <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="less"> .hello{   width:700px;   height:300px;   background:#ccc;   margin: 0 auto;   margin-top:50px;   .slotLeft{     width:300px;     height:200px;     // float:left;     background:red;     margin:20px auto   }   .slotRight{     width:300px;     height:200px;     float:right;     background:pink;   } } </style>
登錄后復(fù)制

綁定在 元素上的特性(v-bind:users=“user”)被稱為插槽 prop。現(xiàn)在在父級作用域中,我們可以使用帶值的 v-slot 來定義我們提供的插槽 prop 的名字。

語法:v-slot:default="隨意取的名字"  // default可省略,簡寫為v-slot="隨意取的名字"
登錄后復(fù)制

  • 父組件Home代碼

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template  v-slot:default="slotProps">          <h1>{{slotProps.users.name}}</h1>        </template>     </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

注意:
父組件中的slotProps可以是隨意取的。
子組件中users是隨意取的,與之對應(yīng)的是父組件中的users。
子組件中的user為數(shù)據(jù)。

效果

vue插槽解決什么問題

具名插槽的作用域插槽

與匿名插槽同理,只需要把default替換成插槽的name值即可。

  • 子組件HelloWorld代碼

<template>   <div class="hello">      Helloworld組件        <div class='slotLeft'>        <slot name='helloWorld' v-bind:users="user"></slot>      </div>          </div> </template>  <script> export default {   data(){     return{       user:{         name:'hello world',         age:18       }     }     } } </script>  <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="less"> .hello{   width:700px;   height:300px;   background:#ccc;   margin: 0 auto;   margin-top:50px;   .slotLeft{     width:300px;     height:200px;     // float:left;     background:red;     margin:20px auto   }   .slotRight{     width:300px;     height:200px;     float:right;     background:pink;   } } </style>
登錄后復(fù)制

  • 父組件Home代碼

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template  v-slot:helloWorld="slotProps">          <h1>{{slotProps.users.name}}</h1>        </template>     </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

效果

vue插槽解決什么問題

注意:
默認插槽的縮寫語法不能和具名插槽混用,因為它會導(dǎo)致作用域不明確。

vue插槽解決什么問題

另,slot-scope寫法在2.6之后已廢棄,作用與上面相同,在此不做解釋。

上面的寫法是不是覺得有些麻煩?別著急,我們來看一看解構(gòu)插槽 Prop

解構(gòu)插槽 Prop

作用域插槽的內(nèi)部工作原理是將你的插槽內(nèi)容包括在一個傳入單個參數(shù)的函數(shù)里:

function (slotProps) {   // 插槽內(nèi)容 }
登錄后復(fù)制

這意味著 v-slot 的值實際上可以是任何能夠作為函數(shù)定義中的參數(shù)的 JavaScript 表達式。所以在支持的環(huán)境下 (單文件組件或現(xiàn)代瀏覽器),你也可以使用 ES2015 解構(gòu)來傳入具體的插槽 prop。

語法:v-slot="{ users }"
登錄后復(fù)制

  • HelloWold組件

<template>   <div class="hello">      Helloworld組件        <div class='slotLeft'>        <slot v-bind:users="user"></slot>      </div>          </div> </template>  <script> export default {   data(){     return{       user:{         name:'hello world',         age:18       }     }     } } </script>  <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="less"> .hello{   width:700px;   height:300px;   background:#ccc;   margin: 0 auto;   margin-top:50px;   .slotLeft{     width:300px;     height:200px;     // float:left;     background:red;     margin:20px auto   }   .slotRight{     width:300px;     height:200px;     float:right;     background:pink;   } } </style>
登錄后復(fù)制

  • Home組件

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template  v-slot="{ users }">          <h1>{{users.name}}</h1>        </template>     </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

  • 效果

vue插槽解決什么問題

  • 重命名—-更改users這個名字

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template  v-slot="{ users:person }">          <h1>{{person.name}}</h1>        </template>     </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

效果如上圖。

  • 定義后備內(nèi)容,用于插槽 prop 是 undefined 的情形
    此處按照官方文檔的寫法會出現(xiàn)語法報錯,后期應(yīng)該會修復(fù)(有知道的麻煩通知一聲)。

<template>   <div class="home">     我是Home父組件     <HelloWorld>       <template >          <h1 v-slot="{ users = { name: '1111' } }">{{users.name}}</h1>        </template>     </HelloWorld>   </div> </template>  <script> import HelloWorld from '@/components/HelloWorld.vue' export default {   name: 'home',   components: {     HelloWorld   } } </script> <style lang="less" scoped> .home{   width:900px;   margin:0 auto;   background:yellow;   padding-bottom:100px; } </style>
登錄后復(fù)制

使用場景


  • 復(fù)用公共組件
    代碼示例如下:

<template>   <div>     <div class="title-box">       <span class="title">{{title}}</span>       <div class="right">         <slot name="right"></slot>       </div>     </div>     <div class="content-box">       <slot></slot>     </div>   </div> </template> <script> export default {   data () {     return {     }   },   props: {     title: {       type: String,       required: true     }   } } </script> <style lang="scss" scoped> .title-box {   padding: 16px 0;   border-bottom: 1px solid #eff1f5;   .title {     font-family: MicrosoftYaHei;     font-size: 24px;     color: #283039;     letter-spacing: 0;     line-height: 24px;     &::before {       width: 4px;       margin-right: 20px;       content: "";       background-color: #5da1ff;       display: inline-block;       height: 20px;       vertical-align: middle;     }   }   .right {     float: right;     margin-right: 20px;   } } </style>
登錄后復(fù)制

使用的ui框架為ivew。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
AV无码爆乳护士在线播放| JAPAN丰满人妻HD| 2021自拍偷在线精品自拍偷| AV无码中文一区二区三区四区| 自拍偷在线精品自拍偷99| 97SE亚洲国产综合自在线不卡 | 精品人妻无码区在线视频| 久久精品国产亚洲AV麻豆长发| 久久精品国产亚洲AV日韩 | 亚洲熟女综合一区二区三区| 在线国内永久免费CRM| www亚洲一级AV仑片| 高潮到不停喷水的免费视频| 国产精品国产高清国产AV| 久99久精品免费视频热| 欧美xxxxx久久短视频| 少妇被粗大的猛烈进出69影院| 玩小雪跪趴把腿分到最大影视频| 亚洲AVTV永久综合在线| 影音先锋成人无码影院| 爱丫爱丫影院电影网| 国产精品毛片无码| 久久天天躁夜夜躁狠狠| 人体欣赏SHOWYBEAUTY| 西西人体艺术摄影| 中国熟妇内谢69XXXXX| 第一次爱的人视频播放完整版 | 亚欧美日乱码视频在线观看 | 色欲丰满熟妇人妻AV无码| 亚洲AV无码成人黄网站在线观看| 亚洲欲色欲色XXXXX在线| WWW夜插内射视频网站| 国产丝袜无码一区二区三区视频| 久久国产精品成人免费| 人妻多毛丰满熟妇av无码| 性色AV一区二区三区天美传媒| 亚洲人成无码网WWW| 锕锕锕锕锕锕~好深啊APP| 国产中年熟女高潮大集合| 女角色翻白眼流口水流眼泪图片 | 方辰苏婉儿是哪本小说的主角| 国产亚洲精品精品国产亚洲综合| 老熟女媾交系列群| 天天躁夜夜躁很很躁| 一面膜上边一面膜下边日本| 丰满熟妇VIDEOSXXXX| 久久精品国产导航| 日日摸夜夜添夜夜添无| 亚洲色欲综合天堂亚洲| 成人性欧美丨区二区三区| 久久精品国产亚洲AV成人| 日韩精品无码人成视频手机| 亚洲乱码在线卡一卡二卡新区| AV免费啪啪永久| 国内精品乱码卡一卡2卡三卡新区| 男男GAY无套国产| 亚洲AV无码潮喷在线观看蜜桃| 18禁美女黄网站色大片在线| 国产乱子影视频上线免费观看| 男男黄Gay片免费网站www| 亚洲AVT无码天堂网| 波多野结衣与黑人AV| 久久久久久久精品成人热蜜桃| 日本久久久久精品免费网播放| 亚洲国产精品无码中文在线| 俄罗斯老少配BBW| 免费 成 人 黄 色 网站69| 香港三级日本三级A视频| BBBBB毛茸茸BBBBBBB| 九九九精品成人免费视频7| 天堂AV无码大芭蕉伊人AV| 2020久久国产综合精品SWA| 黑人VIDEODESEXO极品| 色婷婷综合久久久久中文字幕| 野外做受又硬又粗又大视频√| 高雅人妻被迫沦为玩物| 男女猛烈激情XX00免费视频| 亚洲国产精品无码第一区二区三区 | 绿帽娇妻在卧室疯狂的呻吟 | 女人三A级毛片视频| 亚洲精品成A人在线观看| 高潮颤抖大叫正在线播放| 欧美人妻少妇精品视频专区 | 亚洲精品久久久久无码AV片软件 | 国产精品自在线拍国产电影| 女子遭遇疯狂侵犯| 亚洲色WWW永久网站| 国产精品美女一区二区视频| 人人妻人人玩人人澡人人爽 | 国产精品久久国产三级国| 精品无码人妻一区二区三区品| 日韩加勒比一本无码精品| 97久久精品人妻人人搡人人玩 | 无码AV免费一区二区三区| А√天堂中文在线资源BT在线| 久久精品亚洲综合专区| 亚洲AV日韩AV高潮喷潮无码天 | 人妻中文字幕乱人伦在线| 2021国内精品久久久久免费| 久久精品国产大片免费观看| 亚洲AV综合A∨一区二区| 国产精品午夜小视频观看| 色嗨嗨AV一区二区三区| 爸的比老公大两倍儿媳妇怎么称呼 | 男人把大JI巴放进女人有视频| 亚洲AV无码AV日韩AV网站| 国产精品99久久精品| 少妇人妻无码精品视频APP| 不充钱看全部超污视频| 欧美日韩在大午夜爽爽影院| 97在线 | 亚洲| 牛和人交VIDE欧关ⅩXOO| 有码中文AV无码中文AV| 久久久久久久人妻无码中文字幕爆| 亚洲AⅤ永久无码精品毛片| 国产精品毛片无遮挡高清| 天天天天躁天天爱天天碰2018| おとまりせくす中文在线| 欧美人与性口牲恔配视频| 91人妻人人爽人人澡人人精品 | 亚洲日韩乱码1区二区| 精品国产AⅤ无码一区二区蜜桃| 羞羞影院午夜男女爽爽免费视频| 国产成人精品午夜福利在线观看 | 妺妺窝人体色WWW在线下载| 在线观看草莓视频MV的免费网站| 久久精品无码一区二区小草 | 肉体粗喘娇吟国产AV精品| 大屁股熟女白浆一区二区| 色欲狠狠躁天天躁无码中文字幕 | AAAAA级大公开超高准确率| 女人被第一次18毛片| 97人人模人人爽人人少妇| 欧美人与性囗牲恔配| 宝宝握住坐下~它会自己动| 日韩精品免费一线在线观看| 高清国语自产拍免费视频| 天天爱天天做天天爽| 国产免费不卡午夜福利在线| 亚洲 精品 制服 校园 无码| 国产综合亚洲专区在线| 亚洲人成网站18禁止影院| 久久夜色精品国产噜噜噜亚洲AV| 一个上面一个下面嘴巴| 末发育女AV片一区二区| WWWらだ天堂中文在线| 日韩免费无码专区精品观看 | 日产精品久久久久久久性色| 高清VPSWINDOWS另类乱| 无码人妻少妇伦在线电影 | 丰满岳乱妇三级高清| 无码A∨高潮抽搐流白浆8MAV| 国产精品视频一区二区噜噜| 亚洲AV永久无码天堂网| 久久久久人妻一区二区三区| 24种男女插秧法| 日产无码精品一区二区三区| 国产精品久久久亚洲| 亚洲精品AⅤ无码精品| 老外免费CSGO交易网站下载| chineSe老女人老熟妇hd| 三人一起玩弄娇妻高潮| 国产人与Z0XXⅩⅩ另类| 亚洲色婷婷综合开心网| 欧美xxxxx久久短视频| 高清欧美性猛XXXX黑人| 亚洲AV午夜成人片动漫番| 乱码视频午夜在线观看| 被客人玩得站不起来大前端| 无人区一码卡二卡三乱码 | 揄拍成人国产精品视频| 欧美性受XXXX人人本视频| 国产SUV精品一区二区6| 亚洲国产区男人本色| 嫩草院一区二区乱码| 公车上双乳被老汉揉搓玩弄漫画| 亚洲AV片不卡无码久久| 蜜臀AⅤ永久无码一区二区| 吃奶呻吟打开双腿做受在线视频| 无码热综合无码色综合| 久久人妻无码一区二区| 超碰97人人做人人爱少妇| 亚洲AV无码片在线观看| 内射老妇女BBWXOGOD| 国产GV无码永久精品同性男男| 亚洲xxx色色精选| 欧美 日韩 国产 成人 在线观| 成人免费一区二区三区视频| 亚洲AV综合色区| 欧美熟女一区二区三区| 国产色欲色欲色欲.WWW| √天堂资源中文WWW| 天天摸夜夜添夜夜无码| 久久久久久精品免费看SSS | 亚洲一线产区二线产区区别在哪里| 欧美成人精品在线观看| 国产日韩精品SUV| 99无人区卡一卡二卡三乱码| 小SB是不是想被C了| 欧美人伦禁忌DVD放荡欲情|