vite+vue3使用slot插槽

如何简单明了使用slot插槽

在官网已经表明如何使用,但我觉得看的有点小乱,本文章记录一下,也是整理自己的思路

使用solt的理由:在不同的组件使用,它最核心的地方展示是不一样的,但其它的地方是一样的,只是数据不一样。也就是说只有在不一样的地方才使用slot插槽

如果子组件不使用slot插槽的情况下,在父组件里面写内容是不会渲染的。

目录

1、简单使用slot插槽

2、默认插槽和具名插槽、动态插槽名

2.1、name参数:默认插槽和具名插槽

2.2、[key: string]: any参数 以及 作用域插槽

2.3、动态插槽名

3、无渲染组件

4、插槽选择器


1、简单使用slot插槽

在A文件定义,定义slot插槽

<template>
    <div>
        <slot></slot>
    </div>
</template>

在B文件使用,使用slot插槽

<template>
    <soltA>
        //使用slot
       <div class="box">要写的内容</div>
    </soltA>
</template>
<script setup lang='ts'>
//引入组件
import soltA from './a.vue';


</script>

就是最简单的slot插槽使用

2、默认插槽和具名插槽、动态插槽名

slot插槽有两种参数,一个是name,定义插槽名

第二个是[key: string]: any ,与它一起用的还有作用域插槽

  

注意:

一旦使用多个slot,只有一个可以不写name(不写的默认是default),也就是默认插槽,

其它的slot都要写name属性,否则会重复渲染,也就是具名插槽

2.1、name参数:默认插槽和具名插槽

先说第一个参数 name , 它是默认插槽和具名插槽的分界线,用代码来说

在A文件定义,定义slot插槽

<template>
    <div class="container">
        <header>
            <!-- 标题内容放这里 -->
            <slot name="header"></slot>
        </header>
        <main>
            <!-- 主要内容放这里 -->
            <slot></slot>
        </main>
        <footer>
            <!-- 底部内容放这里 -->
            <slot name="footer"></slot>
        </footer>
    </div>
</template>

在B文件使用,使用slot插槽 

同时定义多个slot时,要使用template 组件,如果不使用,就默认渲染在没写名的solt上,也就是 default ( 默认插槽 ) 。

#的全名是v-slot,一般我们都是使用#号

<template #defaule>其意思就是“将这部分模板片段传入子组件的 name 为 header 插槽中”。

<template>
  <soltA>
        <template #footer>
            <div class="box">底部内容放这里</div>
        </template>

        <template #header>
            <div class="box">标题内容放这里</div>
        </template>
        
        <template #default>
            <div class="box">主要内容放这里</div>
        </template>
  </soltA>
</template>

 观察下面并结合上面,你会发现,

渲染的位置关键不是在使用slot的位置,而是在 name 定义的位置

这点很重要,因为的使用的时候改不了它的渲染的位置

2.2、[key: string]: any参数 以及 作用域插槽

使用 [key: string]: any,与它一起用的还有作用域插槽

使用场景:数据经过一定处理,然后返回给组件使用

在A文件定义,定义slot插槽( [key: string]: any参数 )

<template>
    <div class="container">
        <slot :item ='item' :data="data"></slot>
    </div>
</template>
<script setup lang='ts'>
import { ref } from 'vue'
let item = ref([
    {
        name:'张三',
        age:18,
    },
    {
        name:'李四',
        age:28,
    }
]) 

let data = ref(999)
</script>

在B文件使用,使用slot插槽  ( 作用域插槽 

在父组件使用 template 组件上使用#xxx="{ xxx , xxx}"接受数据,使用ES6{}解构数据更好,如果好奇不使用是怎么样的,可以复制删除括号试下

<template>
    <soltA>
        <template #default="{ item , data }" class="box">
            <div v-for="i in item">
                姓名:{{i.name}}
                年龄:{{i.age}}
                money:{{data}}
            </div>
        </template>
    </soltA>
</template>
<script setup lang="ts">
import soltA from "./a.vue";
</script>

2.3、动态插槽名

这个对我们这些普通开发并不实用,而且还有限制,只是官方所有指令都支动态绑定而已

使用

<template>
    <template v-slot:[dynamicSlotName]>
       ...
    </template>

     <!-- 缩写为 -->
    <template #[dynamicSlotName]>
       ...
    </template>

    <!-- 错误写法:动态参数语法的限制 -->
    <template  #['foo' + bar]> ... </template >
</template>

如果你需要传入一个复杂的动态参数,官方推荐使用计算属性替换复杂的表达式

3、无渲染组件

这个官方说的也很明确了,我就不再多写别的了

无渲染组件的概念是:在子组件或slot的组件上不写任何元素,不做任何渲染,只处理数据或逻辑

 官方案例:在A文件定义,定义slot插槽

<template>
  <slot :x="x" :y="y"/>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
  
const x = ref(0)
const y = ref(0)

const update = e => {
  x.value = e.pageX
  y.value = e.pageY
}
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
</script>

在B文件使用,使用slot插槽  

<template>
	<MouseTracker v-slot="{ x, y }">
  	Mouse is at: {{ x }}, {{ y }}
	</MouseTracker>
</template>
<script setup>
import MouseTracker from './MouseTracker.vue'
</script>

这个是官方案例是根据鼠标的位置来展示它的XY值

无渲染组件官方案例

4、插槽选择器

这个功能是来至vue3单文件组件CSS 功能

使用场景:定义特定的class类名,到父组件直接使用,不用每次调用该组件时再次重复写这类名的样式

简单来说,就是子组件是默认修改不了父组件有样式,而插槽选择器可以在子组件中选中父组件slot的元素

在A文件定义,定义slot插槽

<template>
    <div class="container">
        <slot :item ='item' :data="data"></slot>
    </div>
</template>
<style lang='less' scoped>
//修改父组件的 .slot-div 的样式
:slotted(.slot-div){
color: red;
}
</style>

在B文件使用,使用slot插槽   

<template>
    <soltA>
        <template #default>
            <div class="slot-div">在使用slot,它的类名是slot-div</div>
            <div>它的没有类名</div>
        </template>
    </soltA>
</template>
<script setup lang="ts">
import soltA from "./a.vue";
</script>

到这我们已经把slot插槽基础学完了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在vite使用pinia,需要按照以下步骤进行配置: 1. 首先,确保你已经安装了pinia和@pinia/vite插件。可以通过以下命令进行安装: ``` npm install pinia @pinia/vite --save ``` 2. 在你的vite配置文件(vite.config.js)中,引入@pinia/vite插件,并将其添加到vite插件列表中。配置文件通常位于项目的根目录下。示例配置如下: ``` import { defineConfig } from 'vite' import pinia from '@pinia/vite' export default defineConfig({ plugins: [ pinia() ] }) ``` 3. 在你的Vue应用程序中,通过以下步骤启用pinia: - 在入口文件(main.js或main.ts)中,引入pinia并创建一个实例: ``` import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' const app = createApp(App) const pinia = createPinia() app.use(pinia) app.mount('#app') ``` 4. 现在,你可以在你的组件中使用pinia了。你可以通过以下方式导入和使用它: ``` import { useStore } from 'pinia' export default { setup() { const store = useStore() // 在组件中使用store的状态和方法 // 例如:store.count, store.increment() } } ``` 请注意,上述步骤假设你已经使用Vue 3和TypeScript的环境,并且已经对vite的配置和项目结构有一定的了解。如果你需要更详细的配置和使用说明,可以参考pinia的官方文档。 引用: <a href="https://pinia.esm.dev/">https://pinia.esm.dev/</a><span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3+ts+vuerouter+pinia+elementplus+ts环境模板搭建及vite打包优化](https://download.csdn.net/download/qq_42717015/87775817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [项目实战 之 vue3 + vite + pinia](https://blog.csdn.net/a15297701931/article/details/127371269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值