【发布时间】:2021-07-15 00:35:31
【问题描述】:
为了在更大的组件中渲染更小的组件/jsx,可以采用多种方法。例如,考虑一下:
方法一:
function BigComponent(props) {
const renderSmallComponent1 = () => <div>{props.a}</div>;
const renderSmallComponent2 = () => <div>{props.b}</div>;
return (
<div>
{renderSmallComponent1()}
{renderSmallComponent2()}
</div>
)
}
方法二:
function BigComponent(props) {
const smallComponent1 = <div>{props.a}</div>;
const smallComponent2 = <div>{props.b}</div>;
return (
<div>
{smallComponent1}
{smallComponent2}
</div>
)
}
方法三:
function SmallComponent1({ a }) {
return <div>{a}</div>;
}
function SmallComponent2({ b }) {
return <div>{b}</div>;
}
function BigComponent(props) {
return (
<div>
<SmallComponent1 a={props.a} />
<SmallComponent2 b={props.b} />
</div>
)
}
我只是想了解这三个方面的区别
- 开发经验,
- 框架如何处理它们,
- 是否有任何性能优化,
- 所有这些中的运行时行为是否存在差异?
- 在某些情况下使用哪一种更好?
这些是我理解的:
- 在方法3中,所有
SmallComponent都是React组件,在另一个组件中渲染,所以它们会有一个组件生命周期,而在方法1和2中,它们是简单的jsx,没有生命周期,所以它们会不能作为 React 组件安装/卸载 - 在方法 2 中,我们会急切地评估 JSX,因为它直接是一个变量,而在方法 1 中,它只会在渲染中调用函数时才评估。所以,万一我们有任何条件渲染,急切的评估可能只是浪费。
其他一些有用的文章:
- https://medium.com/missive-app/45-faster-react-functional-components-now-3509a668e69f
- https://kentcdodds.com/blog/dont-call-a-react-function-component
更新:观察 1 似乎是不正确的,因为它们中的所有 3 个仍将呈现为反应组件,因此将具有组件生命周期。所以 react 会挂载/卸载它们。
更新 2:不,观察 1 是正确的,方法 1 和 2 都被视为常规 jsx 作为 BigComponent 的一部分,它们不被视为具有生命周期的反应组件。
更新 3: 还有一种方法方法四:
function BigComponent(props) {
const SmallComponent1 = () => {
return <div>{props.a}</div>;
}
const SmallComponent2 = () => {
return <div>{props.b}</div>;
}
return (
<div>
<SmallComponent1 />
<SmallComponent2 />
</div>
)
}
这与方法3类似,但方法3和方法4在执行上略有不同,通过开发工具调试时。
【问题讨论】:
-
您似乎很了解这些案例。我不确定您想深入挖掘哪个特定方面?
-
诸如此类的问题:是否存在其中一种方法的工作方式与其他方法不同或根本不起作用的情况?它们总是可以互相替换吗?
-
嗯,这对我来说仍然是一个悬而未决的问题。我真的不知道从哪里开始,因为我可以构建各种示例来说明差异行为。
-
@hackape 我认为不同类型的示例仍然会有所帮助,并且可能会回答问题的主要部分,这本质上是关于这三种方法的差异
-
我认为更好的方法是学习 react 的内部工作,而不是仔细检查特殊的用例。一旦你学会了“物理学”,你就会知道如何做所有的“工程”。
标签: javascript html reactjs jsx