1.前言
1.使用vue3 的slot插槽时,大部分和vue2-slot插槽差不多
2.但也有一些地方需要注意记录如下
2.消息框
1.png
组件
<div class="message-box" v-if="show">
<slot> </slot>
<span class="message-box-close" @click="$emit('update:show',false)">X</span>
</div>
slot 分发的是 组件标签之间的内容
slot在组件内的位置 ,才是 使用组件时候标签内容的实际出口
使用
<message-box v-model:show="showMsgView">警告</message-box>
3. 具名插槽
组件
<template>
<!-- 具名插槽 -->
<transition name="fade">
<div class="message-box" v-if="show">
<!-- title="来子组件自己的标题" -->
<slot name="title" content="我是子组件的哦"> 默认标题</slot>
<slot></slot>
<span class="message-box-close" @click="$emit('update:show', false)"
>X</span
>
</div>
</transition>
</template>
<script>
export default {
props: ["show"],
};
</script>
在消息组件的基础上进行修改的
使用
<name-slot v-model:show="showMsgView">
<!-- 名为title插槽的内容 -->
<template v-slot:title="slotData">
<!-- msg默认是当前组件里面的数据 -->
<h1>温馨提示</h1>
<p> 父组件:{{ msg }} </p>
<p>{{ slotData.content }}</p>
</template>
<template v-slot:default> 默认插槽 </template>
</name-slot>
v-lslot
的写法 标准化了
易错分析-1
1.png
v-slot 指令只能用于组件 或者template
易错分析-2
1.png
普通标签和template
同时存在的话template
会被忽略掉
参考资料
易错分析-3
1.png
默认插槽只能有一个,多余的会被忽略掉
4.模态框
4.1 添加模态
1.png
模板
<template>
<div>
<transition name="move">
<div
class="mark-wrap"
v-show="modelValue"
@click="$emit('update:modelValue', false)"
>
<div class="content-wrap" @click.stop>
<span class="close" @click="$emit('update:modelValue', false)"
>×</span
>
<h3>{{ title }}</h3>
<div class="content">
<slot></slot>
</div>
</div>
</div>
</transition>
</div>
</template>
整个背景灰色 ,点击消失
逻辑
<script>
export default {
props: ["modelValue", "title"],
props:{
modelValue:{
type:Boolean,
required:true,
default:false
},
title:{
type:String,
default:"标题"
}
}
};
</script>
样式
<style scoped>
* {
margin: 0;
padding: 0;
}
.mark-wrap {
position: fixed;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.3);
top: 0;
left: 0;
}
.content-wrap {
padding: 30px;
max-height: 500px;
overflow: auto;
background-color: white;
border-radius: 10px;
position: absolute;
top: 200px;
left: 50%;
transform: translateX(-50%);
}
.close {
position: absolute;
top: 0px;
right: 20px;
font-size: 30px;
cursor: pointer;
}
.content-wrap h3 {
padding: 10px 0 10px 10px;
border-bottom: 1px solid #dedede;
}
.content {
padding: 10px;
}
/* 过渡 */
.move-enter-from,
.move-leave-to {
opacity: 0;
}
.move-enter-active,
.move-leave-active {
transition: all 0.5s;
}
</style>
样式整个背景的灰色
使用
<button @click="showModal = true">添加用户</button>
<my-modal v-model:modelValue="showModal">
<label>
<input type="text" placeholder="用户名">
</label>
<label>
<input type="text" placeholder="密码">
</label>
</my-modal>
默认不传标题
4.2 查看信息
1.png
使用的组件 还是之前的组件
内容不同,由使用者传递具体的内容
这才能体会到slot
的分发
到底啥意思
<button @click="showUpdateModal = true">查看用户</button>
<my-modal v-model:modelValue="showUpdateModal" title="查看用户">
<table>
<tr>
<td>用户名</td>
<td>性别</td>
<td>年龄</td>
</tr>
</table>
</my-modal>
网友评论