频繁操作DOM存在性能问题
如何解决 DOM 性能问题?
解决DOM 性能方式
#shadow-root
<style>
#panels {
box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
background: white;
...
}
#tabs {
display: inline-flex;
...
}
</style>
<div id="tabs">
...
</div>
<div id="panels">
...
</div>
// VNODE:a JS object representation of a single DOM node with it’s properties and children
{
"nodeName": "",
"attributes": {},
"children": []
}
{
"nodeName": "input",
"attributes": {
"type": "text",
"placeholder": "Search",
"autofocus":"true",
"onChange": ""
},
"children": []
}
<input type="text" placeholder="Search" autofocus="true">
Virtual DOM 是一种技术和一组库/算法,它允许我们通过避免直接使用 DOM 和只使用模拟DOM 树的轻量级 JavaScript 对象来提高前端性能。
查找两个Virtual DOM的不同之处:
the code you write
/** @jsx h */
// https://github.com/hyperhype/hyperscript
let foo = <div id="foo">Hello!</div>;
the code you run
var foo = h('div', {id:"foo"}, 'Hello!');
JSX 只是语法糖,目的是为了使得 HTML 和 JavaScript 更好的交互
Demo
the code you write
//Mount to real DOM
render(<FilteredList/>, document.getElementById(‘app’));
the code you run
//Converted to "h":
render(h(FilteredList), document.getElementById(‘app’));
此时,我们有一个VNode,它有一个“div” parentNode,它有一个“input”和一个“List”子节点。
在创建“input”之后,因为它没有任何子元素,所以它不会立即循环并创建“List”。 相反,它会首先将“input”附加到父“div”中,然后返回到进程“List”