今天在阅读snabbdom
(一个Virtual DOM 库)的关于处理元素自定义属性的时候,发现了将驼峰风格的字符串转化成中划线风格的字符串的技巧,以方便根据dataset来移除实际DOM元素对应的attribute,至于DOM对象的dataset和HTML自定义属性的对应规则,你能够阅读这边文档:https://developer.mozilla.org...javascript
文件src/modules/dataset.ts
java
import {VNode, VNodeData} from '../vnode'; import {Module} from './module'; export type Dataset = Record<string, string>; const CAPS_REGEX = /[A-Z]/g; //匹配大写字母 function updateDataset(oldVnode: VNode, vnode: VNode): void { let elm: HTMLElement = vnode.elm as HTMLElement, oldDataset = (oldVnode.data as VNodeData).dataset, dataset = (vnode.data as VNodeData).dataset, key: string; if (!oldDataset && !dataset) return; if (oldDataset === dataset) return; oldDataset = oldDataset || {}; dataset = dataset || {}; const d = elm.dataset; for (key in oldDataset) { if (!dataset[key]) { if (d) { if (key in d) { delete d[key]; } } else { elm.removeAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase()); } } } for (key in dataset) { if (oldDataset[key] !== dataset[key]) { if (d) { d[key] = dataset[key]; } else { elm.setAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase(), dataset[key]); } } } } export const datasetModule = {create: updateDataset, update: updateDataset} as Module; export default datasetModule;
"theStringYouWanToChange".replace(/[A-Z]/g,'-$&').toLowerCase();
"the-string-you-wan-to-change"
String.prototype.replace()
: https://developer.mozilla.org...node