IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 第三十八周总结——h函数 -> 正文阅读

[JavaScript知识库]第三十八周总结——h函数

vnode.js

export default function vnode(sel,data,children,text,elm){
    //key值是标签的唯一标识,在data.key中,这里获取一下key
    const key = data === undefined ? undefined : data.key
    return { sel, data, children, text, elm, key };
}

h函数各个参数
sel:{String | Object | Function} 必须
一个 HTML 标签名、一个组件、一个异步组件、或一个函数式组件。

data:{Object} 可选
与 attribute、prop 和事件相对应的对象。

key:该值在data中,虚拟DOM的唯一标识 可选

text:{String} 可选

children:(h() | {}) 可选

elm:表示是否上树
h函数的流程
h函数必定传的有一个值就是sel,表示的标签名称,比如div
h函数传值的时候先判断第三个参数children是否有值,如果有值则进行判断
1.children是数组,说明是子元素
2.children是字符串,说明是text参数中的内容,也就是标签中的文字
3.children有值,且children.sel有值,说明是子元素,只不过不是数组的形式,需要将其转换成数组的形式在添加
h函数传值的时候没有第三个参数children,有第二个参数data,这时再根据第三个参数判断的形式进行判断
1.data是数组,说明是子元素
2.data是字符串,说明是text参数中的内容,也就是标签中的文字
3.data有值,且data.sel有值,说明是子元素,只不过不是数组的形式,需要将其转换成数组的形式在添加
4.如果以上三种都不是则说明data中传的值是与 attribute、prop 和事件相对应的对象,将其直接赋值给data
h函数判断children中的值是否存在text,就是标签中的文字,如果有则只传children,其他的值都为undefined
h函数最后进行判断是否是svg标签
h.js

// 引入vnode
import vnode from "./vnode";
import is from './is'
function addNS(data,children,sel){
    data.ns = "http://www.w3.org/2000/svg";
    if (sel !== "foreignObject" && children !== undefined) {
        for (let i = 0; i < children.length; ++i) {
            const child = children[i];
            if (typeof child === "string")
                continue;
            const childData = child.data;
            if (childData !== undefined) {
                addNS(childData, child.children, child.sel);
            }
        }
    }
}
export default function h(sel,b,c){
    // 定义返回值
    let data = {};
    let children;
    let text;
    let i;
    //如果c!==undefined说明children传值了
    if(c!==undefined){
        if(b!==null){
            //如果b不是null则将b赋值给data
            data = b;
        }
        //判断c是children还是text
        if(is.array(c)){
            //c为children时,将c赋值给children
            children = c
        }else if(is.primitive(c)){
            //c为输入的内容,将c转换成字符串赋值给text
            text = c.toString();
        }else if(c&&c.sel){
            //c为一个子元素,并不是以数组的形式写上的,则将c变成数组的形式赋值给children
            children = [c];
        }
    }else if(b!==undefined&&b!==null){
        //如果c为undefined了就该判断c前面的b是否是undefined或null了
        //判断b是children还是data
        if(is.array(b)){
            //这里说明b是children
            children = b;
        }else if(is.primitive(b)){
            //这里判断b是text
            text = b.toString()
        }else if(b&&b.sel){
            //这里判断是否是单个h函数,不是数组形式的children
            children = [b];
        }else{
            //这里说明b是data
            data = b;
        }
    }
    //判断children数组中的数据是否是text
    if(children !== undefined){
        for(i = 0;i<children.length;++i){
            if(is.primitive(children[i])){
                //如果是字符串则只传text
                children[i]=vnode(undefined,undefined,undefined,children[i].undefined)
            }
        }
    }

    if (sel[0] === "s" &&
        sel[1] === "v" &&
        sel[2] === "g" &&
        (sel.length === 3 || sel[3] === "." || sel === "#")) {
        //判断是否时svg标签
        addNS(data,children,sel)
    }
    
    //这里返回的最后一个参数为undefined,是因为还没有上树,elm为undefined
    return vnode(sel,data,children,text,undefined);
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:40:43  更:2022-03-21 20:44:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:35:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码