您好,登錄后才能下訂單哦!
這篇文章主要介紹“vue組件化中slot如何用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“vue組件化中slot如何用”文章能幫助大家解決問題。
前言
slot可以在子組件中開啟插槽,在父組件引用該組建時,可以定義這個插槽內要展現的功能或模塊。
1.單個slot
子組件中在相應位置寫slot標簽,父組件在引用子組件時,在子組件標簽內寫要插入插槽的元素;
還可以設置slot在父組件沒有設置插槽時,子組件的插槽默認顯示內容;
父組件.vue
<template> <div class="home"> <child-componment> <p> 這是父組件的slot替代內容! </p> </child-componment> </div> </template> <script> import childComponment from '@/components/childComponment.vue' export default { name: "home", components:{ childComponment }, data(){ return { message: '' } } }; </script>
子組件childComponment.vue
<template> <div class="childComponment"> <h3>這是子組件childComponment!</h3> <slot> <span >如果父組件沒有插入內容,我這樣可以設置默認的顯示內容</span> </slot> </div> </template> <script> export default { name: "childComponment", data(){ return { message: '' } } }; </script>
2.具名slot(同時使用多個插槽)
給slot指定一個名稱,可以分發多個slot插槽,但是只能有一個無名slot;
父組件的slot插槽內容,不寫slot="xxx"的都會插到子組件的無名slot中;
如果沒有指定無名slot(默認slot),父組件內多余的內容將會被拋棄。
<template> <div class="home"> <child-componment> <h2 slot="header"> 父組件的header </h2> <h7 slot="footer">父組件的footer</h7> <h7>父組件的無名slot-1</h7> <p> 父組件的無名slot-2 </p> </child-componment> </div> </template> <script> import childComponment from '@/components/childComponment.vue' export default { name: "home", components:{ childComponment }, data(){ return { message: '' } } }; </script>
子組件
<template> <div class="childComponment"> <span>這是子組件childComponment的正常內容!</span> <div class="header"> <slot name="header"> <span >子組件默認header-slot</span> </slot> </div> <div class="container"> <!-- 如果沒有指定無名slot(默認slot),父組件內多余的內容將會被拋棄 --> <slot> <span >子組件默認無名slot</span> </slot> </div> <div class="footer"> <slot name="footer"> <span >子組件默認footer-slot</span> </slot> </div> </div> </template> <script> export default { name: "childComponment", data(){ return { message: '' } } }; </script> <style scoped> .childComponment{ font-size: 16px; } .header{ height: 100px; border:1px solid red; color: red; } .container{ height: 500px; border: 1px solid black; color: black; } .footer{ height:100px; border: 1px grey solid; color: grey; } </style>
3.作用域插槽
<template> <div class="home"> <child-componment> <template slot-scope="slotProps"> <!-- 這里顯示子組件傳來的數據 --> <p>{{slotProps}}</p> </template> </child-componment> </div> </template> <script> import childComponment from '@/components/childComponment.vue' export default { name: "home", components:{ childComponment } }; </script>
子組件
<template> <div class="childComponment"> <span>這是子組件childComponment的正常內容!</span> <div class="container"> <!-- 如果沒有指定無名slot(默認slot),父組件內多余的內容將會被拋棄 --> <slot msg="子組件信息" slotData="子組件數據"></slot> </div> </div> </template>
Tips:
作用于插槽也可是具名插槽
案例:列表組件
這是作用于插槽使用最多的案例,允許組件自定義應該如何渲染組件的每一項。
<template> <div class="about"> <h2>This is about page</h2> <my-list :books="books"> <template slot="bookList" slot-scope="myListProps"> <li>{{myListProps.bookName}}</li> </template> </my-list> </div> </template> <script> import myList from '@/components/myList.vue' export default { components:{ myList }, data(){ return { books: [ {name: 'css揭秘'}, {name: '深入淺出nodejs'}, {name: 'javascript設計模式與開發實戰'} ] } } } </script>
子組件myList.vue
<template> <div class="myList"> <h2>This is myList page</h2> <ul> <slot name="bookList" v-for="book in books" :bookName="book.name"></slot> </ul> </div> </template> <script> export default { props:{ books:{ type: Array, default: function(){ return [] } } }, mounted(){ console.log(this.books) } } </script>
其實上面的案例可直接在父組件中for循環就好,此處只是作為演示slot的作用域插槽;
實際開發中作用域插槽的使用場景主要為:既可以復用子組件的slot,又可以使slot內容不一致。
4.訪問slot
vue2.0提供了$slot方法來訪問slot
此處代碼以**“具名slot(同時使用多個插槽)”**的代碼為例,修改一下子組件childComponment.vue
export default { name: "childComponment", data(){ return { message: '' } }, mounted(){ let header = this.$slots.header let main = this.$slots.default let footer = this.$slots.footer console.log(header) console.log(main) console.log(footer) console.log(footer[0].elm.innerHTML) } };
打印結果:
其中elm的內容為插槽內容,結構如下:
關于“vue組件化中slot如何用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。