-
props
参数的工作方式与 React/Vue 中的 props 完全相同——它允许我们将数据(属性)传递给元素 -
children
当前元素内其他子节点。
让我们看看它是如何使用的。
const view = () =>
h(‘div’, {}, [
h(‘h1’, {}, [‘Hello’]),
h(‘p’, {}, [‘from virtual DOM!’]),
h(‘p’, {}, [‘from virtual DOM!’]),
h(‘p’, {}, [‘from virtual DOM!’]),
h(‘p’, {}, [‘from virtual DOM!’]),
]);
我们创建了一个div
元素,里面有h1
和p
元素。这些元素中的每一个都有一个文本节点作为其子节点。
现在是时候将这个虚拟树转换为实际的 DOM。
render
方法
让我们实现一个render
功能。
const render = (root, view) => {
const rendered = view();
diff(root, null, rendered);
};
const diff = (root, oldNode, newNode, index) => {
// 判断节点是否变化,有变化则更新
};
render(app, view);
渲染函数首先调用view函数,然后运行 diff 函数,该函数接受一个根元素(来自真实 DOM)、旧的虚拟节点(因为我们第一次渲染它是null
)和新的虚拟节点 。
diff
方法
基本上,该diff
函数只会将 oldNode 与 newNode 进行比较,看看它是否需要更新root
.
现在让我们看看如何实现 diff 函数。
const diff = (root, oldNode, newNode, index) => {
// 判断节点是否变化,有变化则更新
if (!oldNode) {
root.appendChild(createElement(newNode));
}
};
如果没有oldNode
,我们需要创建这个元素并将其插入 DOM。首先,我们使用该函数创建一个元素createElement
,然后我们在第二个实现该函数,然后我们appendChild
在一个真实的 DOM 元素上使用该方法,将该节点附加为其子节点。
让我们实现createElement
功能。
const createElement = (node) => {
if (typeof node === ‘string’) {
return document.createTextNode(node);
}
const el = document.createElement(node.type);
node.children.map(createElement).forEach(el.appendChild.bind(el));
return el;
};
如果一个节点是一个文本节点(例如“Hello”),我们只需使用document.createTextNode
函数渲染它。
如果不是,我们创建给定类型的元素,document.createElement
然后循环遍历它的每个子元素,createElement
递归调用函数。这样我们就创建了整个树并返回它。
让我们看看到目前为止我们编写的完整代码:
const app = document.querySelector(‘#app’);
const h = (type, props = {}, children = []) => ({
type,
props,
children,
});
const view = () =>
h(“div”, {}, [
h(“h1”, {}, [“Hello”]),
h(“p”, {}, [“from virtual DOM!”]),
h(“p”, {}, [“from virtual DOM!”]),
h(“p”, {}, [“from virtual DOM!”]),
h(“p”, {}, [“from virtual DOM!”]),
]);
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
总结
三套“算法宝典”
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法刷题LeetCode中文版(为例)
人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。
最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!
由于篇幅有限,下篇的面试技术攻克篇只能够展示出部分的面试题,详细完整版以及答案解析,有需要的可以关注
de中文版(为例)
人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。
最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!