中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue組件化中slot如何用

發布時間:2022-05-05 16:44:18 來源:億速云 閱讀:258 作者:iii 欄目:大數據

這篇文章主要介紹“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>

vue組件化中slot如何用

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)
 }
};

打印結果:

vue組件化中slot如何用

其中elm的內容為插槽內容,結構如下:

vue組件化中slot如何用

關于“vue組件化中slot如何用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海丰县| 和静县| 榕江县| 贵溪市| 黑水县| 曲靖市| 大邑县| 绩溪县| 清徐县| 新晃| 龙里县| 龙泉市| 屏东市| 定结县| 乌兰察布市| 搜索| 绿春县| 和平县| 宿迁市| 大邑县| 兰坪| 沂水县| 伽师县| 乡宁县| 天峨县| 本溪| 玛多县| 科尔| 定兴县| 秦皇岛市| 利辛县| 台东县| 垣曲县| 友谊县| 皮山县| 布拖县| 阿鲁科尔沁旗| 肇州县| 临桂县| 侯马市| 黄石市|