Blame view

node_modules/element-ui/packages/notification/src/main.vue 3.58 KB
7820380e   “wangming”   1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  <template>
    <transition name="el-notification-fade">
      <div
        :class="['el-notification', customClass, horizontalClass]"
        v-show="visible"
        :style="positionStyle"
        @mouseenter="clearTimer()"
        @mouseleave="startTimer()"
        @click="click"
        role="alert"
      >
        <i
          class="el-notification__icon"
          :class="[ typeClass, iconClass ]"
          v-if="type || iconClass">
        </i>
        <div class="el-notification__group" :class="{ 'is-with-icon': typeClass || iconClass }">
          <h2 class="el-notification__title" v-text="title"></h2>
          <div class="el-notification__content" v-show="message">
            <slot>
              <p v-if="!dangerouslyUseHTMLString">{{ message }}</p>
              <p v-else v-html="message"></p>
            </slot>
          </div>
          <div
            class="el-notification__closeBtn el-icon-close"
            v-if="showClose"
            @click.stop="close"></div>
        </div>
      </div>
    </transition>
  </template>
  
  <script type="text/babel">
    let typeMap = {
      success: 'success',
      info: 'info',
      warning: 'warning',
      error: 'error'
    };
  
    export default {
      data() {
        return {
          visible: false,
          title: '',
          message: '',
          duration: 4500,
          type: '',
          showClose: true,
          customClass: '',
          iconClass: '',
          onClose: null,
          onClick: null,
          closed: false,
          verticalOffset: 0,
          timer: null,
          dangerouslyUseHTMLString: false,
          position: 'top-right'
        };
      },
  
      computed: {
        typeClass() {
          return this.type && typeMap[this.type] ? `el-icon-${ typeMap[this.type] }` : '';
        },
  
        horizontalClass() {
          return this.position.indexOf('right') > -1 ? 'right' : 'left';
        },
  
        verticalProperty() {
          return /^top-/.test(this.position) ? 'top' : 'bottom';
        },
  
        positionStyle() {
          return {
            [this.verticalProperty]: `${ this.verticalOffset }px`
          };
        }
      },
  
      watch: {
        closed(newVal) {
          if (newVal) {
            this.visible = false;
            this.$el.addEventListener('transitionend', this.destroyElement);
          }
        }
      },
  
      methods: {
        destroyElement() {
          this.$el.removeEventListener('transitionend', this.destroyElement);
          this.$destroy(true);
          this.$el.parentNode.removeChild(this.$el);
        },
  
        click() {
          if (typeof this.onClick === 'function') {
            this.onClick();
          }
        },
  
        close() {
          this.closed = true;
          if (typeof this.onClose === 'function') {
            this.onClose();
          }
        },
  
        clearTimer() {
          clearTimeout(this.timer);
        },
  
        startTimer() {
          if (this.duration > 0) {
            this.timer = setTimeout(() => {
              if (!this.closed) {
                this.close();
              }
            }, this.duration);
          }
        },
        keydown(e) {
          if (e.keyCode === 46 || e.keyCode === 8) {
            this.clearTimer(); // detele 取消倒计时
          } else if (e.keyCode === 27) { // esc关闭消息
            if (!this.closed) {
              this.close();
            }
          } else {
            this.startTimer(); // 恢复倒计时
          }
        }
      },
      mounted() {
        if (this.duration > 0) {
          this.timer = setTimeout(() => {
            if (!this.closed) {
              this.close();
            }
          }, this.duration);
        }
        document.addEventListener('keydown', this.keydown);
      },
      beforeDestroy() {
        document.removeEventListener('keydown', this.keydown);
      }
    };
  </script>