VUE3(三十)自定义抽屉组件Drawer

我这里计划做一个即时聊天的小功能,计划是在一个抽屉组件中实现这个功能。

但是最后能不能成功我也不知道,毕竟我没做过,但是抽屉组件可以提前做一个嘛,这个不是很难。

代码:

Drawer.vue:

<template>
  <div class="drawer">
    <!-- 遮罩层 -->
    <div class="mask-show" v-if="drawerShow" @click="close()" ></div>
    <!-- 抽屉层 -->
    <div class="setbox" :class="{show: drawerShow}">
      <div class="header">
        <p class="fl">即时聊天</p>
        <button class="off" @click="close()">关闭</button>
      </div>
    </div>
  </div>
</template>
<script>
  // 引入js文件
  import Drawer from "/@/assets/js/components/pc/Drawer";
  // 使用js对象
  export default {
    ...Drawer,
  };
</script>
<style lang="scss" scoped>
    @import "../../assets/css/components/pc/Drawer.scss";
</style>

Drawer.ts:

import { useRouter } from "vue-router";
import {
  PropType,
  ref,
  watch,
  reactive,
  toRefs,
  inject,
  provide,
  onMounted
} from "vue";
import { common } from "/@/hooks/common.ts";
// 定义返回的类型
interface dataRef {
  close: () => void;
}
export default {
  name: "Drawer",
  // VUE3语法 setup函数
  // setup官方文档:https://www.vue3js.cn/docs/zh/guide/composition-api-setup.html#参数
  setup(props: any, content:any): dataRef 
  {
    const router = useRouter();
    /**
     * @name: 监听公共状态栏值变化
     * @author: camellia
     * @email: guanchao_gc@qq.com
     * @date: 2021-01-10 
     */
    watch(
      () => common.drawerShow,
      () => {
        data.drawerShow = common.drawerShow;
      }
    );
    /**
     * @name: 声明data
     * @author: camellia
     * @email: guanchao_gc@qq.com
     * @date: 2021-01-10 
     */
    const data = reactive({
      drawerShow: common.drawerShow,
    });
    /**
     * @name: 关闭组件
     * @author: camellia
     * @email: guanchao_gc@qq.com
     * @date: 2021-01-10 
     */
    const close = () => {
      data.drawerShow = false;
      common.drawerShow = data.drawerShow;
    }
    /**
     * @name: 将data绑定值dataRef
     * @author: camellia
     * @email: guanchao_gc@qq.com
     * @date: 2021-01-10 
     */
    const dataRef = toRefs(data);
    return {
      close,
      ...dataRef
    }
  },
}

Drawer.scss:

.drawer {
  // height: 500px;
  width:100%;
  display:flex;
  display:-webkit-flex;
  flex-direction:column;  
  /* 遮罩 */
  .mask-show {
    position:fixed;
      z-index:100;
      top:0px;
      bottom:0px;
      width:100%;
      height:100%;
      background-color: rgba(0, 0, 0, 0.5);
  }
  .setbox{
      position:fixed;
      z-index:1100;
      top:0px;
      bottom:0px;
      width:30%;
      height:100%;
      background:#FFFFFF;
      border-left: 1px solid #CFD8DC!important;
      box-shadow:0px 3px 12px rgba(0,0,0,0.12);
      -webkit-transition: all 1s ease;
      transition: all 1s ease;
      // 动画(定位从 -32% 变成 0)
      right:-32%;
      padding:0px 0px 0px 20px;
  }
  // 动画
  .show {
    right: 0;
  }
}

组件调用:

<template>
    <!-- 抽屉组件 -->
    <drawer></drawer>
</template>
import {
    PropType,
    ref,
watch
} from "vue";
 
import Drawer from "/@/components/pc/Drawer.vue";
// 引入axios钩子
import axios from "/@/hooks/axios.ts";
export default {
    name: "label",
    components: {
        Drawer,
    },
};

最终效果如下图所示:

在这里插入图片描述

有好的建议,请在下方输入你的评论。

欢迎访问个人博客
https://guanchao.site

欢迎访问小程序:

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue抽屉组件一个常见的UI组件,用于实现侧边栏的展开和收起功能。在Vue中,可以通过使用slot来实现子组件抽屉效果。 首先,在父组件中引入抽屉组件,并设置一个布尔类型的data属性来控制抽屉的展开和收起状态: ```vue <template> <div> <button @click="showDrawer = true">打开抽屉</button> <drawer v-model="showDrawer"> <!-- 抽屉内容 --> <div slot="content"> <!-- 这里是抽屉的内容 --> </div> </drawer> </div> </template> <script> import Drawer from '抽屉组件的路径' export default { components: { Drawer }, data() { return { showDrawer: false } } } </script> ``` 然后,在抽屉组件中定义好抽屉的样式和交互逻辑: ```vue <template> <transition name="drawer"> <div class="drawer" v-show="value"> <!-- 抽屉内容插槽 --> <slot name="content"></slot> </div> </transition> </template> <script> export default { props: { value: { type: Boolean, default: false } } } </script> <style scoped> .drawer { position: fixed; top: 0; left: 0; width: 300px; height: 100vh; background-color: #fff; transition: transform 0.3s ease-in-out; transform: translateX(-100%); } .drawer-enter-active, .drawer-leave-active { transition: transform 0.3s ease-in-out; } .drawer-enter, .drawer-leave-to { transform: translateX(0); } </style> ``` 通过以上代码,就可以实现一个简单的抽屉组件。当点击打开按钮时,抽屉会从左侧滑入屏幕,并展示出内容;再次点击关闭按钮时,抽屉会滑出屏幕。你可以根据实际需要,自定义抽屉的样式和交互效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值