美文网首页
vue3-slot-消息框-模态框

vue3-slot-消息框-模态框

作者: 云高风轻 | 来源:发表于2021-11-15 23:35 被阅读0次

    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会被忽略掉

    参考资料

    v2-slot插槽


    易错分析-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>
    

    参考资料

    vue2-slot插槽


    初心

    我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
    如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
    共勉

    相关文章

      网友评论

          本文标题:vue3-slot-消息框-模态框

          本文链接:https://www.haomeiwen.com/subject/mrsctrtx.html