提交 fab3f14d 编写于 作者: inkwalk's avatar inkwalk

fix(h5): mediaQueryObserver remove listeners

上级 0114e258
...@@ -1653,56 +1653,56 @@ function useProvideLabel() { ...@@ -1653,56 +1653,56 @@ function useProvideLabel() {
}); });
return handlers; return handlers;
} }
function useListeners$1(props2, listeners) { function useListeners$1(props2, listeners2) {
_addListeners(props2.id, listeners); _addListeners(props2.id, listeners2);
watch(() => props2.id, (newId, oldId) => { watch(() => props2.id, (newId, oldId) => {
_removeListeners(oldId, listeners, true); _removeListeners(oldId, listeners2, true);
_addListeners(newId, listeners, true); _addListeners(newId, listeners2, true);
}); });
onUnmounted(() => { onUnmounted(() => {
_removeListeners(props2.id, listeners); _removeListeners(props2.id, listeners2);
}); });
} }
function _addListeners(id2, listeners, watch2) { function _addListeners(id2, listeners2, watch2) {
const pageId = useCurrentPageId(); const pageId = useCurrentPageId();
if (watch2 && !id2) { if (watch2 && !id2) {
return; return;
} }
if (!isPlainObject(listeners)) { if (!isPlainObject(listeners2)) {
return; return;
} }
Object.keys(listeners).forEach((name) => { Object.keys(listeners2).forEach((name) => {
if (watch2) { if (watch2) {
if (name.indexOf("@") !== 0 && name.indexOf("uni-") !== 0) { if (name.indexOf("@") !== 0 && name.indexOf("uni-") !== 0) {
UniViewJSBridge.on(`uni-${name}-${pageId}-${id2}`, listeners[name]); UniViewJSBridge.on(`uni-${name}-${pageId}-${id2}`, listeners2[name]);
} }
} else { } else {
if (name.indexOf("uni-") === 0) { if (name.indexOf("uni-") === 0) {
UniViewJSBridge.on(name, listeners[name]); UniViewJSBridge.on(name, listeners2[name]);
} else if (id2) { } else if (id2) {
UniViewJSBridge.on(`uni-${name}-${pageId}-${id2}`, listeners[name]); UniViewJSBridge.on(`uni-${name}-${pageId}-${id2}`, listeners2[name]);
} }
} }
}); });
} }
function _removeListeners(id2, listeners, watch2) { function _removeListeners(id2, listeners2, watch2) {
const pageId = useCurrentPageId(); const pageId = useCurrentPageId();
if (watch2 && !id2) { if (watch2 && !id2) {
return; return;
} }
if (!isPlainObject(listeners)) { if (!isPlainObject(listeners2)) {
return; return;
} }
Object.keys(listeners).forEach((name) => { Object.keys(listeners2).forEach((name) => {
if (watch2) { if (watch2) {
if (name.indexOf("@") !== 0 && name.indexOf("uni-") !== 0) { if (name.indexOf("@") !== 0 && name.indexOf("uni-") !== 0) {
UniViewJSBridge.off(`uni-${name}-${pageId}-${id2}`, listeners[name]); UniViewJSBridge.off(`uni-${name}-${pageId}-${id2}`, listeners2[name]);
} }
} else { } else {
if (name.indexOf("uni-") === 0) { if (name.indexOf("uni-") === 0) {
UniViewJSBridge.off(name, listeners[name]); UniViewJSBridge.off(name, listeners2[name]);
} else if (id2) { } else if (id2) {
UniViewJSBridge.off(`uni-${name}-${pageId}-${id2}`, listeners[name]); UniViewJSBridge.off(`uni-${name}-${pageId}-${id2}`, listeners2[name]);
} }
} }
}); });
...@@ -5696,8 +5696,8 @@ function removeIntersectionObserver({ reqId, component }, _pageId) { ...@@ -5696,8 +5696,8 @@ function removeIntersectionObserver({ reqId, component }, _pageId) {
delete $el.__io[reqId]; delete $el.__io[reqId];
} }
} }
let mediaQueryObserver; let mediaQueryObservers = {};
let listener$2; let listeners = {};
function handleMediaQueryStr($props) { function handleMediaQueryStr($props) {
const mediaQueryArr = []; const mediaQueryArr = [];
const propsMenu = [ const propsMenu = [
...@@ -5724,14 +5724,18 @@ function humpToLine(name) { ...@@ -5724,14 +5724,18 @@ function humpToLine(name) {
return name.replace(/([A-Z])/g, "-$1").toLowerCase(); return name.replace(/([A-Z])/g, "-$1").toLowerCase();
} }
function addMediaQueryObserver({ reqId, component, options, callback }, _pageId) { function addMediaQueryObserver({ reqId, component, options, callback }, _pageId) {
mediaQueryObserver = window.matchMedia(handleMediaQueryStr(options)); const mediaQueryObserver = mediaQueryObservers[reqId] = window.matchMedia(handleMediaQueryStr(options));
listener$2 = (observer) => callback(observer.matches); const listener2 = listeners[reqId] = (observer) => callback(observer.matches);
listener$2(mediaQueryObserver); listener2(mediaQueryObserver);
mediaQueryObserver.addListener(listener$2); mediaQueryObserver.addListener(listener2);
} }
function removeMediaQueryObserver({ reqId, component }, _pageId) { function removeMediaQueryObserver({ reqId, component }, _pageId) {
const listener2 = listeners[reqId];
const mediaQueryObserver = mediaQueryObservers[reqId];
if (mediaQueryObserver) { if (mediaQueryObserver) {
mediaQueryObserver.removeListener(listener$2); mediaQueryObserver.removeListener(listener2);
delete listeners[reqId];
delete mediaQueryObservers[reqId];
} }
} }
function saveImage(base64, dirname, callback) { function saveImage(base64, dirname, callback) {
...@@ -8346,7 +8350,7 @@ const useAttrs = (params = {}) => { ...@@ -8346,7 +8350,7 @@ const useAttrs = (params = {}) => {
const { excludeListeners = false, excludeKeys = [] } = params; const { excludeListeners = false, excludeKeys = [] } = params;
const instance2 = getCurrentInstance(); const instance2 = getCurrentInstance();
const attrs2 = shallowRef({}); const attrs2 = shallowRef({});
const listeners = shallowRef({}); const listeners2 = shallowRef({});
const excludeAttrs = shallowRef({}); const excludeAttrs = shallowRef({});
const allExcludeKeys = excludeKeys.concat(DEFAULT_EXCLUDE_KEYS); const allExcludeKeys = excludeKeys.concat(DEFAULT_EXCLUDE_KEYS);
instance2.attrs = reactive(instance2.attrs); instance2.attrs = reactive(instance2.attrs);
...@@ -8369,10 +8373,10 @@ const useAttrs = (params = {}) => { ...@@ -8369,10 +8373,10 @@ const useAttrs = (params = {}) => {
listeners: {} listeners: {}
}); });
attrs2.value = res.attrs; attrs2.value = res.attrs;
listeners.value = res.listeners; listeners2.value = res.listeners;
excludeAttrs.value = res.exclude; excludeAttrs.value = res.exclude;
}); });
return { $attrs: attrs2, $listeners: listeners, $excludeAttrs: excludeAttrs }; return { $attrs: attrs2, $listeners: listeners2, $excludeAttrs: excludeAttrs };
}; };
function flatVNode(nodes) { function flatVNode(nodes) {
const array = []; const array = [];
......
...@@ -3,8 +3,8 @@ import { ...@@ -3,8 +3,8 @@ import {
RemoveMediaQueryObserverArgs, RemoveMediaQueryObserverArgs,
} from '@dcloudio/uni-api' } from '@dcloudio/uni-api'
let mediaQueryObserver: MediaQueryList let mediaQueryObservers: any = {}
let listener: (e: MediaQueryList) => void let listeners: any = {}
// 拼接媒体查询条件 // 拼接媒体查询条件
function handleMediaQueryStr($props: UniApp.DescriptorOptions) { function handleMediaQueryStr($props: UniApp.DescriptorOptions) {
...@@ -48,11 +48,12 @@ export function addMediaQueryObserver( ...@@ -48,11 +48,12 @@ export function addMediaQueryObserver(
_pageId: number _pageId: number
) { ) {
// 创建一个媒体查询对象 // 创建一个媒体查询对象
mediaQueryObserver = window.matchMedia(handleMediaQueryStr(options)) const mediaQueryObserver = (mediaQueryObservers[reqId] = window.matchMedia(
handleMediaQueryStr(options)
))
// 创建一个监听器 // 创建一个监听器
listener = (observer) => callback(observer.matches as any) const listener = (listeners[reqId] = (observer: any) =>
callback(observer.matches as any))
listener(mediaQueryObserver) // 监听前执行一次媒体查询 listener(mediaQueryObserver) // 监听前执行一次媒体查询
mediaQueryObserver.addListener(listener as any) mediaQueryObserver.addListener(listener as any)
} }
...@@ -62,7 +63,11 @@ export function removeMediaQueryObserver( ...@@ -62,7 +63,11 @@ export function removeMediaQueryObserver(
{ reqId, component }: RemoveMediaQueryObserverArgs, { reqId, component }: RemoveMediaQueryObserverArgs,
_pageId: number _pageId: number
) { ) {
const listener = listeners[reqId]
const mediaQueryObserver = mediaQueryObservers[reqId]
if (mediaQueryObserver) { if (mediaQueryObserver) {
mediaQueryObserver.removeListener(listener as any) // 移除监听 mediaQueryObserver.removeListener(listener as any) // 移除监听
delete listeners[reqId]
delete mediaQueryObservers[reqId]
} }
} }
...@@ -4044,7 +4044,7 @@ function createVueApp(rootComponent, rootProps = null) { ...@@ -4044,7 +4044,7 @@ function createVueApp(rootComponent, rootProps = null) {
function withModifiers() { } function withModifiers() { }
function createVNode$1() { } function createVNode$1() { }
function initHooks(options, instance, publicThis) { function applyOptions(options, instance, publicThis) {
options.mpType || publicThis.$mpType; options.mpType || publicThis.$mpType;
// 为了组件也可以监听部分生命周期,故不再判断mpType,统一添加on开头的生命周期 // 为了组件也可以监听部分生命周期,故不再判断mpType,统一添加on开头的生命周期
Object.keys(options).forEach((name) => { Object.keys(options).forEach((name) => {
...@@ -4057,10 +4057,6 @@ function initHooks(options, instance, publicThis) { ...@@ -4057,10 +4057,6 @@ function initHooks(options, instance, publicThis) {
}); });
} }
function applyOptions(options, instance, publicThis) {
initHooks(options, instance, publicThis);
}
function set(target, key, val) { function set(target, key, val) {
return (target[key] = val); return (target[key] = val);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册