1.前言
1.使用vue3 的slot插槽时,大部分和vue2-slot插槽差不多
2.但也有一些地方需要注意记录如下
2.消息框
组件
<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
v-slot 指令只能用于组件 或者
template
易错分析-2
普通标签和
template
同时存在的话template
会被忽略掉
参考资料
易错分析-3
1.png
默认插槽只能有一个,多余的会被忽略掉
4.模态框
4.1 添加模态
模板
<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 查看信息
使用的组件 还是之前的组件
内容不同,由使用者传递具体的内容
这才能体会到
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>