關於uniapp的插槽


前置步驟

在中pages.json 如下圖,可進行全局組件的引用

 

需要文件:index.vue(主頁)  my-form.vue(組件)

 

1、以組件內容為默認視圖

my-form.vue(組件)

<template>
    <view>
        <view>默認視圖</view>
        <slot></slot>
    </view>
</template>

 

index.vue(主頁) 

 <!--引入組件-->
 <my-form>
    新加的視圖代碼
 </my-form>

 

 

  效果

 

 

 

 2、后備內容(當插槽未有內容時,顯示默認的內容)

 

 

 

 

  3、具名插槽

可以給組件中的<slot> 添加name,<slot name="aaa">,此時 該<slot name="aaa"> 將綁定父級中指定的“v-slot:name”

my-form.vue(組件):

<template>
    <view>
        <view>默認視圖(子級)</view>
        <slot name="aaa">指定綁定slot,名字為aaa(子級)</slot>
        <slot>未綁定slot,無名字(子級)</slot>
    </view>
</template>

 

index.vue(主頁) 

<!--引入組件-->
<my-form>

   <view :slot="'aaa'">指定aaa視圖代碼(父級)</view>
   <!--或者-->
   <template v-slot:aaa>作用同上,但是同name下等級比較高,優先渲染</template>

   <view>未指定任何name的視圖代碼(父級)</view>
</my-form>

 

效果

 

 

 

 

 

 4、解結構插槽(將組件data中的數組數據,返回給父級的視圖,從父級遍歷渲染插槽,感覺有點雞肋)

my-form.vue(組件):

<template>
    <view>
        <slot :postData="postData">未綁定slot,無名字(子級)</slot>
    </view>
</template>
<script>
    export default {
        name: "my-form",
        data() {
            return {
                postData:[{
                    title:"標題"
                }]
            }
        },
    }
</script>

 

index.vue(主頁) 

    <my-form>
       <template v-slot="{postData}">
           <view v-for="(item,index) in postData" v-key="index">
               {{item.title}}
           </view>
       </template>

    </my-form>

 

效果

 

 

 

基於第4點,可以將data 放在父級,由父級傳給子級,

index.vue(主頁)

<template>
    <view>

        <!--引入組件-->

        <view class="slot-item">
            <my-form :todos="todos">
                <!--綁定一個命名為“slotName”的slot-->
                <template v-slot:slotName="{ thisItemData }">
                    <span v-if="thisItemData.isComplete"></span>
                    {{ thisItemData.text }}
                </template>
            </my-form>
        </view>

    </view>
</template>

<script>
    export default {
        data() {
            return {
                todos: [{
                    text: "aa",
                    id: "aa",
                    isComplete: false
                }, {
                    text: "bb",
                    id: "bb",
                    isComplete: true
                }, {
                    text: "cc",
                    id: "cc",
                    isComplete: false
                }]
            };
        },
    }
</script>

 

 

 

my-form.vue(組件):

<template>
    <view>
        <view v-for="(todoitem,todoIndex) in todos" :key="todoIndex">

            <!--通過thisItemData 返回給父級-->
            <slot name="slotName" :thisItemData="todoitem">
                <!-- 后備內容 -->
                {{ todoitem.text }}
            </slot>
        </view>
    </view>
</template>


<script>
    export default {
        name: "my-zujian",
        props: {
            todos: { //類型
                type: Array,
                default: function () {
                    return []
                }
            }
        },
        data() {
            return {}
        },
    }
</script>

 

 

結果:

 

 

 

參考來源:https://blog.csdn.net/qq_40666120/article/details/106899722

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM