123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { isObj } from '../common/utils';
  2. const defaultOptions = {
  3. type: 'text',
  4. mask: false,
  5. message: '',
  6. show: true,
  7. zIndex: 1000,
  8. duration: 3000,
  9. position: 'middle',
  10. forbidClick: false,
  11. loadingType: 'circular',
  12. selector: '#van-toast'
  13. };
  14. let queue = [];
  15. let currentOptions = Object.assign({}, defaultOptions);
  16. function parseOptions(message) {
  17. return isObj(message) ? message : { message };
  18. }
  19. function getContext() {
  20. const pages = getCurrentPages();
  21. return pages[pages.length - 1];
  22. }
  23. const Toast = (options = {}) => {
  24. options = Object.assign({}, currentOptions, parseOptions(options));
  25. const context = options.context || getContext();
  26. const toast = context.selectComponent(options.selector);
  27. if (!toast) {
  28. console.warn('未找到 van-toast 节点,请确认 selector 及 context 是否正确');
  29. return;
  30. }
  31. delete options.context;
  32. delete options.selector;
  33. queue.push(toast);
  34. toast.set(options);
  35. clearTimeout(toast.timer);
  36. if (options.duration > 0) {
  37. toast.timer = setTimeout(() => {
  38. toast.clear();
  39. queue = queue.filter(item => item !== toast);
  40. }, options.duration);
  41. }
  42. return toast;
  43. };
  44. const createMethod = type => options => Toast(Object.assign({ type }, parseOptions(options)));
  45. ['loading', 'success', 'fail'].forEach(method => {
  46. Toast[method] = createMethod(method);
  47. });
  48. Toast.clear = () => {
  49. queue.forEach(toast => {
  50. toast.clear();
  51. });
  52. queue = [];
  53. };
  54. Toast.setDefaultOptions = options => {
  55. Object.assign(currentOptions, options);
  56. };
  57. Toast.resetDefaultOptions = () => {
  58. currentOptions = Object.assign({}, defaultOptions);
  59. };
  60. export default Toast;