| 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
 | | <template> |  |   <transition name="el-message-fade" @after-leave="handleAfterLeave"> |  |     <div |  |       :class="[ |  |         'el-message', |  |         type && !iconClass ? `el-message--${ type }` : '', |  |         center ? 'is-center' : '', |  |         showClose ? 'is-closable' : '', |  |         customClass |  |       ]" |  |       :style="positionStyle" |  |       v-show="visible" |  |       @mouseenter="clearTimer" |  |       @mouseleave="startTimer" |  |       role="alert"> |  |       <i :class="iconClass" v-if="iconClass"></i> |  |       <i :class="typeClass" v-else></i> |  |       <slot> |  |         <p v-if="!dangerouslyUseHTMLString" class="el-message__content">{{ message }}</p> |  |         <p v-else v-html="message" class="el-message__content"></p> |  |       </slot> |  |       <i v-if="showClose" class="el-message__closeBtn el-icon-close" @click="close"></i> |  |     </div> |  |   </transition> |  | </template> |  |   |  | <script type="text/babel"> |  |   const typeMap = { |  |     success: 'success', |  |     info: 'info', |  |     warning: 'warning', |  |     error: 'error' |  |   }; |  |   |  |   export default { |  |     data() { |  |       return { |  |         visible: false, |  |         message: '', |  |         duration: 3000, |  |         type: 'info', |  |         iconClass: '', |  |         customClass: '', |  |         onClose: null, |  |         showClose: false, |  |         closed: false, |  |         verticalOffset: 20, |  |         timer: null, |  |         dangerouslyUseHTMLString: false, |  |         center: false |  |       }; |  |     }, |  |   |  |     computed: { |  |       typeClass() { |  |         return this.type && !this.iconClass |  |           ? `el-message__icon el-icon-${ typeMap[this.type] }` |  |           : ''; |  |       }, |  |       positionStyle() { |  |         return { |  |           'top': `${ this.verticalOffset }px` |  |         }; |  |       } |  |     }, |  |   |  |     watch: { |  |       closed(newVal) { |  |         if (newVal) { |  |           this.visible = false; |  |         } |  |       } |  |     }, |  |   |  |     methods: { |  |       handleAfterLeave() { |  |         this.$destroy(true); |  |         this.$el.parentNode.removeChild(this.$el); |  |       }, |  |   |  |       close() { |  |         this.closed = true; |  |         if (typeof this.onClose === 'function') { |  |           this.onClose(this); |  |         } |  |       }, |  |   |  |       clearTimer() { |  |         clearTimeout(this.timer); |  |       }, |  |   |  |       startTimer() { |  |         if (this.duration > 0) { |  |           this.timer = setTimeout(() => { |  |             if (!this.closed) { |  |               this.close(); |  |             } |  |           }, this.duration); |  |         } |  |       }, |  |       keydown(e) { |  |         if (e.keyCode === 27) { // esc关闭消息 |  |           if (!this.closed) { |  |             this.close(); |  |           } |  |         } |  |       } |  |     }, |  |     mounted() { |  |       this.startTimer(); |  |       document.addEventListener('keydown', this.keydown); |  |     }, |  |     beforeDestroy() { |  |       document.removeEventListener('keydown', this.keydown); |  |     } |  |   }; |  | </script> | 
 |