【轉(zhuǎn)發(fā)】具名插槽簡寫和作用域插槽

10. [組件]具名插槽簡寫和作用域插槽

在父模板中確定插槽位置時菱涤,使用了v-slot:one這種方法旨袒,其實這個語法可以簡寫成#one撒璧。這時候的代碼就變成了下面的樣子喳张。

const app = Vue.createApp({
    template: ` 
    <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>
    <hong-lang-man>
        <template v-slot:one><div>1.女賓一位,請上三樓岂丘。</div></template>
        <template v-slot:two><div>3.顧客選擇了全身SPA陵究。</div></template>
    </hong-lang-man>
`
})

修改后,可以打開瀏覽器元潘,進行預(yù)覽畔乙,發(fā)現(xiàn)也可以出現(xiàn)正確的結(jié)果君仆。學(xué)完具名插槽的簡寫方法后翩概,就可以學(xué)習(xí)這節(jié)的重點了作用域插槽。

作用域插槽-基礎(chǔ)代碼準(zhǔn)備

其實作用域插槽主要解決的問題是返咱,子組件中有插槽钥庇,也有變量,這些變量如何在父組件中進行使用咖摹。先來看這樣一個需求:編寫一個子組件评姨,里邊有大腳、劉英和曉紅三個名字變量,然后在子組件中用循環(huán)的形式輸出出來吐句。

在學(xué)習(xí)作用域插槽前胁后,我們先來完成這個基本需求,復(fù)制Demo9的代碼到Demo10.html頁面中嗦枢,然后留下最基礎(chǔ)的代碼攀芯。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demo10</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.0.2/vue.global.js"></script>
</head>

<body>
    <div id="app"></div>
</body>
<script>
    const app = Vue.createApp({
        template: `  <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>`
    })

    const vm = app.mount("#app")
</script>

上邊就是最基礎(chǔ)的Vue3代碼,不作過多解釋文虏,你可以直接復(fù)制這段代碼侣诺,開始你的學(xué)習(xí)。接下來我們要寫一個子組件氧秘,滿足剛才說的需求年鸳。

<script>
    const app = Vue.createApp({
        template: `  
            <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>
            <list />
        `
    })
    app.component('List', {
        data() {
            return {
                list: ['大腳', '劉英', '曉紅']
            }
        },
        template: `
            <div>
                <div v-for="item in list">{{item}}</div>    
            </div>
        `
    })

    const vm = app.mount("#app")
</script>

上面的代碼,編寫了一個子組件list丸相,然后在list組件里搔确,聲明了一個list的數(shù)組數(shù)據(jù)項。數(shù)據(jù)項里有三個值大腳已添、劉英曉紅妥箕。在模板中試用v-for的形式,進行循環(huán)更舞。

寫完這段代碼后畦幢,可以到瀏覽器里調(diào)試一下,看看可以正常運行嗎缆蝉?如果一切正常宇葱,應(yīng)該在頁面上顯示出循環(huán)的值了。

作用域插槽-具體講解

有了基礎(chǔ)代碼刊头,就可以學(xué)習(xí)作用域插槽的內(nèi)容了黍瞧。目前子組件里循環(huán)使用的是<div>標(biāo)簽,現(xiàn)在要求這個標(biāo)簽是父組件調(diào)用時確定原杂,也就是要使用插槽了印颤。(需要說明,這種情況在你寫組件時穿肄,經(jīng)常遇到年局,所以你要足夠的重視)。

我們剛開始的想法咸产,可以是先改造子組件矢否,增加slot插槽,增加插槽后的模板代碼如下脑溢。

template: `
    <div>
        <slot v-for="item in list"  />    
    </div>
`

然后在父組件里進行調(diào)用僵朗,調(diào)用方法如下。

const app = Vue.createApp({
    template: `  
        <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>
        <list> <span></span> </list>
    `
})

這時候在瀏覽器中查看,打開控制臺验庙,可以看到DOM中顶吮,是有三個<span>標(biāo)簽的。說明DOM通過插槽的形式粪薛,傳遞過來了云矫。那接下來的問題,就是父組件如何使用子組件中的變量汗菜。

父組件想使用子組件插槽中的值让禀,可以使用:綁定的形式進行傳遞,比如寫成:item="item"陨界,具體的代碼可以寫成下面的樣子巡揍。

app.component('List', {
    data() {
        return {
            list: ['大腳', '劉英', '曉紅']
        }
    },
    template: `
        <div>
            <slot v-for="item in list" :item="item" />    
        </div>
    `

寫完后父組件中用v-slot="xxx"的形式接受,接收后就可以使用了菌瘪。

const app = Vue.createApp({
    template: `  
    <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>
    <list v-slot="props"> 
        <span>{{props.item}}</span> 
    </list>
`
})

這時候你會發(fā)現(xiàn)列表是可以正常顯示的腮敌,也可以進行更換標(biāo)簽了,你可以試著把<span>標(biāo)簽換成<div>標(biāo)簽來嘗試一下俏扩。

注意這里的props是子組件傳遞過來的數(shù)據(jù)都是對象糜工,所以我們要加上.item才能使用÷嫉可以把代碼修改一下捌木。

<list v-slot="props">
    <div>{{props.item}}-{{props}}</div> 
</list>

輸出結(jié)果如下

大腳-{ "item": "大腳" }
劉英-{ "item": "劉英" }
曉紅-{ "item": "曉紅" }

簡化作用域插槽寫法

其實簡化的方法也非常簡單,只要使用解構(gòu)的形式嫉戚,這是ES6的一種寫法刨裆。如果對這部分,不熟悉彬檀,可以看看ES6關(guān)于解構(gòu)的語法知識帆啃。

const app = Vue.createApp({
    template: `  
        <h2>歡迎光臨紅浪漫-請選擇您的技師</h2>
        <list v-slot="{item}"> 
            <div>{{item}}</div> 
        </list>
        `
})

這種寫法雖然簡單,但是理解起來還是有些麻煩的窍帝。

總結(jié)一下:這節(jié)課我們主要學(xué)習(xí)了二個知識努潘,一個是具名插槽的簡寫方法,第二個是作用域插槽的使用和簡寫方法坤学。重點是作用域插槽疯坤,也正是因為有了作用域插槽,子組件才可以傳遞自身的數(shù)據(jù)項讓父組件進行使用拥峦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贴膘,一起剝皮案震驚了整個濱河市卖子,隨后出現(xiàn)的幾起案子略号,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄柠,死亡現(xiàn)場離奇詭異突梦,居然都是意外死亡,警方通過查閱死者的電腦和手機羽利,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門宫患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人这弧,你說我怎么就攤上這事娃闲。” “怎么了匾浪?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵皇帮,是天一觀的道長。 經(jīng)常有香客問我蛋辈,道長属拾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任冷溶,我火速辦了婚禮渐白,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逞频。我一直安慰自己纯衍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布苗胀。 她就那樣靜靜地躺著托酸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒巫。 梳的紋絲不亂的頭發(fā)上励堡,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音堡掏,去河邊找鬼应结。 笑死,一個胖子當(dāng)著我的面吹牛泉唁,可吹牛的內(nèi)容都是我干的鹅龄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼亭畜,長吁一口氣:“原來是場噩夢啊……” “哼扮休!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤炊汤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畦贸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體八堡,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡樟凄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兄渺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝龄。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挂谍,靈堂內(nèi)的尸體忽然破棺而出叔壤,到底是詐尸還是另有隱情,我是刑警寧澤口叙,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布百新,位于F島的核電站,受9級特大地震影響庐扫,放射性物質(zhì)發(fā)生泄漏饭望。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一形庭、第九天 我趴在偏房一處隱蔽的房頂上張望铅辞。 院中可真熱鬧,春花似錦萨醒、人聲如沸斟珊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囤踩。三九已至,卻和暖如春晓褪,著一層夾襖步出監(jiān)牢的瞬間堵漱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工涣仿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勤庐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓好港,卻偏偏與公主長得像愉镰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钧汹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353