介紹
這裡是 typescript
的語法,定義了一系列的過載方法。h
函式主要根據傳進來的引數,返回一個 vnode 物件
程式碼
程式碼位置 : ./src/h.ts
/**
* 根據選擇器 ,資料 ,建立 vnode
*/
export function h(sel: string): VNode;
export function h(sel: string, data: VNodeData): VNode;
export function h(sel: string, children: VNodeChildren): VNode;
export function h(sel: string, data: VNodeData, children: VNodeChildren): VNode;
export function h(sel: any, b?: any, c?: any): VNode {
var data: VNodeData = {},
children: any,
text: any,
i: number;
/**
* 處理引數
*/
if (c !== undefined) {
// 三個引數的情況 sel , data , children | text
data = b;
if (is.array(c)) {
children = c;
} else if (is.primitive(c)) {
text = c;
} else if (c && c.sel) {
children = [c];
}
} else if (b !== undefined) {
// 兩個引數的情況 : sel , children | text
// 兩個引數的情況 : sel , data
if (is.array(b)) {
children = b;
} else if (is.primitive(b)) {
text = b;
} else if (b && b.sel) {
children = [b];
} else {
data = b;
}
}
if (children !== undefined) {
for (i = 0; i < children.length; ++i) {
// 如果children是文字或數字 ,則建立文字節點
if (is.primitive(children[i]))
children[i] = vnode(
undefined,
undefined,
undefined,
children[i],
undefined
);
}
}
// 處理svg
if (
sel[0] === `s` &&
sel[1] === `v` &&
sel[2] === `g` &&
(sel.length === 3 || sel[3] === `.` || sel[3] === `#`)
) {
// 增加 namespace
addNS(data, children, sel);
}
// 生成 vnoe
return vnode(sel, data, children, text, undefined);
}
export default h;
其他
h 函式比較簡單,主要是提供一個方便的工具函式,方便建立 vnode 物件