diff --git a/packages/shims-vue-runtime.d.ts b/packages/shims-vue-runtime.d.ts index 0aa5b368cdc8338fb84af622a1244a3f5d4f9cd3..6631d19d84119f4a1a0d56dff64b7cb3ebe09d04 100644 --- a/packages/shims-vue-runtime.d.ts +++ b/packages/shims-vue-runtime.d.ts @@ -8,6 +8,7 @@ declare module '@vue/runtime-core' { } // 目前 H5,APP 平台 getCurrentPages 中获取的 page 对象调整为 vm 对象 $getAppWebview?: () => PlusWebviewWebviewObject + $requireNativePlugin?: (name: string) => unknown getOpenerEventChannel: () => EventChannel $page: Page.PageInstance['$page'] $mpType?: 'app' | 'page' diff --git a/packages/uni-app-plus/dist/uni.runtime.esm.js b/packages/uni-app-plus/dist/uni.runtime.esm.js index 60d854f1b39f187af350e39e4208813256e91b55..4844aa87b3915bba24542d33058dc6a8afc32e6e 100644 --- a/packages/uni-app-plus/dist/uni.runtime.esm.js +++ b/packages/uni-app-plus/dist/uni.runtime.esm.js @@ -1,5 +1,5 @@ import { isArray as isArray$1, hasOwn as hasOwn$1, isString, isPlainObject, isObject as isObject$1, toRawType, capitalize, makeMap, isFunction, isPromise, extend, remove, toTypeString } from '@vue/shared'; -import { LINEFEED, once, I18N_JSON_DELIMITERS, Emitter, addLeadingSlash, resolveComponentInstance, invokeArrayFns, ON_RESIZE, ON_APP_ENTER_FOREGROUND, ON_APP_ENTER_BACKGROUND, ON_SHOW, ON_HIDE, ON_PAGE_SCROLL, ON_REACH_BOTTOM, SCHEME_RE, DATA_RE, cacheStringFunction, parseQuery, ON_ERROR, callOptions, ON_UNHANDLE_REJECTION, ON_PAGE_NOT_FOUND, PRIMARY_COLOR, removeLeadingSlash, getLen, formatLog, TABBAR_HEIGHT, NAVBAR_HEIGHT, ON_THEME_CHANGE, ON_KEYBOARD_HEIGHT_CHANGE, BACKGROUND_COLOR, ON_NAVIGATION_BAR_BUTTON_TAP, stringifyQuery as stringifyQuery$1, debounce, ON_PULL_DOWN_REFRESH, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_BACK_PRESS, UniNode, NODE_TYPE_PAGE, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_INSERT, ACTION_TYPE_CREATE, ACTION_TYPE_REMOVE, ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ON_READY, ON_UNLOAD, EventChannel, ON_REACH_BOTTOM_DISTANCE, parseUrl, onCreateVueApp, ON_TAB_ITEM_TAP, ON_LAUNCH, ACTION_TYPE_EVENT, createUniEvent, ON_WXS_INVOKE_CALL_METHOD, WEB_INVOKE_APPSERVICE } from '@dcloudio/uni-shared'; +import { LINEFEED, parseNVueDataset, once, I18N_JSON_DELIMITERS, Emitter, addLeadingSlash, resolveComponentInstance, invokeArrayFns, ON_RESIZE, ON_APP_ENTER_FOREGROUND, ON_APP_ENTER_BACKGROUND, ON_SHOW, ON_HIDE, ON_PAGE_SCROLL, ON_REACH_BOTTOM, SCHEME_RE, DATA_RE, cacheStringFunction, parseQuery, ON_ERROR, callOptions, ON_UNHANDLE_REJECTION, ON_PAGE_NOT_FOUND, PRIMARY_COLOR, removeLeadingSlash, getLen, formatLog, TABBAR_HEIGHT, NAVBAR_HEIGHT, ON_THEME_CHANGE, ON_KEYBOARD_HEIGHT_CHANGE, BACKGROUND_COLOR, ON_NAVIGATION_BAR_BUTTON_TAP, stringifyQuery as stringifyQuery$1, debounce, ON_PULL_DOWN_REFRESH, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_BACK_PRESS, UniNode, NODE_TYPE_PAGE, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_INSERT, ACTION_TYPE_CREATE, ACTION_TYPE_REMOVE, ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ON_READY, ON_UNLOAD, EventChannel, ON_REACH_BOTTOM_DISTANCE, parseUrl, onCreateVueApp, ON_TAB_ITEM_TAP, ON_LAUNCH, ACTION_TYPE_EVENT, createUniEvent, ON_WXS_INVOKE_CALL_METHOD, WEB_INVOKE_APPSERVICE } from '@dcloudio/uni-shared'; import { ref, injectHook, createVNode, render, queuePostFlushCb, getCurrentInstance, onMounted, nextTick, onBeforeUnmount } from 'vue'; /* @@ -660,7 +660,15 @@ function getBaseSystemInfo() { }; } -function requestComponentInfo(page, reqs, callback) { +function requestComponentInfo(pageVm, reqs, callback) { + if (pageVm.$page.meta.isNVue) { + requestNVueComponentInfo(pageVm, reqs, callback); + } + else { + requestVueComponentInfo(pageVm, reqs, callback); + } +} +function requestVueComponentInfo(pageVm, reqs, callback) { UniServiceJSBridge.invokeViewMethod('requestComponentInfo', { reqs: reqs.map((req) => { if (req.component) { @@ -668,7 +676,65 @@ function requestComponentInfo(page, reqs, callback) { } return req; }), - }, page.$page.id, callback); + }, pageVm.$page.id, callback); +} +function requestNVueComponentInfo(pageVm, reqs, callback) { + const ids = findNVueElementIds(reqs); + const nvueElementInfos = new Array(ids.length); + findNVueElementInfos(ids, pageVm.$el, nvueElementInfos); + findComponentRectAll(pageVm.$requireNativePlugin('dom'), nvueElementInfos, 0, [], (result) => { + callback(result); + }); +} +function findNVueElementIds(reqs) { + const ids = []; + for (let i = 0; i < reqs.length; i++) { + const selector = reqs[i].selector; + if (selector.indexOf('#') === 0) { + ids.push(selector.substring(1)); + } + } + return ids; +} +function findNVueElementInfos(ids, elm, infos) { + const nodes = elm.children; + if (!isArray$1(nodes)) { + return false; + } + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (node.attr) { + const index = ids.indexOf(node.attr.id); + if (index >= 0) { + infos[index] = { + id: ids[index], + ref: node.ref, + dataset: parseNVueDataset(node.attr), + }; + if (ids.length === 1) { + break; + } + } + } + if (node.children) { + findNVueElementInfos(ids, node, infos); + } + } +} +function findComponentRectAll(dom, nvueElementInfos, index, result, callback) { + const attr = nvueElementInfos[index]; + dom.getComponentRect(attr.ref, (option) => { + option.size.id = attr.id; + option.size.dataset = attr.dataset; + result.push(option.size); + index += 1; + if (index < nvueElementInfos.length) { + findComponentRectAll(dom, nvueElementInfos, index, result, callback); + } + else { + callback(result); + } + }); } function setCurrentPageMeta(page, options) { diff --git a/packages/uni-app-plus/src/service/api/ui/requestComponentInfo.ts b/packages/uni-app-plus/src/service/api/ui/requestComponentInfo.ts index 48796134a75f60d7b1dc0984cbdfc83f02e7ad2f..609bcb08aaf5ba7efb8d4a718f4a3ecdf9d97f7a 100644 --- a/packages/uni-app-plus/src/service/api/ui/requestComponentInfo.ts +++ b/packages/uni-app-plus/src/service/api/ui/requestComponentInfo.ts @@ -1,8 +1,22 @@ import { ComponentPublicInstance } from 'vue' +import { isArray } from '@vue/shared' import { SelectorQueryRequest, SelectorQueryNodeInfo } from '@dcloudio/uni-api' +import { NVueElement, parseNVueDataset } from '@dcloudio/uni-shared' export function requestComponentInfo( - page: ComponentPublicInstance, + pageVm: ComponentPublicInstance, + reqs: Array, + callback: (result: Array) => void +) { + if (pageVm.$page.meta.isNVue) { + requestNVueComponentInfo(pageVm, reqs, callback) + } else { + requestVueComponentInfo(pageVm, reqs, callback) + } +} + +function requestVueComponentInfo( + pageVm: ComponentPublicInstance, reqs: Array, callback: (result: Array) => void ) { @@ -16,7 +30,100 @@ export function requestComponentInfo( return req }), }, - page.$page.id, + pageVm.$page.id, callback ) } + +function requestNVueComponentInfo( + pageVm: ComponentPublicInstance, + reqs: Array, + callback: (result: Array) => void +) { + const ids = findNVueElementIds(reqs) + const nvueElementInfos = new Array(ids.length) + findNVueElementInfos(ids, pageVm.$el, nvueElementInfos) + findComponentRectAll( + pageVm.$requireNativePlugin!('dom') as NVueDomModule, + nvueElementInfos, + 0, + [], + (result) => { + callback(result) + } + ) +} + +interface NVueElementInfo { + id: string + ref: string + dataset: Record +} +interface NVueDomModule { + getComponentRect: ( + ref: string, + callback: (res: { size: Record }) => void + ) => void +} + +function findNVueElementIds(reqs: Array) { + const ids = [] + for (let i = 0; i < reqs.length; i++) { + const selector = reqs[i].selector + if (selector.indexOf('#') === 0) { + ids.push(selector.substring(1)) + } + } + return ids +} + +function findNVueElementInfos( + ids: string[], + elm: NVueElement, + infos: NVueElementInfo[] +) { + const nodes = elm.children + if (!isArray(nodes)) { + return false + } + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i] + if (node.attr) { + const index = ids.indexOf(node.attr.id as string) + if (index >= 0) { + infos[index] = { + id: ids[index], + ref: node.ref, + dataset: parseNVueDataset(node.attr), + } + if (ids.length === 1) { + break + } + } + } + if (node.children) { + findNVueElementInfos(ids, node, infos) + } + } +} + +function findComponentRectAll( + dom: NVueDomModule, + nvueElementInfos: NVueElementInfo[], + index: number, + result: Array, + callback: (result: Array) => void +) { + const attr = nvueElementInfos[index] + dom.getComponentRect(attr.ref, (option) => { + option.size.id = attr.id + option.size.dataset = attr.dataset + result.push(option.size) + index += 1 + if (index < nvueElementInfos.length) { + findComponentRectAll(dom, nvueElementInfos, index, result, callback) + } else { + callback(result) + } + }) +} diff --git a/packages/uni-shared/dist/uni-shared.cjs.js b/packages/uni-shared/dist/uni-shared.cjs.js index ff47e2ea974f293e60bfb237cc46cf6e4c05f2f4..6a8f0d6a3efcddcd6ad6a7fd55bec35a22da2f74 100644 --- a/packages/uni-shared/dist/uni-shared.cjs.js +++ b/packages/uni-shared/dist/uni-shared.cjs.js @@ -685,6 +685,18 @@ function formatH5Log(type, filename, ...args) { console[type].apply(console, [...args, filename]); } +function parseNVueDataset(attr) { + const dataset = {}; + if (attr) { + Object.keys(attr).forEach((key) => { + if (key.indexOf('data-') === 0) { + dataset[key.replace('data-', '')] = attr[key]; + } + }); + } + return dataset; +} + function plusReady(callback) { if (typeof callback !== 'function') { return; @@ -1512,6 +1524,7 @@ exports.normalizeTarget = normalizeTarget; exports.onCreateVueApp = onCreateVueApp; exports.once = once; exports.parseEventName = parseEventName; +exports.parseNVueDataset = parseNVueDataset; exports.parseQuery = parseQuery; exports.parseUrl = parseUrl; exports.passive = passive; diff --git a/packages/uni-shared/dist/uni-shared.d.ts b/packages/uni-shared/dist/uni-shared.d.ts index a1122fceac86d216e2b8d88470a4893fd556f24e..0a8a3c985928b75a584ba8b8028b3ca9d53f9cf0 100644 --- a/packages/uni-shared/dist/uni-shared.d.ts +++ b/packages/uni-shared/dist/uni-shared.d.ts @@ -354,6 +354,7 @@ export declare interface NVueElement { type: string; ref: string; text?: string; + attr: Record; styleSheet: Record>>; classList: string[]; parentNode: NVueElement | null; @@ -528,6 +529,8 @@ export declare type PageUpdateAction = CreateAction | InsertAction | RemoveActio export declare function parseEventName(name: string): [string, EventListenerOptions | undefined]; +export declare function parseNVueDataset(attr?: Record): Record; + /** * https://github.com/vuejs/vue-router-next/blob/master/src/query.ts * @internal diff --git a/packages/uni-shared/dist/uni-shared.es.js b/packages/uni-shared/dist/uni-shared.es.js index 7dfbfa5fb292199dfc0ba7c9a60b16c019689462..a448af11692bc0a6d3e43c729074b6b1ef4e8239 100644 --- a/packages/uni-shared/dist/uni-shared.es.js +++ b/packages/uni-shared/dist/uni-shared.es.js @@ -681,6 +681,18 @@ function formatH5Log(type, filename, ...args) { console[type].apply(console, [...args, filename]); } +function parseNVueDataset(attr) { + const dataset = {}; + if (attr) { + Object.keys(attr).forEach((key) => { + if (key.indexOf('data-') === 0) { + dataset[key.replace('data-', '')] = attr[key]; + } + }); + } + return dataset; +} + function plusReady(callback) { if (typeof callback !== 'function') { return; @@ -1366,4 +1378,4 @@ function getEnvLocale() { return (lang && lang.replace(/[.:].*/, '')) || 'en'; } -export { ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_CREATE, ACTION_TYPE_EVENT, ACTION_TYPE_INSERT, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_REMOVE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ATTR_CHANGE_PREFIX, ATTR_CLASS, ATTR_INNER_HTML, ATTR_STYLE, ATTR_TEXT_CONTENT, ATTR_V_OWNER_ID, ATTR_V_RENDERJS, ATTR_V_SHOW, BACKGROUND_COLOR, BUILT_IN_TAGS, BUILT_IN_TAG_NAMES, COMPONENT_NAME_PREFIX, COMPONENT_PREFIX, COMPONENT_SELECTOR_PREFIX, DATA_RE, E$1 as Emitter, EventChannel, EventModifierFlags, I18N_JSON_DELIMITERS, JSON_PROTOCOL, LINEFEED, MINI_PROGRAM_PAGE_RUNTIME_HOOKS, NAVBAR_HEIGHT, NODE_TYPE_COMMENT, NODE_TYPE_ELEMENT, NODE_TYPE_PAGE, NODE_TYPE_TEXT, NVUE_BUILT_IN_TAGS, NVUE_U_BUILT_IN_TAGS, ON_ADD_TO_FAVORITES, ON_APP_ENTER_BACKGROUND, ON_APP_ENTER_FOREGROUND, ON_BACK_PRESS, ON_ERROR, ON_HIDE, ON_KEYBOARD_HEIGHT_CHANGE, ON_LAUNCH, ON_LOAD, ON_NAVIGATION_BAR_BUTTON_TAP, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_PAGE_NOT_FOUND, ON_PAGE_SCROLL, ON_PULL_DOWN_REFRESH, ON_REACH_BOTTOM, ON_REACH_BOTTOM_DISTANCE, ON_READY, ON_RESIZE, ON_SHARE_APP_MESSAGE, ON_SHARE_TIMELINE, ON_SHOW, ON_TAB_ITEM_TAP, ON_THEME_CHANGE, ON_UNHANDLE_REJECTION, ON_UNLOAD, ON_WEB_INVOKE_APP_SERVICE, ON_WXS_INVOKE_CALL_METHOD, PLUS_RE, PRIMARY_COLOR, RENDERJS_MODULES, RESPONSIVE_MIN_WIDTH, SCHEME_RE, SELECTED_COLOR, SLOT_DEFAULT_NAME, TABBAR_HEIGHT, TAGS, UNI_SSR, UNI_SSR_DATA, UNI_SSR_GLOBAL_DATA, UNI_SSR_STORE, UNI_SSR_TITLE, UNI_STORAGE_LOCALE, UniBaseNode, UniCommentNode, UniElement, UniEvent, UniInputElement, UniLifecycleHooks, UniNode, UniTextAreaElement, UniTextNode, WEB_INVOKE_APPSERVICE, WXS_MODULES, WXS_PROTOCOL, addFont, addLeadingSlash, cache, cacheStringFunction, callOptions, createIsCustomElement, createRpx2Unit, createUniEvent, customizeEvent, debounce, decode, decodedQuery, defaultMiniProgramRpx2Unit, defaultNVueRpx2Unit, defaultRpx2Unit, dynamicSlotName, forcePatchProp, formatAppLog, formatDateTime, formatH5Log, formatLog, getCustomDataset, getEnvLocale, getLen, getValueByDataPath, initCustomDatasetOnce, invokeArrayFns, invokeCreateVueAppHook, isAppNVueNativeTag, isAppNativeTag, isBuiltInComponent, isComponentInternalInstance, isComponentTag, isH5CustomElement, isH5NativeTag, isMiniProgramNativeTag, isRootHook, normalizeDataset, normalizeEventType, normalizeTarget, onCreateVueApp, once, parseEventName, parseQuery, parseUrl, passive, plusReady, removeLeadingSlash, resolveComponentInstance, resolveOwnerEl, resolveOwnerVm, sanitise, scrollTo, stringifyQuery, updateElementStyle }; +export { ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_CREATE, ACTION_TYPE_EVENT, ACTION_TYPE_INSERT, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_REMOVE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ATTR_CHANGE_PREFIX, ATTR_CLASS, ATTR_INNER_HTML, ATTR_STYLE, ATTR_TEXT_CONTENT, ATTR_V_OWNER_ID, ATTR_V_RENDERJS, ATTR_V_SHOW, BACKGROUND_COLOR, BUILT_IN_TAGS, BUILT_IN_TAG_NAMES, COMPONENT_NAME_PREFIX, COMPONENT_PREFIX, COMPONENT_SELECTOR_PREFIX, DATA_RE, E$1 as Emitter, EventChannel, EventModifierFlags, I18N_JSON_DELIMITERS, JSON_PROTOCOL, LINEFEED, MINI_PROGRAM_PAGE_RUNTIME_HOOKS, NAVBAR_HEIGHT, NODE_TYPE_COMMENT, NODE_TYPE_ELEMENT, NODE_TYPE_PAGE, NODE_TYPE_TEXT, NVUE_BUILT_IN_TAGS, NVUE_U_BUILT_IN_TAGS, ON_ADD_TO_FAVORITES, ON_APP_ENTER_BACKGROUND, ON_APP_ENTER_FOREGROUND, ON_BACK_PRESS, ON_ERROR, ON_HIDE, ON_KEYBOARD_HEIGHT_CHANGE, ON_LAUNCH, ON_LOAD, ON_NAVIGATION_BAR_BUTTON_TAP, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_PAGE_NOT_FOUND, ON_PAGE_SCROLL, ON_PULL_DOWN_REFRESH, ON_REACH_BOTTOM, ON_REACH_BOTTOM_DISTANCE, ON_READY, ON_RESIZE, ON_SHARE_APP_MESSAGE, ON_SHARE_TIMELINE, ON_SHOW, ON_TAB_ITEM_TAP, ON_THEME_CHANGE, ON_UNHANDLE_REJECTION, ON_UNLOAD, ON_WEB_INVOKE_APP_SERVICE, ON_WXS_INVOKE_CALL_METHOD, PLUS_RE, PRIMARY_COLOR, RENDERJS_MODULES, RESPONSIVE_MIN_WIDTH, SCHEME_RE, SELECTED_COLOR, SLOT_DEFAULT_NAME, TABBAR_HEIGHT, TAGS, UNI_SSR, UNI_SSR_DATA, UNI_SSR_GLOBAL_DATA, UNI_SSR_STORE, UNI_SSR_TITLE, UNI_STORAGE_LOCALE, UniBaseNode, UniCommentNode, UniElement, UniEvent, UniInputElement, UniLifecycleHooks, UniNode, UniTextAreaElement, UniTextNode, WEB_INVOKE_APPSERVICE, WXS_MODULES, WXS_PROTOCOL, addFont, addLeadingSlash, cache, cacheStringFunction, callOptions, createIsCustomElement, createRpx2Unit, createUniEvent, customizeEvent, debounce, decode, decodedQuery, defaultMiniProgramRpx2Unit, defaultNVueRpx2Unit, defaultRpx2Unit, dynamicSlotName, forcePatchProp, formatAppLog, formatDateTime, formatH5Log, formatLog, getCustomDataset, getEnvLocale, getLen, getValueByDataPath, initCustomDatasetOnce, invokeArrayFns, invokeCreateVueAppHook, isAppNVueNativeTag, isAppNativeTag, isBuiltInComponent, isComponentInternalInstance, isComponentTag, isH5CustomElement, isH5NativeTag, isMiniProgramNativeTag, isRootHook, normalizeDataset, normalizeEventType, normalizeTarget, onCreateVueApp, once, parseEventName, parseNVueDataset, parseQuery, parseUrl, passive, plusReady, removeLeadingSlash, resolveComponentInstance, resolveOwnerEl, resolveOwnerVm, sanitise, scrollTo, stringifyQuery, updateElementStyle }; diff --git a/packages/uni-shared/src/nvue.ts b/packages/uni-shared/src/nvue.ts index a4c66da177fe2dd51e41ee35838f6518ce39b0b6..44b5b82a8c065c20f89f6194cff44d9ff552b9a2 100644 --- a/packages/uni-shared/src/nvue.ts +++ b/packages/uni-shared/src/nvue.ts @@ -1,5 +1,17 @@ import { createApp, ComponentPublicInstance } from 'vue' +export function parseNVueDataset(attr?: Record) { + const dataset: Record = {} + if (attr) { + Object.keys(attr).forEach((key) => { + if (key.indexOf('data-') === 0) { + dataset[key.replace('data-', '')] = attr[key] + } + }) + } + return dataset +} + export interface Vue { createApp: typeof createApp } @@ -85,6 +97,7 @@ export interface NVueElement { ref: string text?: string + attr: Record styleSheet: Record>> classList: string[] parentNode: NVueElement | null