From 6b46294539527ceb3e8f328c0f536d0e48aa1035 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Tue, 14 Sep 2021 17:49:09 +0800 Subject: [PATCH] fix(h5): add effectScope --- packages/uni-h5/dist/uni-h5.es.js | 46 +++++++++---------- .../src/service/api/ui/popup/showToast.ts | 45 +++++++++--------- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index f3797613a..34ec8bbc9 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -1,4 +1,4 @@ -import { withModifiers, createVNode, getCurrentInstance, ref, defineComponent, openBlock, createElementBlock, provide, computed, watch, onUnmounted, inject, onBeforeUnmount, mergeProps, injectHook, reactive, onActivated, onMounted, nextTick, onBeforeMount, withDirectives, vShow, shallowRef, watchEffect, isVNode, Fragment, markRaw, createTextVNode, onBeforeActivate, onBeforeDeactivate, createBlock, renderList, onDeactivated, createApp, Transition, withCtx, KeepAlive, resolveDynamicComponent, createElementVNode, normalizeStyle, renderSlot } from "vue"; +import { withModifiers, createVNode, getCurrentInstance, ref, defineComponent, openBlock, createElementBlock, provide, computed, watch, onUnmounted, inject, onBeforeUnmount, mergeProps, injectHook, reactive, onActivated, onMounted, nextTick, onBeforeMount, withDirectives, vShow, shallowRef, watchEffect, isVNode, Fragment, markRaw, createTextVNode, onBeforeActivate, onBeforeDeactivate, createBlock, renderList, onDeactivated, createApp, Transition, effectScope, withCtx, KeepAlive, resolveDynamicComponent, createElementVNode, normalizeStyle, renderSlot } from "vue"; import { isString, extend, stringifyStyle, parseStringStyle, isPlainObject, isFunction, capitalize, camelize, isArray, hasOwn, isObject, toRawType, makeMap as makeMap$1, isPromise, hyphenate, invokeArrayFns as invokeArrayFns$1 } from "@vue/shared"; import { I18N_JSON_DELIMITERS, once, passive, initCustomDataset, invokeArrayFns, resolveOwnerVm, resolveOwnerEl, ON_WXS_INVOKE_CALL_METHOD, normalizeTarget, ON_RESIZE, ON_APP_ENTER_FOREGROUND, ON_APP_ENTER_BACKGROUND, ON_SHOW, ON_HIDE, ON_PAGE_SCROLL, ON_REACH_BOTTOM, EventChannel, SCHEME_RE, DATA_RE, getCustomDataset, ON_ERROR, callOptions, ON_LAUNCH, PRIMARY_COLOR, removeLeadingSlash, getLen, debounce, UniLifecycleHooks, NAVBAR_HEIGHT, parseQuery, ON_UNLOAD, ON_REACH_BOTTOM_DISTANCE, decodedQuery, WEB_INVOKE_APPSERVICE, ON_WEB_INVOKE_APP_SERVICE, updateElementStyle, ON_BACK_PRESS, parseUrl, addFont, scrollTo, RESPONSIVE_MIN_WIDTH, formatDateTime, ON_PULL_DOWN_REFRESH } from "@dcloudio/uni-shared"; import { initVueI18n, isI18nStr, LOCALE_EN, LOCALE_ES, LOCALE_FR, LOCALE_ZH_HANS, LOCALE_ZH_HANT } from "@dcloudio/uni-i18n"; @@ -7219,9 +7219,9 @@ function text(Quill) { } ]; const result = {}; - text2.forEach(({ name, scope }) => { + text2.forEach(({ name, scope: scope2 }) => { result[`formats/${name}`] = new Attributor.Style(name, hyphenate(name), { - scope + scope: scope2 }); }); return result; @@ -17706,7 +17706,7 @@ var modal = /* @__PURE__ */ defineComponent({ } }); let showModalState; -const onHidePopupOnce$2 = /* @__PURE__ */ once(() => { +const onHidePopupOnce$1 = /* @__PURE__ */ once(() => { UniServiceJSBridge.on("onHidePopup", () => showModalState.visible = false); }); let currentShowModalResolve; @@ -17717,7 +17717,7 @@ function onModalClose(type) { }); } const showModal = /* @__PURE__ */ defineAsyncApi(API_SHOW_MODAL, (args, { resolve }) => { - onHidePopupOnce$2(); + onHidePopupOnce$1(); currentShowModalResolve = resolve; if (!showModalState) { showModalState = reactive(args); @@ -17823,27 +17823,29 @@ function useToastIcon(props2) { let showToastState; let showType = ""; let timeoutId; -const onHidePopupOnce$1 = /* @__PURE__ */ once(() => { - UniServiceJSBridge.on("onHidePopup", () => hidePopup("onHidePopup")); -}); -const watchVisibleOnce = /* @__PURE__ */ once(() => { - watch([() => showToastState.visible, () => showToastState.duration], ([visible, duration]) => { - if (visible) { - timeoutId && clearTimeout(timeoutId); - if (showType === "onShowLoading") - return; - timeoutId = setTimeout(() => { - hidePopup("onHideToast"); - }, duration); - } else { - timeoutId && clearTimeout(timeoutId); - } +const scope = effectScope(); +function watchVisible() { + scope.run(() => { + watch([() => showToastState.visible, () => showToastState.duration], ([visible, duration]) => { + if (visible) { + timeoutId && clearTimeout(timeoutId); + if (showType === "onShowLoading") + return; + timeoutId = setTimeout(() => { + hidePopup("onHideToast"); + }, duration); + } else { + timeoutId && clearTimeout(timeoutId); + } + }); }); -}); +} function createToast(args) { if (!showToastState) { showToastState = reactive(extend(args, { visible: false })); nextTick(() => { + watchVisible(); + UniServiceJSBridge.on("onHidePopup", () => hidePopup("onHidePopup")); createRootApp(Toast, showToastState, () => { }).mount(ensureRoot("u-a-t")); }); @@ -17853,8 +17855,6 @@ function createToast(args) { setTimeout(() => { showToastState.visible = true; }, 10); - watchVisibleOnce(); - onHidePopupOnce$1(); } const showToast = /* @__PURE__ */ defineAsyncApi(API_SHOW_TOAST, (args, { resolve, reject }) => { createToast(args); diff --git a/packages/uni-h5/src/service/api/ui/popup/showToast.ts b/packages/uni-h5/src/service/api/ui/popup/showToast.ts index 45c081d2a..89c940095 100644 --- a/packages/uni-h5/src/service/api/ui/popup/showToast.ts +++ b/packages/uni-h5/src/service/api/ui/popup/showToast.ts @@ -1,5 +1,5 @@ //#region Functions -import { reactive, nextTick, watch } from 'vue' +import { reactive, nextTick, watch, effectScope } from 'vue' import { extend } from '@vue/shared' import { defineAsyncApi, @@ -24,38 +24,39 @@ import type { API_TYPE_HIDE_LOADING, API_TYPE_SHOW_TOAST, } from '@dcloudio/uni-api' -import { once } from '@dcloudio/uni-shared' //#endregion let showToastState: ToastProps let showType: 'onShowToast' | 'onShowLoading' | '' = '' let timeoutId: number -const onHidePopupOnce = /*#__PURE__*/ once(() => { - UniServiceJSBridge.on('onHidePopup', () => hidePopup('onHidePopup')) -}) -const watchVisibleOnce = /*#__PURE__*/ once(() => { - watch( - [() => showToastState.visible, () => showToastState.duration], - ([visible, duration]) => { - if (visible) { - timeoutId && clearTimeout(timeoutId) - if (showType === 'onShowLoading') return - timeoutId = setTimeout(() => { - hidePopup('onHideToast') - }, duration) - } else { - timeoutId && clearTimeout(timeoutId) +const scope = effectScope() +function watchVisible() { + scope.run(() => { + watch( + [() => showToastState.visible, () => showToastState.duration], + ([visible, duration]) => { + if (visible) { + timeoutId && clearTimeout(timeoutId) + if (showType === 'onShowLoading') return + timeoutId = setTimeout(() => { + hidePopup('onHideToast') + }, duration) + } else { + timeoutId && clearTimeout(timeoutId) + } } - } - ) -}) + ) + }) +} function createToast(args: ToastProps) { if (!showToastState) { showToastState = reactive(extend(args, { visible: false })) // 异步执行,避免干扰 getCurrentInstance nextTick(() => { + watchVisible() + UniServiceJSBridge.on('onHidePopup', () => hidePopup('onHidePopup')) createRootApp(Toast, showToastState, () => {}).mount(ensureRoot('u-a-t')) }) } else { @@ -66,10 +67,6 @@ function createToast(args: ToastProps) { // 延迟一下 show 可解决窗口打开前调用 showToast 在 onHidePopup 之后触发 showToastState.visible = true }, 10) - - watchVisibleOnce() - - onHidePopupOnce() } export const showToast = defineAsyncApi( -- GitLab