vue2升級vue3:Vue2/3插槽——vue3的jsx組件插槽slot怎么處理

插槽的作用

讓用戶可以拓展組件眷射,去更好地復用組件和對其做定制化處理镇辉。

Vue 實現(xiàn)了一套內(nèi)容分發(fā)的 API词身,將<slot>元素作為承載分發(fā)內(nèi)容的出口厅目,這是vue文檔上的說明。具體來說,slot就是可以讓你在組件內(nèi)添加內(nèi)容的‘空間’损敷。

父組件在引用子組件時希望向子組價傳遞模板內(nèi)容<p>測試一下吧內(nèi)容寫在這里了能否顯示</p>?

子組件讓父組件傳過來的模板內(nèi)容在所在的位置顯示?

子組件中的<slot>就是一個槽葫笼,可以接收父組件傳過來的模板內(nèi)容,<slot> 元素自身將被替換?

<myslot></myslot>組件沒有包含一個 <slot> 元素拗馒,則該組件起始標簽和結(jié)束標簽之間的任何內(nèi)容都會被拋棄

插槽的分類

vue 在 2.6 版本中路星,對插槽使用 v-slot 新語法,取代了舊語法的 slot 和 slot-scope诱桂,并且之后的 Vue 3.0 也會使用新語法洋丐,這并不是僅寫法的不同,還包括了性能的提升

插槽分為普通插槽和作用域插槽挥等,普通插槽為父組件傳遞數(shù)據(jù)/元素/組件給子組件友绝,而子組件定義 <slot> 接收,當插槽有多個的時候肝劲,需要使用具名插槽 <slot name="xxx">迁客,用于將數(shù)據(jù)綁定在指定的插槽

普通插槽

//??父組件

<template?v-slot>

??<p>new?Nian糕</p>

</template>

//?舊語法?只需一行:<p?slot>old?Nian糕</p>

//?子組件

<slot?/>

具名插槽

//?父組件

<template?v-slot:item>

??<p>new?Nian糕</p>

</template>

//?舊語法:<p?slot="item">old?Nian糕</p>

//?子組件

<slot?name="item"?/>

作用域插槽為子組件 <slot> 綁定屬性,傳遞數(shù)據(jù)給父組件辞槐,父組件通過 v-slot:xxx="props" 接收子組件傳遞的屬性

作用域插槽 舊語法

//??父組件

<p?slot="love"?slot-scope="props">愛old?{{?props.name?}}真是太好了</p>

//?子組件

<slot?name="love"?v-bind="{?name?}"?/>

export?default?{

??data()?{

????return?{

??????name:?"Nian糕"

????}

??}

}

作用域插槽 新語法

//??父組件

<template?v-slot:love="props">

??<p>愛new?{{?props.name?}}真是太好了</p>

</template>

//?子組件

<slot?name="love"?v-bind="{?name?}"?/>

export?default?{

??data()?{

????return?{

??????name:?"Nian糕"

????}

??}

}

案例2

//子組件?:?(假設(shè)名為:ebutton)

<template>

????<div?class=?'button'>

????????<button>?test</button>

????????<slot?name=?'one'?:value1='child1'>?這就是默認值1</slot>????//綁定child1的數(shù)據(jù)

????????<slot?:value2='child2'>?這就是默認值2?</slot>??//綁定child2的數(shù)據(jù)掷漱,這里我沒有命名slot

????</div>

</template>

<script>

new?Vue({

??el:'.button',

??data:{

????child1:'數(shù)據(jù)1',

????child2:'數(shù)據(jù)2'

??}

})

</script>

//父組件:(引用子組件?ebutton)

<template>

????<div?class=?'app'>

????????<ebutton>

????????????<template?v-slot:one?=?'slotone'>

????????????????{{?slotone.value1?}}????//?通過v-slot的語法?將子組件的value1值賦值給slotone

????????????</template>

????????????<template?v-slot:default?=?'slottwo'>

????????????????{{?slottwo.value2?}}??//?同上,由于子組件沒有給slot命名催蝗,默認值就為default

????????????</template>

????????</ebutton>

????</div>

</template>

Vue3.0 slot簡寫

<!--?父組件中使用?-->

?<template?v-slot:content="scoped">

???<div?v-for="item?in?scoped.data">{{item}}</div>

</template>

<!--?也可以簡寫成:?-->

<template?#content="{data}">

????<div?v-for="item?in?data">{{item}}</div>

</template>

Vue3.0在JSX/TSX下如何使用插槽(slot)

先看看官方:https://github.com/vuejs/jsx-next/blob/dev/packages/babel-plugin-jsx/README-zh_CN.md#插槽

在 jsx 中切威,應(yīng)該使用 v-slots 代替 v-slot

const?A?=?(props,?{?slots?})?=>?(

??<div>

????<h1>{?slots.default???slots.default()?:?'foo'?}</h1>

????<h2>{?slots.bar?.()?}</h2>

??</div>

);

const?App?=?{

??setup()?{

????const?slots?=?{

??????bar:?()?=>?<span>B</span>,

????};

????return?()?=>?(

??????<A?v-slots={slots}>

????????<div>A</div>

??????</A>

????);

??},

};

//?or

const?App?=?{

??setup()?{

????const?slots?=?{

??????default:?()?=>?<div>A</div>,

??????bar:?()?=>?<span>B</span>,

????};

????return?()?=>?<A?v-slots={slots}?/>;

??},

};

//?or

const?App?=?{

??setup()?{

????return?()?=>?(

??????<>

????????<A>

??????????{{

????????????default:?()?=>?<div>A</div>,

????????????bar:?()?=>?<span>B</span>,

??????????}}

????????</A>

????????<B>{()?=>?"foo"}</B>

??????</>

????);

??},

};

上面代碼來源:Vue3.0在JSX/TSX下如何使用插槽(slot)https://www.cnblogs.com/pinkchampagne/p/14083724.html

關(guān)于jsx的,可以瞅瞅:vue3下jsx教學丙号,保證業(yè)務(wù)上手無問題先朦!https://juejin.cn/post/6911883529098002446

vue3 template與jsx寫法對比

ue template中的slot插槽如何在JSX中實現(xiàn)?和template對比犬缨,更加清晰

template寫法

子組件

<template>

????<div>

????????<span>I'm?Child</span>

????????<slot></slot>

????????<slot?name="header"></slot>

????</div>

</template>

<script>

export?default?{

????name:?"Test"

}

</script>

父組件

<template>

????<TestComponent>

????????<template?#default>

????????????<span>這是默認插槽</span>

????????</template>

????????<template?#header>

????????????<span>這是header插槽</span>

????????</template>

????</TestComponent>

</template>

<script>

import?TestComponent?from?'./TestComponent'

export?default?{

????name:?"Parent",

????components:?{

????????TestComponent

????}

}

</script>

JSX的寫法:

子組件

import?{?defineComponent?}?from?"@vue/runtime-core";

export?default?defineComponent({

????name:?"Test",

????render()?{

????????return?(

????????????<>

????????????????<span>I'm?Child</span>

????????????????{?this.$slots.default?.()?}

????????????????{?this.$slots.header?.()?}

????????????</>

????????)

????}

})

作用域插槽

import?{?defineComponent?}?from?"@vue/runtime-core";

export?default?defineComponent({

????name:?"Test",

????setup()?{

????????return?{

????????????value:?{

????????????????name:?'xzw'

????????????}

????????}

????},

????render()?{

????????return?(

????????????<>

????????????????<span>I'm?Child</span>

????????????????{?this.$slots.content?.(this.value)?}

????????????</>

????????)

????}

})

父組件

import?{?defineComponent?}?from?'vue'

import?TestComponent?from?'./TestComponent'

export?default?defineComponent({

????name:?"Test",

????components:?{

????????TestComponent

????},

????render()?{

????????return?(

????????????<TestComponent?v-slots={{

????????????????default:?()?=>?(

????????????????????<div>這是默認插槽</div>

????????????????),

????????????????header:?()?=>?(

????????????????????<div>這是header插槽</div>

????????????????)

????????????}}>

????????????</TestComponent>

????????)

????}

})

作用域插槽

import?{?defineComponent?}?from?'vue'

import?TestComponent?from?'./TestComponent'

export?default?defineComponent({

????name:?"Test",

????components:?{

????????TestComponent

????},

????render()?{

????????return?(

????????????<TestComponent?v-slots={{

????????????????content:?scope?=>?(?<div>{scope.name}</div>)

????????????}}>

????????????</TestComponent>

????????)

????}

})

參考文章:

Vue3中的 JSX 以及 jsx插槽的使用https://juejin.cn/post/6983130251702304781

Vue3 中插槽(slot)的用法?https://www.cnblogs.com/recode-hyh/p/14544808.html

vue3 學習 之 vue3使用?http://www.reibang.com/p/91328e6934c9

【vue3】 使用JSX實現(xiàn)普通喳魏、具名和作用域插槽?https://blog.csdn.net/qq_24719349/article/details/116724681

轉(zhuǎn)載本站文章《vue2升級vue3:Vue2/3插槽——vue3的jsx組件插槽slot怎么處理》,

請注明出處:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8683.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怀薛,隨后出現(xiàn)的幾起案子刺彩,更是在濱河造成了極大的恐慌,老刑警劉巖枝恋,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创倔,死亡現(xiàn)場離奇詭異,居然都是意外死亡焚碌,警方通過查閱死者的電腦和手機畦攘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十电,“玉大人知押,你說我怎么就攤上這事叹螟。” “怎么了台盯?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵罢绽,是天一觀的道長。 經(jīng)常有香客問我静盅,道長良价,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任温亲,我火速辦了婚禮棚壁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栈虚。我一直安慰自己袖外,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布魂务。 她就那樣靜靜地躺著曼验,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘姜。 梳的紋絲不亂的頭發(fā)上鬓照,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音孤紧,去河邊找鬼豺裆。 笑死,一個胖子當著我的面吹牛号显,可吹牛的內(nèi)容都是我干的臭猜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼押蚤,長吁一口氣:“原來是場噩夢啊……” “哼蔑歌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揽碘,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤次屠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雳刺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫灶,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年掖桦,在試婚紗的時候發(fā)現(xiàn)自己被綠了浑此。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡滞详,死狀恐怖凛俱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情料饥,我是刑警寧澤蒲犬,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站岸啡,受9級特大地震影響原叮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巡蘸,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一奋隶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悦荒,春花似錦唯欣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碰纬,卻和暖如春萍聊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悦析。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工寿桨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强戴。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓亭螟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酌泰。 傳聞我的和親對象是個殘疾皇子媒佣,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容