Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 虚拟DOM';s diffing算法的唯一区别是pin point和patch real DOM?_Javascript_Reactjs_Dom_Diff_Virtual - Fatal编程技术网

Javascript 虚拟DOM';s diffing算法的唯一区别是pin point和patch real DOM?

Javascript 虚拟DOM';s diffing算法的唯一区别是pin point和patch real DOM?,javascript,reactjs,dom,diff,virtual,Javascript,Reactjs,Dom,Diff,Virtual,我对虚拟DOM及其diff算法的了解是,当某个组件(或元素/及其子组件)发生更改时,协调该特定组件和子组件是有效的,因为除此之外,其他DOM组件不会更改 然而,我已经知道,DOM操作的耗时部分是重新计算元素样式(如CSS)的时刻 如果位于许多其他组件之间的组件发生更改,例如高度样式更改或卸载,则通过此类更改,下面的同级组件将受到影响,其中这些组件的样式应全部重新渲染(重新绘制或重绘) 那么,这难道不意味着React的对象——通过虚拟DOM和diff算法只处理视图的更改部分——将无法实现吗 我是误

我对虚拟DOM及其diff算法的了解是,当某个组件(或元素/及其子组件)发生更改时,协调该特定组件和子组件是有效的,因为除此之外,其他DOM组件不会更改

然而,我已经知道,DOM操作的耗时部分是重新计算元素样式(如CSS)的时刻

如果位于许多其他组件之间的组件发生更改,例如高度样式更改或卸载,则通过此类更改,下面的同级组件将受到影响,其中这些组件的样式应全部重新渲染(重新绘制或重绘)

那么,这难道不意味着React的对象——通过虚拟DOM和diff算法只处理视图的更改部分——将无法实现吗

我是误解了,还是这很正常


如果这是正常的(由于其他组件的中间组件的改变,下面的其他组件也必须被修改),那么除了平批处理或声明性方法之外,与普通DOM操作方法相比,反应的优势是什么?可以将其称为“补丁”吗?

您担心更改父组件的样式可能会触发其子组件的浏览器布局

但是,无论您是否使用react的虚拟dom,这个问题仍然会发生

  • react的虚拟dom的好处在于,它聚合dom操作并消除(重复)冗余操作

    与“手工编码”相比,这种广泛的优化通常会导致更少的dom操作

  • 在极少数情况下,通过非常小心地手动管理dom操作,您可能能够在不使用react的虚拟dom的情况下产生更优化的结果

    使用“手册”很少值得考虑


您担心更改父组件的样式可能会触发其子组件的浏览器布局

但是,无论您是否使用react的虚拟dom,这个问题仍然会发生

  • react的虚拟dom的好处在于,它聚合dom操作并消除(重复)冗余操作

    与“手工编码”相比,这种广泛的优化通常会导致更少的dom操作

  • 在极少数情况下,通过非常小心地手动管理dom操作,您可能能够在不使用react的虚拟dom的情况下产生更优化的结果

    使用“手册”很少值得考虑


    • React“虚拟DOM”只是一个javascript对象。这与协调时的样式和布局无关。每次渲染后,React可以将此对象与上一次渲染的结果区分开来,并且只更新相应DOM元素的已更改属性。 这是React文档中的解释性图像,您可以看到更新已经很好地本地化了


      React“虚拟DOM”只是一个javascript对象。这与协调时的样式和布局无关。每次渲染后,React可以将此对象与上一次渲染的结果区分开来,并且只更新相应DOM元素的已更改属性。 这是React文档中的解释性图像,您可以看到更新已经很好地本地化了


      我指出的是兄弟组件,而不是更改组件的子组件。但不管怎样,我明白你说的意思了。所以你的意思是,通过虚拟DOM,我们通常可以得到更少的DOM操作,并批量处理我们需要做的DOM操作(这是优化)。啊,我看我看错了。。是的,您的想法是正确的,虚拟dom是一种广泛优化dom操作的方法,但是它不能保证更高效,它通常只是在快速开发期间,我指出的是兄弟组件,而不是更改组件的子组件。但不管怎样,我明白你说的意思了。所以你的意思是,通过虚拟DOM,我们通常可以得到更少的DOM操作,并批量处理我们需要做的DOM操作(这是优化)。啊,我看我看错了。。是的,您的想法是正确的,虚拟dom是一种广泛优化dom操作的方法,但是它不能保证更高效,它通常是在快速开发期间。我明白您的答案,谢谢。但是,如果在状态更改后样式或布局发生更改,该怎么办?我认为,通过事件,CSS属性的更改或元素的卸载可能会发生。如果属性的更改不影响布局或绘制,则可以。但是如果它影响到他们呢?大多数情况下,在react之外没有Css、unomount和布局更改。如果React应用程序中存在事件,则会在React中呈现该事件。但是无论如何,如果某些布局由于调整大小而改变,例如,它不会影响Dom,并且由浏览器处理。React只负责Dom操作,我明白了。DOM与CSS内容无关,CSS是由浏览器来处理的。谢谢你的解释。因此,利用React或任何其他增强框架和库进行的DOM操作与CSS相关的内容没有太大关系。是的,这些框架只能通过DOM直接或间接地操作样式/CSS。从这一点上,浏览器负责其余的渲染。我明白了你的答案,谢谢。但是,如果在状态更改后样式或布局发生更改,该怎么办?我认为,通过事件,CSS属性的更改或元素的卸载可能会发生。如果属性的更改不影响布局或绘制,则可以。但是如果它影响到他们呢?大多数情况下,在react之外没有Css、unomount和布局更改。如果React应用程序中存在事件,则会在React中呈现该事件。日分