button.js 1.58 KB
/**
 * @file 仿微信小程序按钮hover-class
 */

export default {
  props: {
    // 指定按钮按下去的样式类。当 hover-class="none" 时,没有点击态效果
    hoverClass: {
      type: String,
      default: 'button-hover',
    },
    // 按住后多久出现点击态,单位毫秒
    hoverStartTime: {
      type: Number,
      default: 0,
    },
    // 手指松开后点击态保留时间,单位毫秒
    hoverStayTime: {
      type: Number,
      default: 70,
    },
  },
  data() {
    return {
      hover: false,
    };
  },
  computed: {
    // 计算绑定的class对象
    bindClass() {
      return {
        [this.hoverClass]: this.hover,
      };
    },
    // 事件hack
    bindEvents() {
      const events = this.$listeners || {};
      const activeEvents = ['mousedown', 'touchstart'];
      const deactiveEvents = ['mouseup', 'mouseout', 'touchend'];
      let safeEvents = { ...events };
      activeEvents.forEach(key => {
        safeEvents[key] = e => {
          const originEvent = events[key];
          originEvent && originEvent(e);
          if (this.hoverStartTime) {
            setTimeout(() => {
              this.hover = true;
            }, this.hoverStartTime);
          } else {
            this.hover = true;
          }
        };
      });
      deactiveEvents.forEach(key => {
        safeEvents[key] = e => {
          const originEvent = events[key];
          originEvent && originEvent(e);
          setTimeout(() => {
            this.hover = false;
          }, this.hoverStayTime);
        };
      });
      return safeEvents;
    },
  },
};