1. 程式人生 > 其它 >vue入門 vue基礎之簡單使用6--插槽 slot

vue入門 vue基礎之簡單使用6--插槽 slot

技術標籤:前端 Vue

插槽:
子元件中提供給父元件使用的一個佔位符,
父元件不僅可以往插槽中插入值型別,也可以插入任何模板程式碼
我們插入的程式碼,會自動替代子標籤
(白話,就是給你一個坑,父元件傳一個東西(值,其他模板程式碼)過來,我給你放在那裡)
插槽種類:

  • 匿名插槽
  • 具名插槽
  • 作用域插槽

匿名插槽

在template中定義slot標籤,然後在div#app中就可以寫資料, 此為匿名插槽
步驟:
在元件的template中,定義插槽

    <template id="temp">
       <div>
           this is a children template
           <
br> <slot> </slot> </div> </template> <script> Vue.component("rin",{ template:"#temp" })

在使用元件時,傳入對應的值即可

    <div id="app">
       <rin>
           插槽的位置,誰敢動
       </
rin
>
</div>

具名插槽

具名插槽就是有名字的插槽
1.在template的slot標籤中,使用name屬性定義slot名稱
2.在主標籤中對應的插槽資料中,使用v-slot指定插槽
3.具名插槽必須放在template中,並由template使用v-slot指令指定插槽
4.如果兩個插槽名稱一致,那麼可以在上端一次輸入資料,在元件中一起使用
5.插槽的位置順序,由tempalte決定。
6插槽可以有多個插槽,且可以放在不同的位置

步驟:
在template中定義slot的位置和名稱

    <template id="temp">
<div> <slot name="slot1"></slot> <p>這是元件的身體</p> <slot name="slot2"></slot> </div> </template> <script> Vue.component("rin", { template: "#temp" }) </script>

使用時,使用v-slot傳遞不同的slot,並定義名稱,此處的先後順序與展示資料無關

    <div id="app">
       <rin>
           <template v-slot:slot1>
               <h1>這是插槽1的資料</h1>
           </template>

            <template v-slot:slot2> 
               <h1>這是插槽2的資料</h1>
           </template> 
       </rin>
   </div>

預設插槽

  • 所謂預設插槽,就是在元件中只申明瞭插槽標籤,沒有繫結固定名稱(且一定是)。
  • 此時可以在div#app標籤中,新建一個template且無v-slot指定。(也可以直接寫資料,template也不寫)
  • 當在template中,寫了多個預設插槽時,預設插槽的資料會一一填充上去
  • 同上,如果在div#app定義了多個插槽的資料,也會一一填充到template中

此處就是一個元件中定義了兩個預設slot

    <template id="temp">
        <div>            
            <slot name="slot1"></slot>
            <p>這是元件的身體</p>
            <slot name="slot2"></slot>
            <slot></slot>
            <slot></slot>
        </div>
    </template>
    <script>
        Vue.component("rin", {
            template: "#temp"
        })

使用的時候,預設用寫上去即可,只是不需要繫結名稱

    <div id="app">
        <rin>
            <template v-slot:slot1>
                <h1>這是插槽1的資料</h1>
            </template>

             <template v-slot:slot2> 
                <h1>這是插槽2的資料</h1>
            </template> 

            <!-- 預設插槽 -->
            <template>
                <div>哈哈哈1</div>
            </template> 
            <template>
                <div>哈哈哈2</div>
            </template> 
        </rin>
    </div>

作用域插槽

作用域插槽內,父元件可以拿到子元件的資料。子元件可以在slot標籤上繫結屬性值
理解上其實就是:作用域插槽就是帶有資料的插槽

1.定義了一個元件,且給元件定義了部分資料
一個user,一個user的list

        Vue.component("rin", {
            template: "#temp",
            data() {
                return {
                    user: {
                        name: "liubi",
                        age: 10
                    },
                    users: [{
                            name: "rin",
                            age: 24
                        },
                        {
                            name: "sister",
                            age: 10
                        },
                        {
                            name: "may",
                            age: 16
                        },
                    ]
                }
            }
        })

2.定義插槽:
在元件繫結的template中,slot使用v-for或者:加屬性名的方式繫結資料

    <template id="temp">
        <div>
            <!-- 1.因為template不支援大寫,所以定義userinfo也不能出現駱駝式命名,還必須小寫
                 2.對插槽進行命名時,若是使用-的稱呼,則tempalte中,也必須寫area-slot,否則也會無效
                  -->
            <!-- 1.傳遞物件 -->
            <slot name="area-slot" :user-info="user"></slot>
            <!-- 傳遞物件裡面的值 -->
            <slot name="area-slot1" :username="user.name" :age="user.age"></slot>
            <slot name="area-slot2" v-for="user in users" :username="user.name" :age="user.age"></slot>
        </div>
    </template>

注意:1.對插槽進行命名時,若是使用-的稱呼,則tempalte中,也必須寫area-slot,否則也會無效
2.因為template不支援大寫,所以定義userinfo也不能出現駱駝式命名,還必須小寫

3.元件中使用插槽
使用scope繫結資料,然後輸出資料內容

    <div id="app">
        <rin>
            <!-- 此處繫結slot(作用域插槽)時,不能像具名插槽一樣,使用v-slot,只能用slot來繫結slot名稱 -->
            <template slot="area-slot" slot-scope="data">
                <!-- 1.當slot的屬性user-info使用了-時,此處data的資料還必須大寫
                當然,也可以user-info直接寫成userinfo,那此處也可以寫成userinfo -->
                {{data.userInfo.name}}
            </template>
            <!-- 繫結值 -->
            <template slot="area-slot1" slot-scope="data">
                {{data.username}}--{{data.age}}
            </template>
            <!-- 遍歷物件 -->
            <template slot="area-slot2" slot-scope="data">
                <h1>{{data.username}}--{{data.age}}</h1>
            </template>
        </rin>
    </div>

注意:此處與步驟二相關聯,當步驟二定義插槽時,此處使用user-info,那麼步驟三使用插槽遍歷資料時候,還必須得使用大寫
在這裡插入圖片描述
在這裡插入圖片描述

全程式碼

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> -->
    <script src="vue.min.js"></script>
    <title>作用域插槽</title>
</head>

<body>
    <!-- 1.作用域插槽其實就是帶有資料的插槽 -->
    <div id="app">
        <rin>
            <!-- 此處繫結slot(作用域插槽)時,不能像具名插槽一樣,使用v-slot,只能用slot來繫結slot名稱 -->
            <template slot="area-slot" slot-scope="data">
                <!-- 1.當slot的屬性user-info使用了-時,此處data的資料還必須大寫
                當然,也可以user-info直接寫成userinfo,那此處也可以寫成userinfo -->
                {{data.userInfo.name}}
            </template>
            <!-- 繫結值 -->
            <template slot="area-slot1" slot-scope="data">
                {{data.username}}--{{data.age}}
            </template>
            <!-- 遍歷物件 -->
            <template slot="area-slot2" slot-scope="data">
                <h1>{{data.username}}--{{data.age}}</h1>
            </template>
        </rin>
    </div>
    <template id="temp">
        <div>
            <!-- 1.因為template不支援大寫,所以定義userinfo也不能出現駱駝式命名,還必須小寫
                 2.對插槽進行命名時,若是使用-的稱呼,則tempalte中,也必須寫area-slot,否則也會無效
                  -->
            <!-- 1.傳遞物件 -->
            <slot name="area-slot" :user-info="user"></slot>
            <!-- 傳遞物件裡面的值 -->
            <slot name="area-slot1" :username="user.name" :age="user.age"></slot>
            <slot name="area-slot2" v-for="user in users" :username="user.name" :age="user.age"></slot>
        </div>
    </template>
    <script>
        Vue.component("rin", {
            template: "#temp",
            data() {
                return {
                    user: {
                        name: "liubi",
                        age: 10
                    },
                    users: [{
                            name: "rin",
                            age: 24
                        },
                        {
                            name: "sister",
                            age: 10
                        },
                        {
                            name: "may",
                            age: 16
                        },
                    ]
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        });
    </script>
</body>
</html>