toast.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. 'use strict';
  2. var TOAST_CONFIG_KEY = 'zanui.__zanToastPageConfig';
  3. var DEFAULT_SHOW_TOAST_TIME = 3000;
  4. var timeoutData = {
  5. timeoutId: 0,
  6. toastCtx: null
  7. };
  8. var globalToastUserConfig = {};
  9. // 获取页面上下文
  10. function getPageCtx(pageCtx) {
  11. var ctx = pageCtx;
  12. if (!ctx) {
  13. var pages = getCurrentPages();
  14. ctx = pages[pages.length - 1];
  15. }
  16. return ctx;
  17. }
  18. // 获取当前页面的 toast 配置数据
  19. function getPageToastConfig(pageCtx) {
  20. var zanuiData = pageCtx.data.zanui || {};
  21. return zanuiData.__zanToastPageConfig || {};
  22. }
  23. // Toast 显示函数
  24. function Toast(optionsOrMsg, pageCtx) {
  25. // 参数格式化处理
  26. // 如果是文字,默认为 message
  27. var options = optionsOrMsg || {};
  28. if (typeof optionsOrMsg === 'string') {
  29. options = { message: optionsOrMsg };
  30. }
  31. var ctx = getPageCtx(pageCtx);
  32. var pageToastUserSetting = getPageToastConfig(ctx);
  33. var parsedOptions = Object.assign({}, globalToastUserConfig, pageToastUserSetting, options);
  34. var toastCtx = ctx.selectComponent(parsedOptions.selector);
  35. if (!toastCtx) {
  36. console.error('无法找到对应的toast组件,请于页面中注册并在 wxml 中声明 toast 自定义组件');
  37. return;
  38. }
  39. if (timeoutData.timeoutId) {
  40. Toast.clear();
  41. }
  42. toastCtx.show(Object.assign({}, parsedOptions, {
  43. show: true
  44. }));
  45. var timeoutId = 0;
  46. // toast 计时,如果小于0,就不会去关闭。
  47. // 如果不传,就取默认值
  48. var timeoutOption = parsedOptions.timeout || DEFAULT_SHOW_TOAST_TIME;
  49. if (timeoutOption >= 0) {
  50. timeoutId = setTimeout(function () {
  51. toastCtx.clear();
  52. }, timeoutOption);
  53. }
  54. timeoutData = {
  55. timeoutId: timeoutId,
  56. toastCtx: toastCtx
  57. };
  58. }
  59. // 设置 toast 基础属性
  60. Toast.setDefaultOptions = function () {
  61. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  62. var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'page';
  63. var parsedDefaultOptions = {
  64. selector: options.selector || '',
  65. type: options.type || '',
  66. icon: options.icon || '',
  67. image: options.image || '',
  68. timeout: options.timeout || DEFAULT_SHOW_TOAST_TIME
  69. };
  70. if (type === 'global') {
  71. globalToastUserConfig = Object.assign({}, parsedDefaultOptions);
  72. } else if (type === 'page') {
  73. var _ctx$setData;
  74. var ctx = getPageCtx();
  75. ctx.setData((_ctx$setData = {}, _ctx$setData['' + TOAST_CONFIG_KEY] = parsedDefaultOptions, _ctx$setData));
  76. }
  77. };
  78. // 重置 toast 基础属性
  79. Toast.resetDefaultOptions = function () {
  80. var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'page';
  81. if (type === 'global') {
  82. globalToastUserConfig = {};
  83. } else {
  84. var _ctx$setData2;
  85. var ctx = getPageCtx();
  86. ctx.setData((_ctx$setData2 = {}, _ctx$setData2['' + TOAST_CONFIG_KEY] = {}, _ctx$setData2));
  87. }
  88. };
  89. // 清理所有 toast
  90. Toast.clear = function () {
  91. clearTimeout(timeoutData.timeoutId);
  92. try {
  93. timeoutData.toastCtx && timeoutData.toastCtx.clear();
  94. } catch (e) {}
  95. timeoutData = {
  96. timeoutId: 0,
  97. toastCtx: null
  98. };
  99. };
  100. // 显示 loading
  101. Toast.loading = function () {
  102. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  103. Toast(Object.assign({}, options, {
  104. type: 'loading'
  105. }));
  106. };
  107. module.exports = Toast;