- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我对DOM和浏览器如何工作的幼稚理解
每当DOM中的某些内容(真实dom)更改时,浏览器就会重新绘制或重排该DOM。因此,用更简单的术语来说,每次DOM更改时,浏览器都需要重新计算CSS,进行布局并重新绘制网页。这是在真正的dom中花费时间的原因。
因此,React附带了这个虚拟DOM,它的实际作用是将更改批量进行批处理,然后调用一次将它们应用于实际域。因此,最大程度地减少了重焊和重绘(repaint)。
那斯维尔特呢。如果直接操作DOM,它将如何控制浏览器的重绘/重排。
最佳答案
除了上面的(正确)答案之外:Svelte还可以“编译”您提供给它的代码,因此最终代码可以在没有库运行时的情况下执行(与React相比)。而且它创建了可读性强的代码,因此绝对有可能了解其内部工作原理。
注意:这将是更长的答案-仍然遗漏了有关斯维尔特(Svelte)背后发生的事情的许多详细信息。但是,我希望这有助于揭开某些幕后神秘面纱。同样,这也是Svelte从v3.16.x起执行操作的方式。由于这是内部的,因此可能会更改。但是,我仍然发现了解实际情况总是很有意义的。
所以,我们开始。
最重要的是: Svelte教程具有一项有用的功能,可让您查看生成的代码(在“结果” Pane 旁边)。乍一看可能有点吓人,但很快您就可以掌握它了。
下面的代码将基于此示例(但经过进一步简化):Svelte tutorial - reactivity/assignments
我们的示例组件定义(即App.svelte)如下所示:
<script>
let count = 0;
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>{count}</button>
function create_fragment(ctx) {
let button;
let t;
let dispose;
return {
c() {
button = element("button");
t = text(/*count*/ ctx[0]);
dispose = listen(button, "click", /*handleClick*/ ctx[1]);
},
m(target, anchor) {
insert(target, button, anchor);
append(button, t);
},
p(ctx, [dirty]) {
if (dirty & /*count*/ 1) set_data(t, /*count*/ ctx[0]);
},
i: noop,
o: noop,
d(detaching) {
if (detaching) detach(button);
dispose();
}
};
}
function element(name) {
return document.createElement(name);
}
function instance($$self, $$props, $$invalidate) {
let count = 0;
function handleClick() {
$$invalidate(0, count += 1);
}
return [count, handleClick];
}
output: {
sourcemap: false,
format: 'iife',
name: 'app',
file: 'public/build/bundle.js'
},
plugins: [
svelte({
dev: false,
console.dir(app)
App
$$:
fragment: {c: ƒ, m: ƒ, p: ƒ, i: ƒ, o: ƒ, …}
ctx: (2) [0, ƒ]
props: {count: 0}
update: ƒ noop()
not_equal: ƒ safe_not_equal(a, b)
bound: {}
on_mount: []
on_destroy: []
before_update: []
after_update: []
context: Map(0) {}
callbacks: {}
dirty: [-1]
__proto__: Object
$set: $$props => {…}
app.$set({count: 10})
关于javascript - SvelteJS与ReactJS渲染差异(重绘/重排),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902385/
我是一名优秀的程序员,十分优秀!