您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關vue插槽slot怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
前言
Vue的slot插槽,可以從字面意思來了解用途,占用占坑的意思,既然是占坑肯定是先占坑后面有其他具體的內容來替換代替。根據slot的應用場景可以分為匿名slot和具名slot。
一、個人理解及插槽的使用場景
剛開始看教程我的疑惑是為什么要用插槽,它的使用場景是什么,很多解釋都是“父組件向子組件傳遞dom時會用到插槽”,這并不能很好的解決我的疑惑。既然你用了子組件,你為什么要給她傳一些dom,直接去定義復用的子組件不就好了。后來想想覺得一個復用的組件在不同的地方只有些許變化,如果去重寫子組件是很不明智的一件事,當然也可以將不同之處都寫在子組件里,然后通過父組件傳來的標識進行選擇顯示。其實質是對子組件的擴展,通過slot插槽向組件內部指定位置傳遞內容,即將<slot></slot>元素作為承載分發內容的出口;
二、用于理解的例子
目前還沒接觸到使用插槽解決實際問題很好的例子,只能這樣去為了理解插槽而用,可能并沒有很好的利用到插槽的好處。
在父組件定義想要傳入子組件作為插槽的內容,App.vue
<template> <div id="app"> <div> <input type="text" v-model="info"> <button @click="handleClick">添加</button> </div> <todolist v-for="item in list" :key="item" :message="msg"> <template v-slot:item="itemProps" > <!-- tips1:<span>即為插槽內容 tips2:item是插槽的名字,為具名插槽,可對應插入到子組件中具體的插槽位置 tips3:itemProps可以獲取到子組件(即插槽 prop)傳出來的狀態(值), 插槽 prop 的對象命名為 itemProps,可任意命名,itemProps變量存在于 <template> 作用域中 --> <span :>{{item}}</span> </template> </todolist> </div> </template> <script> import todolist from './components/todolist.vue'; export default { name: 'App', components: { todolist }, data(){ return { msg: '4-2-05', info: '', list: [], } }, methods: { handleClick() { // 獲取到input輸入的東西,然后加入到數組中 this.list.push(this.info); this.info = '' } }, } </script> <style> </style>
在子組件利用<slot></slot>元素作為承載分發內容的出口,父組件的插槽內容將在其中顯示,todolist.vue
<template> <div> {{message}} <li class="item"> <input type="checkbox" v-model="checked"> <slot name="item" v-bind="{checked}" ></slot> <!--插槽內容能夠訪問子組件中才有的數據是很有用的,又因為父級模板里的所有內容都是在父級作用域中編譯的;子模板里的所有內容都是在子作用域中編譯的 所以得想辦法獲取到子組件的數據。--> <!--給子組件綁定一個動態參數,checked作為一個 <slot> 元素的特性綁定上去,綁定在 <slot> 元素上的特性被稱為插槽 prop--> </li> </div> </template> <script> export default { props: ['item','message'], // 因為父組件在插槽內容里使用item, 即此句代碼<span>{{item}}</span> // 相當于需要傳遞給子組件的內容,也就是通常的父子組件通信,所以在子組件需要通過props來獲取 data() { return { checked: false, } }, created() { console.log(this.message); } } </script> <style scoped> .item { color: red; } li{ list-style: none; } </style>
三、具體知識點
1、具名插槽
上面的例子只使用了一個slot插槽,但有時我們在一個組件里可能會多處使用插槽,我們希望在不同的插槽處插入不同的內容,此時便需要進行區分,<slot> 元素有一個特殊的特性:name。這個特性可以用來定義插槽的名字,在向具名插槽提供內容的時候,我們可以在一個 <template> 元素上使用
v-slot 指令,并以 v-slot 的參數的形式寫出插槽的名稱,使其一一對應。
<slot name="header"></slot> <slot name="content"></slot> <slot ></slot> //一個不帶 name 的 <slot> 出口會帶有隱含的名字“default”。
2、作用域插槽
為了使父組件的插槽內容可以使用子組件的數據,可以在 <slot> 元素上綁定想要傳遞的數據,此特性被稱為插槽 prop。同時在父級作用域中,給 v-slot 帶一個值來定義我們提供的插槽 prop 的名字,便可獲取到。但此內容只在 <template>作用域內可用。
四、自 2.6.0 起有所更新的語法變化
1、帶有slot特性的具名插槽
2、帶有slot-scope特性的作用域插槽
五、突發奇想的調換
因為看到一個別人寫的關于slot的帖子,他應該是寫錯了插槽在子父組件的內容,這也就相當于從子組件傳一個插槽內容給父組件。仔細想想這思路有問題,既然都引用了子組件,父組件便可以訪問到子組件的所有內容,現在卻非要通過插槽來傳遞,多此一舉。
然后我就試了一下將插槽內容卸載子組件里,果然出現了報錯,如下:
- <template v-slot> can only appear at the root level inside the receiving the component(slot的只能出現在接受組件的根級別)
也就是只能在父組件使用。
感謝各位的閱讀!關于“vue插槽slot怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。