diff --git a/src/core/helpers/index.js b/src/core/helpers/index.js index 66eaa2b799e8dbb64063b0236fb757de54f1f823..79052bd1481a63974ac124164945b389f81fb795 100644 --- a/src/core/helpers/index.js +++ b/src/core/helpers/index.js @@ -1,3 +1,7 @@ +import { + camelize +} from 'uni-shared' + const components = ['SystemAsyncLoading', 'SystemAsyncError'] export function isPage (vm) { if (vm.$parent && vm.$parent.$options.name === 'PageBody') { @@ -35,6 +39,21 @@ export function normalizeDataset (dataset = {}) { return result } +export function getTargetDataset (target) { + let dataset = {} + if (target.__vue__) { + const $attrs = target.__vue__.$attrs + for (const key in $attrs) { + if (key.startsWith('data-')) { + dataset[camelize(key.substr(5))] = $attrs[key] + } + } + } else { + dataset = target.dataset || {} + } + return normalizeDataset(dataset) +} + export function upx2px (str) { str = str + '' if (str.indexOf('upx') !== -1) { // upx转换 @@ -53,4 +72,4 @@ export function findExistsPageIndex (url) { } } return -1 -} +} diff --git a/src/core/view/bridge/subscribe/api/request-component-info.js b/src/core/view/bridge/subscribe/api/request-component-info.js index b7dc21ee387d26fba4b2fec290064e57428048a5..646f4e1ba8e44c48e4d19bf004f68ec5fb39769d 100644 --- a/src/core/view/bridge/subscribe/api/request-component-info.js +++ b/src/core/view/bridge/subscribe/api/request-component-info.js @@ -1,5 +1,5 @@ import { - normalizeDataset + getTargetDataset } from 'uni-helpers/index' import getWindowOffset from 'uni-platform/helpers/get-window-offset' @@ -46,7 +46,7 @@ function getNodeInfo (el, fields) { info.id = el.id } if (fields.dataset) { - info.dataset = normalizeDataset(el.dataset || {}) + info.dataset = getTargetDataset(el) } if (fields.rect || fields.size) { const rect = el.getBoundingClientRect() diff --git a/src/core/view/bridge/subscribe/api/request-component-observer.js b/src/core/view/bridge/subscribe/api/request-component-observer.js index 3972c5810db4e830bc138bedf82337c76abf6279..afa7b151220ba1cb2c0a18a312038c120368ac4d 100644 --- a/src/core/view/bridge/subscribe/api/request-component-observer.js +++ b/src/core/view/bridge/subscribe/api/request-component-observer.js @@ -1,7 +1,7 @@ import 'intersection-observer' import { - normalizeDataset + getTargetDataset } from 'uni-helpers/index' import { @@ -49,7 +49,7 @@ export function requestComponentObserver ({ boundingClientRect: getRect(entrie.boundingClientRect), relativeRect: getRect(entrie.rootBounds), time: Date.now(), - dataset: normalizeDataset(entrie.target.dataset || {}), + dataset: getTargetDataset(entrie.target), id: entrie.target.id } }) diff --git a/src/core/view/plugins/events.js b/src/core/view/plugins/events.js index 42dfbe5ff93d9b104e5b228cb45e3c07f62b961b..16656149cc5d6a8299b6949c9694879b698fe3c4 100644 --- a/src/core/view/plugins/events.js +++ b/src/core/view/plugins/events.js @@ -3,7 +3,7 @@ import { } from 'uni-shared' import { - normalizeDataset + getTargetDataset } from 'uni-helpers/index' import { @@ -17,7 +17,7 @@ function processTarget (target, detail, checkShadowRoot = false) { id: target.id, offsetLeft: target.offsetLeft, offsetTop: target.offsetTop, - dataset: normalizeDataset(target.dataset) + dataset: getTargetDataset(target) } if (detail) { Object.assign(res, detail) diff --git a/src/platforms/app-plus/service/framework/plugins/data.js b/src/platforms/app-plus/service/framework/plugins/data.js index 21c1aa1415d077f279a9a3bf238c221d8b1bbf52..48d15de20a6bd1be6b9c4d42f9118c59be44d655 100644 --- a/src/platforms/app-plus/service/framework/plugins/data.js +++ b/src/platforms/app-plus/service/framework/plugins/data.js @@ -137,10 +137,6 @@ function parseExternalClasses (clazz, vm) { return clazz } -function isNotSafeString (value) { - return value === 'null' || value === 'true' || value === 'false' || !isNaN(Number(value)) || (value.startsWith('[') && value.endsWith(']')) || (value.startsWith('{') && value.endsWith('}')) -} - function setData (id, name, value) { switch (name) { case B_CLASS: @@ -160,12 +156,6 @@ function setData (id, name, value) { case V_FOR: return setForData.call(this, id, value) } - // TODO 暂时先传递 dataset 至 view 层(理论上不需要) - if (name.indexOf('a-data-') === 0 && (typeof value !== 'string' || isNotSafeString(value))) { - try { - value = JSON.stringify(value) - } catch (e) {} - } return ((this._$newData[id] || (this._$newData[id] = {}))[name] = value) } diff --git a/src/platforms/app-plus/service/framework/plugins/vdom-sync.js b/src/platforms/app-plus/service/framework/plugins/vdom-sync.js index 0ec9c3d157f47cb010c349eea34f7468a514c9d5..2b9074f0f3268930c8f00fb3ca165722d04b8c94 100644 --- a/src/platforms/app-plus/service/framework/plugins/vdom-sync.js +++ b/src/platforms/app-plus/service/framework/plugins/vdom-sync.js @@ -31,32 +31,7 @@ import { import parseComponentCreateOptions from './parse-component-create-options' -// TODO 临时通过序列化,反序列化传递dataset,后续可以全部保留在service,不做传递 -function parseDataset (dataset) { - const ret = Object.create(null) - Object.keys(dataset).forEach(name => { - try { - ret[name] = JSON.parse(dataset[name]) - } catch (e) { // dataset 存在两种,一种是被JSON.stringify的,一种是原始的 - ret[name] = dataset[name] - } - }) - return ret -} - -function parseTargets (event) { - const targetDataset = event.target && event.target.dataset - if (targetDataset) { - event.target.dataset = parseDataset(targetDataset) - } - const currentTargetDataset = event.currentTarget && event.currentTarget.dataset - if (currentTargetDataset) { - event.currentTarget.dataset = parseDataset(currentTargetDataset) - } -} - function wrapperEvent (event) { - parseTargets(event) event.preventDefault = noop event.stopPropagation = noop return wrapperMPEvent(event)