| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | 
<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>
 |