action-sheet.vue 2.13 KB
<template>
  <transition name="cube-action-sheet-fade" @after-leave="hidden" @after-enter="shown">
    <cube-popup
      type="action-sheet"
      :center="false"
      :mask="true"
      :z-index="100"
      v-show="isVisible"
      @mask-click="maskClick">
      <transition :name="transition" appear>
        <div class="cube-action-sheet-panel" v-show="isVisible" @click.stop>
          <slot></slot>
        </div>
      </transition>
    </cube-popup>
  </transition>
</template>

<script>
import { Popup } from 'cube-ui';

export default {
  name: 'ActionSheet',
  props: {
    position: {
      type: String,
      default: 'bottom',
    },
  },
  data() {
    return {
      isVisible: false,
    };
  },
  computed: {
    transition() {
      return `cube-action-sheet-${this.position}`;
    },
  },
  methods: {
    show(fn) {
      this.isVisible = true;
      if (typeof fn === 'function') {
        this._shownCallback = fn;
      }
    },
    hide() {
      this.isVisible = false;
    },
    maskClick() {
      this.hide();
    },
    hidden() {
      this.$emit('hidden');
    },
    shown() {
      if (this._shownCallback) {
        this.$nextTick(() => {
          this._shownCallback();
        });
      }
    }
  },
  components: {
    'cube-popup': Popup,
  }
};
</script>

<style lang="scss" scoped>
  .cube-action-sheet-fade-enter, .cube-action-sheet-fade-leave-active {
    opacity: 0;
  }

  .cube-action-sheet-fade-enter-active, .cube-action-sheet-fade-leave-active {
    transition: all 0.3s ease-in-out;
  }

  .cube-action-sheet-panel {
    background: #fff;
    border-top-left-radius: 20px 24px;
    border-top-right-radius: 20px 24px;
  }

  .cube-action-sheet-bottom-enter, .cube-action-sheet-bottom-leave-active {
    transform: translate3d(0, 100%, 0);
  }

  .cube-action-sheet-right-enter, .cube-action-sheet-right-leave-active {
    transform: translate3d(100%, 0, 0);
  }

  .cube-action-sheet-bottom-enter-active, .cube-action-sheet-bottom-leave-active,
  .cube-action-sheet-right-enter-active, .cube-action-sheet-right-leave-active {
    transition: all 0.3s ease-in-out;
  }

  /deep/ .cube-popup-mask {
    opacity: 0.2;
  }
</style>