47fc1a627909854e5b6bcc259076bb0193b0358f7192c6dbb131ea5d3ce5050f2254d6dd348a7897e000d21d5b403423c7e96b0fc77f9b848242c58c09646e 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import Vue from 'vue';
  2. import Main from './main.vue';
  3. import { PopupManager } from 'element-ui/src/utils/popup';
  4. import { isVNode } from 'element-ui/src/utils/vdom';
  5. import { isObject } from 'element-ui/src/utils/types';
  6. let MessageConstructor = Vue.extend(Main);
  7. let instance;
  8. let instances = [];
  9. let seed = 1;
  10. const Message = function(options) {
  11. if (Vue.prototype.$isServer) return;
  12. options = options || {};
  13. if (typeof options === 'string') {
  14. options = {
  15. message: options
  16. };
  17. }
  18. let userOnClose = options.onClose;
  19. let id = 'message_' + seed++;
  20. options.onClose = function() {
  21. Message.close(id, userOnClose);
  22. };
  23. instance = new MessageConstructor({
  24. data: options
  25. });
  26. instance.id = id;
  27. if (isVNode(instance.message)) {
  28. instance.$slots.default = [instance.message];
  29. instance.message = null;
  30. }
  31. instance.$mount();
  32. document.body.appendChild(instance.$el);
  33. let verticalOffset = options.offset || 20;
  34. instances.forEach(item => {
  35. verticalOffset += item.$el.offsetHeight + 16;
  36. });
  37. instance.verticalOffset = verticalOffset;
  38. instance.visible = true;
  39. instance.$el.style.zIndex = PopupManager.nextZIndex();
  40. instances.push(instance);
  41. return instance;
  42. };
  43. ['success', 'warning', 'info', 'error'].forEach(type => {
  44. Message[type] = (options) => {
  45. if (isObject(options) && !isVNode(options)) {
  46. return Message({
  47. ...options,
  48. type
  49. });
  50. }
  51. return Message({
  52. type,
  53. message: options
  54. });
  55. };
  56. });
  57. Message.close = function(id, userOnClose) {
  58. let len = instances.length;
  59. let index = -1;
  60. let removedHeight;
  61. for (let i = 0; i < len; i++) {
  62. if (id === instances[i].id) {
  63. removedHeight = instances[i].$el.offsetHeight;
  64. index = i;
  65. if (typeof userOnClose === 'function') {
  66. userOnClose(instances[i]);
  67. }
  68. instances.splice(i, 1);
  69. break;
  70. }
  71. }
  72. if (len <= 1 || index === -1 || index > instances.length - 1) return;
  73. for (let i = index; i < len - 1 ; i++) {
  74. let dom = instances[i].$el;
  75. dom.style['top'] =
  76. parseInt(dom.style['top'], 10) - removedHeight - 16 + 'px';
  77. }
  78. };
  79. Message.closeAll = function() {
  80. for (let i = instances.length - 1; i >= 0; i--) {
  81. instances[i].close();
  82. }
  83. };
  84. export default Message;