u-drawer.vue 2.3 KB

<template>
  <view  v-show="visible">
    <view
      class="u-drawer__overlay"
      :style="{ zIndex: zIndex }"
      @click.stop="handleOverlayClick"
    >
    </view>
    <view
      class="u-drawer"
      :class="{
        'u-drawer--left': placement === 'left',
        'u-drawer--right': placement === 'right'
      }"
      :style="{ zIndex: zIndex + 1, width: width, [placement]: `-${translate}` }"
      @transitionend="handleTransitionEnd"
    >
      <view class="u-drawer__content">
        <slot></slot>
      </view>
    </view>
  </view>
</template>
<script>
import props from './props.js'
export default {
  name: 'u-drawer',
  mixins: [props],
  // props: {
  //   // 
  //   visible: {
  //     type: Boolean,
  //     default: false,
  //   },
  //   mask: {
  //     type: Boolean,
  //     default: true,
  //   },
  //   width: {
  //     type: Number,
  //     default: 300,
  //   },
  //   placement: {
  //     type: String,
  //     default: 'left',
  //     validator: (value) => ['left', 'right'].includes(value),
  //   },
  //   // transition: {
  //   //   type: String,
  //   //   default: 'u-slide-down',
  //   // },
  //   zIndex: {
  //     type: Number,
  //     default: 100,
  //   },
  // },
  data() {
    return {
      translate: 0,
    };
  },
  watch: {
    show: {
      immediate: true,
      handler(value) {
        if (value) {
          this.openDrawer();
        } else {
          this.closeDrawer();
        }
      },
    },
  },
  methods: {
    openDrawer() {
      this.$emit('open');
      this.translate = this.width;
    },
    closeDrawer() {
      this.$emit('close');
      this.translate = 0;
    },
    handleOverlayClick() {
      // console.log('this.mask',this.mask)
      if (this.mask) {
        this.$emit('update:visible', false);
      }
    },
    handleTransitionEnd() {
      if (!this.visible) {
        this.translate = 0;
      }
    },
  },
};
</script>
<style scoped>
.u-drawer {
  position: fixed;
  top: 0;
  bottom: 0;
  background-color: #fff;
  box-shadow: 2px 0 4px rgba(0, 0, 0, 0.1);
  overflow: hidden;
}

.u-drawer--left {
  left: 0;
}

.u-drawer--right {
  right: 0;
}

.u-drawer__content {
  height: 100%;
  overflow-y: auto;
}

.u-drawer__overlay {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background-color: rgba(0, 0, 0, 0.5);
}
</style>