snabbdom原始碼解析(二) h函式

chen4342024發表於2019-02-16

介紹

這裡是 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 物件

snabbdom原始碼解析系列

snabbdom原始碼解析(一) 準備工作

snabbdom原始碼解析(二) h函式

snabbdom原始碼解析(三) vnode物件

snabbdom原始碼解析(四) patch 方法

snabbdom原始碼解析(五) 鉤子

snabbdom原始碼解析(六) 模組

snabbdom原始碼解析(七) 事件處理

個人部落格地址

相關文章