跳到主要內容

Vue 3.0 -5 slot

摘要

Vue 3.0 -5 slot

摘要

slot用來將組件定義插槽使用,可將組件的插槽內容,由上層元件(呼叫層)所決定顯示的內容,分為三種 (1) 默認插槽: 默認組件插入的位置 (2) 具名插槽:插入具名的插槽 (3) 作用域插槽:由父組件來決定顯示的樣式

例如:提供圖片使用可以命名為useImage;

默認插槽

  • 我們利用slot將商品內容,可以根據我們需要擺放資料格式來擺放
  • 這是商品的圖卡,支援文字、圖片、影像,將slot顯示內容

檔案路徑: slot\Category.vue

<template>
    <div class="category">
        <h2>{{ title}}</h2>
        <slot></slot>

    </div>
</template>

<script setup lang="ts" name="category">
    defineProps(["title"])
</script>

<style scoped>

.category{
    background-color: aqua;
    border-radius: 10px;
    box-shadow: 0 0 10px;
    padding: 10px;
    margin: 0px 10px 0px 10px;
    width: 200px;
    height: 300px;
}

h2{
    background-color: orange;
    text-align: center;
    font-size: 18px;
    font-weight: 800;    
}

</style>

檔案位置: Product.vue

 <template>
    <div>
        <h3>商品列表</h3>
        <div class="list">
            <Category title="商品一">
                <ul>
                    <li v-for="g in games" :key="g.index">{{g.name}}</li>
                </ul>
            </Category>
            <Category title="商品二">
                <img :src="imageUrl" width="80%"/>
            </Category>
            <Category title="商品三">
                <video :src="videoUrl" controls width="80%"></video>
            </Category>
        </div>

    </div>
 </template>
 
 <script setup lang="ts" name="product">
    import { reactive,ref } from 'vue';
    import Category from './slot/category.vue';

    let games = reactive([
        {index:1, name:"火影忍者"},
        {index:2, name:"鬼滅之刃"},
        {index:3, name:"魂斗羅"}
    ])

    let imageUrl = ref("https://thumb.ac-illust.com/0c/0c3c64e631df8b99256cf6de8fa8f12f_t.jpeg") ;
    let videoUrl  = ref("https://www.youtube.com/watch?v=OJqFW5psz4Y")
 </script>
 
 <style scoped>
    .list {
        display: flex;
        justify-content: space-evenly;
        
    }
 </style>

具名插槽

既有名字的slot

  • 定義插槽的名字 ,Product2.vue為需要取代組件的slot內容,使用(1) (2) 可以在這兩個位置中宣告。也是有寫法用井號#也是表示插槽例如:#content

檔案位置:slot\NamedCategory.vue

<template>
    <div class="category">
        <!-- 具名插槽 差異-->
        <slot name="title"></slot>
        <slot name="content"></slot>
    </div>
</template>

<script setup lang="ts" name="category">
    defineProps(["title"])
</script>

<style scoped>

.category{
    background-color: aqua;
    border-radius: 10px;
    box-shadow: 0 0 10px;
    padding: 10px;
    margin: 0px 10px 0px 10px;
    width: 200px;
    height: 300px;
}

h2{
    background-color: orange;
    text-align: center;
    font-size: 18px;
    font-weight: 800;    
}

</style>

檔案位置:Product2.vue

 <template>
    <div>
        <h3>商品列表</h3>
        <div class="list">
            <Category>
                <template v-slot:title>
                    <h2>遊戲列表</h2>
                </template>
                <template #content >
                    <ul>
                        <li v-for="g in games" :key="g.index">{{g.name}}</li>
                    </ul>
                </template>
            </Category>
        </div>
    </div>
 </template>
 
 <script setup lang="ts" name="product">
    import { reactive } from 'vue';
    import Category from './slot/NamedCategory.vue';
    let games = reactive([
        {index:1, name:"火影忍者"},
        {index:2, name:"鬼滅之刃"},
        {index:3, name:"魂斗羅"}
    ])

 </script>
 
 <style scoped>
    .list {
        display: flex;
        justify-content: space-evenly;
        
    }
 </style>

作用域插槽

作用域子組件只是做相關參數的設定,最後顯示個格式需要由父組件

檔案位置:slot\RegionCategory.vue

<template>
    <div class="category">
        <!-- 作用域插槽-->
        <slot :list="games"></slot>
    </div>
</template>

<script setup lang="ts" name="category">
import { reactive } from 'vue';

    let games = reactive([
        {index:1, name:"火影忍者"},
        {index:2, name:"鬼滅之刃"},
        {index:3, name:"魂斗羅"}
    ])

 </script>
 
<style scoped>

.category{
    background-color: aqua;
    border-radius: 10px;
    box-shadow: 0 0 10px;
    padding: 10px;
    margin: 0px 10px 0px 10px;
    width: 200px;
    height: 300px;
}

h2{
    background-color: orange;
    text-align: center;
    font-size: 18px;
    font-weight: 800;    
}

</style>

檔案位置:Product2.vue

 <template>
    <div>
        <h3>商品列表</h3>
        <div class="list">
            <RegionCategory>
              <template v-slot="params">
                <ul>
                    <li v-for="y in params.list">
                        {{ y.name}}
                    </li>
                </ul>
              </template>
            </RegionCategory>

            <RegionCategory>
              <template v-slot="params">
                <ol>
                    <li v-for="y in params.list">
                        {{ y.name}}
                    </li>
                </ol>
              </template>
            </RegionCategory>

            <RegionCategory>
              <template v-slot="params">
                    <h3 v-for="y in params.list">
                        {{ y.name}}
                    </h3>
              </template>
            </RegionCategory>

        </div>
    </div>
 </template>
 
 <script setup lang="ts" name="product">
import RegionCategory from './slot/RegionCategory.vue';


 </script>
 
 <style scoped>
    .list {
        display: flex;
        justify-content: space-evenly;
        
    }
 </style>

留言

這個網誌中的熱門文章

GSON基礎教學

GSON 前言 JSON是很常見的資料交換格式,在JAVA領域常用處理JSON的函式庫:GSON、FastXML和JSON-B,本章節會以GSON為主,學習目標如下 JSON格式說明 GSON 套件函式 GSON: 物件轉換JSON字串 GSON: JSON字串轉換物件 JSON 格式說明 JSON全名為JavaScript Object Notation,它是一種輕量級的資料交換格式,會大為流行的理由,主要是他比傳統用xml更輕巧且容易處理, JSON表達方式物件會用大括弧{},陣列則是用中括號[]。 用JSON字串來表達Employee的物件內容,由JSON字串可以知道物件name、age、sex和salary屬性。 JSON表示員工資料方式: {“name”:”Jack Bryant”, “age”:18, “sex”:”M”,”salary”:3500.00} JSON陣列表示方式: 跟我們使用JAVA的陣列方式類似,內容值可以是數字’、文字、布林、陣列、物件、null等等。 範例: 字串: [“紅”、”橙”、”黃”、”綠”、”青”、”藍”、”紫”} 布林: [true, true, false, false, true, true] GSON 套件函式 Gson為google所發布的函式庫,主要將物件與json字串之間的轉換時方便使用。當我們將JAVA物件轉換成JSON字串稱為 序列化 ,JSON字串轉換至JAVA物件稱為 反序列化 。 GSON: 物件轉換JSON字串 有了JSON基本概念後,我們進入本章重點,首先我們需要建立員工類別(Employee),定義如下 物件 屬性 員工類別 Employee name 名字 age 年紀 sex 性別 salary 薪水 /** * name:員工類別 */ public class Employee implements Serializable { //constructor public Employee(String name, double salary){ this.name = name; this.sala...

PHP與Python搭配

今天介紹如何利用php網頁呼叫目錄下的python程式工作或是資料交換,本人整理的方法有兩種 使用system()、exec()、shell_exec()呼叫程式 (1) string system ( string return_var ] ) 參考網址 官網解釋system()用來執行外部命令,返回為印出的結果,passthru()跟system()類似但是它不會返回結果。 範例1. 利用system執行ls指定並顯示在網頁上,無法使用變數保留ls的結果 檔案名稱: psystem.php $jsondata= system("ls -al", $result); 結果: (2) exec() : string exec ( string output [, int &$return_var ]] ) 參考網址 範例2. 利用exec執行python程式並可以回傳json格式給前端網頁做處理並顯示。我們ptopy.php就是可以看到callpy()為執行py的函式,它執行完pyEx01.py會將結果給$jsondata變數,做後面json解析。 檔案名稱: ptopy.php function callpy() { $jsondata= exec("/usr/bin/python pyEx01.py"); return $jsondata ; } $jsondata= callpy(); echo $jsondata ; echo " " ; $obj = json_decode($jsondata) ; echo "name:".$obj-> { 'name'} .',' ; echo "id:".$obj-> { 'id'} ; 檔案名稱: pyEx01.py import sys ...

Python AI-問題集

Python AI-問題集 問題集 Jupyter Notebook執行ipywidgets會出現kernel死掉的錯誤發生(The kernel appears to have died) 解決方法 (1) 根據log檔來判斷問題: 例如:log訊息出現OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized. (2) 根據問題關鍵字找出問題所在: 利用google查詢所遭遇到的問題,例如我把上面的問題上google查詢可以找到這篇的解法 https://blog.csdn.net/bingjianIT/article/details/86182096 (3)實作解法: 我實作下面解法後,就可以順利執行手寫辨識的程式. //在Python宣告時加入 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" 參考 https://blog.csdn.net/bingjianIT/article/details/86182096