今天在閱讀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