123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <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>
|