grass-prompt.js 3.02 KB
import {isArray} from 'lodash';

export default {
  install(Vue) {
    let promptVM = null;
    let promptEle = null;
    let timer = null;

    function creatPromptVM(self) {
      let tpl = Vue.extend({
          data: function () {
              return {
                type: '',
                img: '',
                title: '',
                desc: '',
                onClick: null,
                classNames: []
              }
          },
          render: function(h) {
            let classNames = ['yoho-grass-prompt-wrap', ...this.classNames];

            return h('div', {class: ['yoho-grass-prompt', `yoho-grass-prompt-${this.type}`]}, [
              h(this.url ? 'a' : 'div', {
                class: classNames,
                attrs: {
                  href: this.url || '',
                },
                on: {
                  'click.stop': () => {
                    this.onClick && this.onClick();
                  }
                }
              }, [
                h('ImageFormat', {
                  class: ['prompt-thumb'],
                  props: {
                    src: this.img,
                    lazy: false,
                    width: 100,
                    height: 100
                  }
                }),
                h('div', {class: ['prompt-info']}, [
                  h('p', {
                    class: ['prompt-info-title'],
                    domProps: {
                      innerHTML: this.title
                    }
                  }),
                  h('p', {
                    class: ['prompt-info-desc'],
                    domProps: {
                      innerHTML: this.desc
                    }
                  })
                ]),
                h('span', {class: ['iconfont', 'icon-right', 'prompt-icon']})
              ])
            ])
          }
      });

      promptVM = new tpl();
      promptEle = promptVM.$mount().$el;
      document.body.appendChild(promptEle);
    }

    Vue.prototype.$grassPrompt = function(data = {}, time) {
      let {img, title, desc, url, type, className, onClick} = data;

      if (!promptVM) {
        creatPromptVM(this);
      }

      promptVM.img  = img || '';
      promptVM.title = title || '';
      promptVM.desc = desc || '';
      promptVM.url = url;
      promptVM.type = type || 'bottom';

      if (className && !isArray(className)) {
        className = [className];
      }

      promptVM.classNames = className || [];

      if (typeof onClick === 'function') {
        promptVM.onClick = onClick;
      }

      let res = {
        show() {
          timer && clearTimeout(timer);
          timer = setTimeout(function() {
            promptVM.classNames.push('yoho-grass-prompt-enter-active');

            timer = setTimeout(function() {
              promptVM.classNames.push('yoho-grass-prompt-leave-active');
            }, time || 8000);
          }, 100);
        },
        hide() {
          timer && clearTimeout(timer);
          promptVM.classNames = [];
        }
      }

      res.show();

      return res;
    }
  }
}