成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
小烂货夹得好紧太爽了H苏妖精| 无码毛片内射白浆视频| 双腿吊起揉捏花蒂| 性欧美VIDEO高清| 亚洲欧洲无码精品ⅤA| 伊伊人成亚洲综合人网香| 中文字幕无码一区二区免费| CHINESE国产老熟女| 超碰97人人做人人爱综合 | 人妻少妇乱子伦精品无码专区电影| 欧洲一卡2卡三卡4卡 乱码| 少妇人妻AV无码专区| 亚洲AV无码国产精品色午夜软件| 亚洲超碰无码色中文字幕97| 永久939W79W99W乳液| 啊哈~给我~啊(H)| 国产精品国产三级国产AV麻豆| 狠狠躁夜夜躁人人爽天天BL| 久久中文字幕人妻熟AV女| 人摸人人人澡人人超碰| 无码中文字幕AV免费放DVD| 亚洲日韩精品欧美一区二区| 99精产国品一二产区在线| 隔壁邻居是巨爆乳寡妇| 精品国产AV无码专区亚洲AV| 男人又粗又黑又硬的东西| 少妇性生生活视频在线观看| 亚洲国产精品久久久久爰色欲| 中文亚洲AV片在线观看不卡| 国产精品揄拍100视频| 豪妇荡乳1一5潘金莲2在线| 美女扒开屁股让男人桶GIF动态| 日本熟妇色XXXXX| 亚洲成A人一区二区三区| 97人人超碰国产精品最新o| 国产成人精品无码一区二区老年人 | 国产99久久久国产精品~~牛| 黑人巨茎迎战白嫩少妇| 欧美日韩在线视频一区二区| 五月激情婷婷丁香综合基地| 再深点灬舒服灬太大了添A| 车子一晃一晃的就C进去了肉| 好男人好资源在线观看免费视频| 女人18毛片水真多免费看| 色综合天天综合欧美综合| 亚洲中文字幕无码中文字| 成 人片 黄 色 大 片| 狠狠躁夜夜躁青青草原| 人妻少妇一区二区| 亚洲精品AⅤ中文字幕乱码| 办公室的秘密2中文字幕| 国色天香一卡2卡三卡4卡乱码| 欧美群交在线播放1| 亚洲AV日韩AV无码AV一区二| JAPANESE熟女熟妇| 饥渴人妻欲求不满在线| 日本真人无遮挡啪啪免费| 亚洲熟妇另类久久久久久| 抖抈短视频APP免费下载| 久久中文字幕人妻熟AV女 | 无码中文字幕AV免费放| 我的妺妺H伦浴室无码视频| 40岁的寡妇下面紧不紧| 国产午夜激无码AV毛片| 欧美一级 片内射黑人| 亚洲色大成网站WWW在线| 够了够了到高C了| 免费中国帅气体育生GARY| 亚洲AV无码专区在线电影天堂 | 亚洲女毛多水多21P| 丁香五月缴情网站| 免费国内接码在线接收| 亚洲AV无码日韩精品影片| 纯爱无遮挡H肉动漫| 蜜桃av中文字幕| 亚洲AV无码成H人动漫网站| 被揉到高潮揉出水视频| 老太奶性BBWBBWBBW| 亚洲AV成人片色在线观看www| 波多野成人无码精品电影| 久久午夜夜伦鲁鲁片免费无码影院 | 免费视频玩乳吃奶不遮挡网站| 亚洲AV成人影视在线观看| 成人乱码一区二区三区四区| 乱中年女人伦AV二区| 亚洲成A人片77777国产| 国产传媒精品1区2区3区| 秋霞免费理论片在线观看| 一本一道波多野毛片结衣AV黑人| 国产免费看MV大片的软件| 日韩人妻无码一区二区三区久久| √BT天堂网WWW中文在线| 精品久久久久久亚洲综合网 | 国产精品亚洲А∨无码播放不卡 | 亚洲中文字幕精品久久| 国产特级毛片AAAAAA高潮流| 日本AⅤ精品一区二区三区久久 | 欧美乱强伦XXXXX高潮| 亚洲综合欧美色五月俺也去| 国产亚洲午夜高清国产拍精品| 少妇夜夜爽夜夜春夜夜高潮| СЕКС日本ВИДЕ视频| 蜜桃亚洲AV无码一区二区三区| 亚洲精品无码专区久久同性男| 国产喷水1区2区3区咪咪爱AV| 日日狠狠久久偷偷四色综合免费| JAPAN丰满少妇VIDEOS| 免费男人下部进女人下部视频| 亚洲综合另类小说色区色噜噜| 精品国产一区二区三区无码| 亚洲AV成人无码精品久久漂雪 | CHRISTMAS农村夫妻HO| 免费播放片Ⅴ免费人成视频| 永久免费啪啪的网站入口| 久久精品国产亚洲AV麻豆| 亚洲国产午夜精品理论片妓女| 国内精品久久久久久中文字幕| 无码中文字幕AⅤ精品影院| 国产精品国产免费无码专区蜜桃| 视频二区精品中文字幕| 俄罗斯6一12泑女精品| 日欧 片内射AV在线影院| 餐桌下他深深顶撞H| 人人澡人人妻人人爽人人蜜桃| YYYY1111少妇影院在线观| 欧洲亚洲日韩性无码专区| 99久久国语露脸精品国产色| 男男车车的车车网站W98免费| 性欧美亚洲XXXX乳在线观看| 免费少妇A级毛片人成网| 最新无码国产在线视频2021| 免费国产VA在线观看中文字| 中文字幕一区日韩精品| 女儿的朋友7中汉字晋通话| 99久热RE在线精品视频| 欧美猛少妇性ⅩXXX| 把腿张开老子臊烂你在线观看| 日本老熟妇MATUREBBW| 丰满人妻AV无码一区二区三区| 特区爱奴在线观看| 国产精品普通话国语对白露脸| 午夜福利国产成人无码GIF动图| 国产在线拍偷自揄拍无码| 亚洲CHINESE男同志GAY| 久草玖玖玖爱在线资源| 又大又硬又粗再深一点| 欧美丰满熟妇性XXXX偷拍偷拍| 锕锕锕锕锕锕~好深啊电影APP | 中文字幕无码视频手机免费看| 哦┅┅快┅┅用力啊┅┅在线观看| 99热成人精品热久久6| 日本老妇XXXXX免费| 国产成人无码AV片在线观看不卡| 午夜理论电影在线观看亚洲 | 影音先锋亚洲亚洲色图| 欧美大胆老熟妇乱子伦视频| 宝贝腿开大点我添添公视频免| 熟妇av一区二区| 国产综合久久亚洲综合| 一边做饭一边躁狂怎么办呢69| 欧产日产国产精品精品| 粉嫩小泬无遮挡久久久久久小说| 无遮挡又色又刺激的视频黄| 精品无人区一区二区三区在线| 中国极品少妇XXXXX| 日本乱人伦AⅤ精品潮喷| 国产精品日韩专区第一页| 亚洲欧美一区二区三区| 免费无码又爽又刺激毛片| 成人国产精品秘片多多| 亚洲 暴爽 AV人人爽日日碰| 久久亚洲色WWW成人欧美| 办公室少妇愉情理伦片| 无码久久精品国产亚洲AV影片| 精品一区二区三区在线观看| 97精品伊人久久大香线蕉APP| 十八禁午夜私人在线观看影院 | 亚洲欧美综合精品AⅤ一区二区 | 蜜臀AV午夜福利一区二区三区| 成熟交BGMBGMBGM| 亚洲国产精品成人网址天堂| 男男黄Gay片免费网站www| 国产成人AⅤ片在线观看| 亚洲色精品一区二区三AI女星| 欧美丰满少妇内射XXXX免费| 国产成人无码区免费内射一片色欲| 亚洲日韩AV无码中文| 秋霞手机在线看秋免费| 国产尤物亚洲精品不卡| 中文字幕无码免费久久| 我的初苞被强开了| 久久伊人精品青青草原APP| 成人综合激情另类小说| 亚洲精品无码不卡在线播HE| 人妻精品丝袜一区二区无码AV| 国内精品伊人久久久久AV影院| ASIAN高潮.颤抖.抽搐BL| 亚洲 欧洲 日韩 综合 第一页| 欧美AⅤ精品一区二区三区| 国产无人区码SUV|