拆分组件时避免 dom 容器元素
avoid dom container elements when splitting components
我正在使用 React,我想在子组件中拆分一个组件,以对其进行优化(我正在使用 mobX 并尝试实现此处的列表示例 https://mobxjs.github.io/mobx/best/react-performance.html)
然而,这样做似乎是我被迫引入额外的 dom 元素。
考虑一个 NodeComponent 来渲染一棵树
const NodeComponent = ({node}) => (
<div>
<div that access some stuff with node properties/>
{children.map(childNode => <NodeComponent node={childNode} />)}
</div>
);
这是伪代码,希望你能理解。
如何将第一个内部 div 与递归渲染分开,而不在子元素周围引入额外的包装器 dom 元素(如下面的 div)?
const NodeComponent = ({node}) => (
<div>
<div that access some stuff with node properties/>
**<useless div>**
{children.map(childNode => <NodeComponent node={childNode} />)}
**<useless /div>**
</div>
);
如果我有数以千计的节点,这意味着数以千计的额外无用 dom 元素,此外,我正在移植具有特定 dom 结构和 CSS 的现有控件,并且我如果我想拆分它们,必须更改它。
TL;DR;我可以将这个组件一分为二,这样我就可以在不更改 DOM 输出的情况下获得不需要重新渲染所有子项的 mobx 优化吗?
或者再说一次:为什么纯粹的 optimization/refactoring 迫使我修改我的 dom 最终结果?
这似乎是一个递归数据结构。我认为你可以很好地将它分成多个组件而没有不必要的节点:
Node = observer({ node } => (
<div>
{node.title}
<Children={node.children} />
</div>
))
Children = observer({ children } => (
!children ? null :
<ul>
{children.map(child => <Node node={child} />
</ul>
))
我认为这是您可以获得的最小树,mobx 可以很好地优化它,因为子集合被呈现为单独的组件。您可能认为 ul
是不需要的,但我认为出于所有实际的样式原因,您可能需要此 dom 节点,否则很难在不定位父代的情况下定位后代。
除此之外,如果没有一些经验证明它是瓶颈,我不会太在意您 DOM 中的其他节点。它可能根本不重要,或者例如你的 CSS 选择器使用 ul
比没有 ul
快得多
目前,我最终会使用 https://github.com/mwiencek/react-packages 之类的东西来让 React/JSX 开心,而不是被迫改变我的 dom 结构。这与其说是一个正确的解决方案,不如说是一个棘手的解决方法,但它确实解决了我的问题。
希望 https://github.com/facebook/react/issues/2127 修复后我就不再需要它了。
感谢大家的帮助,我真的很感激(再次感谢@mweststrate 对 MobX 的总体帮助:))
我正在使用 React,我想在子组件中拆分一个组件,以对其进行优化(我正在使用 mobX 并尝试实现此处的列表示例 https://mobxjs.github.io/mobx/best/react-performance.html)
然而,这样做似乎是我被迫引入额外的 dom 元素。 考虑一个 NodeComponent 来渲染一棵树
const NodeComponent = ({node}) => (
<div>
<div that access some stuff with node properties/>
{children.map(childNode => <NodeComponent node={childNode} />)}
</div>
);
这是伪代码,希望你能理解。
如何将第一个内部 div 与递归渲染分开,而不在子元素周围引入额外的包装器 dom 元素(如下面的 div)?
const NodeComponent = ({node}) => (
<div>
<div that access some stuff with node properties/>
**<useless div>**
{children.map(childNode => <NodeComponent node={childNode} />)}
**<useless /div>**
</div>
);
如果我有数以千计的节点,这意味着数以千计的额外无用 dom 元素,此外,我正在移植具有特定 dom 结构和 CSS 的现有控件,并且我如果我想拆分它们,必须更改它。
TL;DR;我可以将这个组件一分为二,这样我就可以在不更改 DOM 输出的情况下获得不需要重新渲染所有子项的 mobx 优化吗?
或者再说一次:为什么纯粹的 optimization/refactoring 迫使我修改我的 dom 最终结果?
这似乎是一个递归数据结构。我认为你可以很好地将它分成多个组件而没有不必要的节点:
Node = observer({ node } => (
<div>
{node.title}
<Children={node.children} />
</div>
))
Children = observer({ children } => (
!children ? null :
<ul>
{children.map(child => <Node node={child} />
</ul>
))
我认为这是您可以获得的最小树,mobx 可以很好地优化它,因为子集合被呈现为单独的组件。您可能认为 ul
是不需要的,但我认为出于所有实际的样式原因,您可能需要此 dom 节点,否则很难在不定位父代的情况下定位后代。
除此之外,如果没有一些经验证明它是瓶颈,我不会太在意您 DOM 中的其他节点。它可能根本不重要,或者例如你的 CSS 选择器使用 ul
比没有 ul
目前,我最终会使用 https://github.com/mwiencek/react-packages 之类的东西来让 React/JSX 开心,而不是被迫改变我的 dom 结构。这与其说是一个正确的解决方案,不如说是一个棘手的解决方法,但它确实解决了我的问题。
希望 https://github.com/facebook/react/issues/2127 修复后我就不再需要它了。
感谢大家的帮助,我真的很感激(再次感谢@mweststrate 对 MobX 的总体帮助:))