diff --git a/example/pages/toast/index.js b/example/pages/toast/index.js index 211e722d..e0f091b2 100644 --- a/example/pages/toast/index.js +++ b/example/pages/toast/index.js @@ -4,10 +4,11 @@ Page({ data: {}, showToast() { - Toast({ - message: 'toast的内容', + Toast.setDefaultOptions({ selector: '#zan-toast-test' - }) + }); + + Toast('toast的内容'); }, showIconToast() { diff --git a/packages/toast/README.md b/packages/toast/README.md index 140caa9b..3027698d 100644 --- a/packages/toast/README.md +++ b/packages/toast/README.md @@ -42,6 +42,8 @@ Toast.loading({ | Toast | `options`, `timeout` | - | 展示提示 | | Toast.loading | `options` | - | 展示加载提示 | | Toast.clear | - | - | 关闭提示 | +| Toast.setDefaultOptions | `options` 格式同 Toast 函数可以传入的参数, `type` 可选 global/page, 分别指定对整个小程序生效/对当前页面生效 | - | 修改默认配置,对所有 Toast 生效 | +| Toast.resetDefaultOptions | `type` 可选 global/page | - | 重置默认配置,对所有 Toast 生效 | #### options 具体参数如下 | 参数 | 说明 | 类型 | 默认值 | 可选值 | diff --git a/packages/toast/toast.js b/packages/toast/toast.js index e62ff282..a8c41b00 100644 --- a/packages/toast/toast.js +++ b/packages/toast/toast.js @@ -1,15 +1,47 @@ +const TOAST_CONFIG_KEY = 'zanui.__zanToastPageConfig'; + let timeoutData = { timeoutId: 0, toastCtx: null }; -function Toast(options = {}, pageCtx) { +let globalToastUserConfig = {}; + +// 获取页面上下文 +function getPageCtx(pageCtx) { let ctx = pageCtx; + if (!ctx) { const pages = getCurrentPages(); ctx = pages[pages.length - 1]; } - const toastCtx = ctx.selectComponent(options.selector); + + return ctx; +} + +// 获取当前页面的 toast 配置数据 +function getPageToastConfig(pageCtx) { + const zanuiData = pageCtx.data.zanui || {}; + return zanuiData.__zanToastPageConfig || {}; +} + +// Toast 显示函数 +function Toast(optionsOrMsg, pageCtx) { + // 参数格式化处理 + // 如果是文字,默认为 message + let options = optionsOrMsg || {}; + if (typeof optionsOrMsg === 'string') { + options = { message: optionsOrMsg }; + } + + let ctx = getPageCtx(pageCtx); + const pageToastUserSetting = getPageToastConfig(ctx); + const parsedOptions = { + ...globalToastUserConfig, + ...pageToastUserSetting, + ...options + }; + const toastCtx = ctx.selectComponent(parsedOptions.selector); if (!toastCtx) { console.error('无法找到对应的toast组件,请于页面中注册并在 wxml 中声明 toast 自定义组件'); @@ -21,13 +53,13 @@ function Toast(options = {}, pageCtx) { } toastCtx.show({ - ...options, + ...parsedOptions, show: true }); const timeoutId = setTimeout(() => { toastCtx.clear(); - }, options.timeout || 3000); + }, parsedOptions.timeout || 3000); timeoutData = { timeoutId, @@ -35,6 +67,40 @@ function Toast(options = {}, pageCtx) { }; } +// 设置 toast 基础属性 +Toast.setDefaultOptions = function (options = {}, type = 'page') { + const parsedDefaultOptions = { + selector: options.selector || '', + type: options.type || '', + icon: options.icon || '', + image: options.image || '', + timeout: options.timeout || 3000 + }; + + if (type === 'global') { + globalToastUserConfig = { + ...parsedDefaultOptions + }; + } else if (type === 'page') { + let ctx = getPageCtx(); + ctx.setData({ + [`${TOAST_CONFIG_KEY}`]: parsedDefaultOptions + }); + } +}; + +// 重置 toast 基础属性 +Toast.resetDefaultOptions = function (type = 'page') { + if (type === 'global') { + globalToastUserConfig = {}; + } else { + let ctx = getPageCtx(); + ctx.setData({ + [`${TOAST_CONFIG_KEY}`]: {} + }); + } +}; + // 清理所有 toast Toast.clear = function () { clearTimeout(timeoutData.timeoutId);