press-ui
Version:
简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目
54 lines (50 loc) • 1.46 kB
JavaScript
import { camelize } from '../../common/format/string';
export function getTargetDataset(target) {
let dataset = {};
const vm = target.__vue__;
function updateDataset(vm, force) {
const { $attrs } = vm;
for (const key in $attrs) {
if (key.startsWith('data-')) {
const newKey = camelize(key.substr(5).toLowerCase());
const value = $attrs[key];
dataset[newKey] = force ? value : dataset[newKey] || value;
}
}
}
if (vm) {
let $child = vm;
while ($child && $child.$el === target) {
updateDataset($child);
$child = $child.$children[0];
}
let { $parent } = vm;
while ($parent && $parent.$el === target) {
updateDataset($parent, true);
$parent = $parent.$parent;
}
} else {
dataset = Object.assign({}, target.dataset, target.__uniDataset);
}
return normalizeDataset(dataset);
}
export function normalizeDataset(dataset = {}) {
// ios8.x,9.x Object.assign({},dataset) 始终返回 {}
// http://ask.dcloud.net.cn/question/70246
const result = JSON.parse(JSON.stringify(dataset));
// if (__PLATFORM__ === 'h5') {
const keys = Object.keys(result);
const len = keys.length;
if (len) {
// remove data-v-
for (let i = 0; i < len; i++) {
const key = keys[i];
const len = key.length;
if (key.substr(0, 1) === 'v' && (len === 9 || len === 10)) {
delete result[key];
}
}
}
// }
return result;
}