当前位置: 首页 > 知识库问答 >
问题:

javascript - 是否推荐把原始数据作为props参数传递给react组件让组件自己计算然后渲染?

司徒鸿文
2024-08-21

有一个Electorn 项目,里面的前端有一个组件,

在设计的时候,有一个问题想要和大家讨论一下:

在此项目内,组件需要接入props数据,目前对props做设计。
现在的情况是,需要对原始数据大量计算才能得到需要的props然后传输给组件,想要问一下:
1、是否推荐把原始数据作为props参数传递给组件让组件自己计算然后渲染?
2、是否不管在组件内还是组件外计算,对整个应用都是消耗一样的性能?
3、如果是在组件外进行计算,那么是否有推荐的方式进行做到性能提升?比如开辟线程进行处理之后传递给组件?

QQ_1724118930973.png

共有2个答案

华星驰
2024-08-21
  1. 是否推荐把原始数据作为props参数传递给组件让组件自己计算然后渲染?
    组件的作用就是逻辑内敛,高度抽象,降低使用成本。如果你在多处拿到的原始数据结构都是一样的,不用纠结,应该直接把数据传递给组件,让组件内部进行处理。
  2. 是否不管在组件内还是组件外计算,对整个应用都是消耗一样的性能?
    是的,都是需要计算,但是组件内部可以做性能优化。
  3. 如果是在组件外进行计算,那么是否有推荐的方式进行做到性能提升?比如开辟线程进行处理之后传递给组件?
    组件内部可以使用,使用多线程,可参考 https://www.electronjs.org/docs/latest/tutorial/multithreading
薛烈
2024-08-21

回答问题

  1. 是否推荐把原始数据作为props参数传递给组件让组件自己计算然后渲染?

    不推荐直接将原始数据作为props传递给组件并在组件内部进行大量计算。这种做法有几个潜在的问题:

    • 重复计算:如果多个组件需要基于相同的数据进行计算,每个组件都会独立执行这些计算,导致计算资源的浪费。
    • 组件职责不明确:组件通常应该只关注展示逻辑和UI状态,而不是数据计算。将数据计算逻辑放在组件外部可以使组件更加专注于其职责。
    • 测试和维护难度增加:将业务逻辑与展示逻辑混合在一起会增加代码的复杂性和维护成本。
  2. 是否不管在组件内还是组件外计算,对整个应用都是消耗一样的性能?

    不是。在组件外部进行计算通常更高效,因为它允许重用计算结果,避免在多个组件中重复计算相同的数据。此外,将计算逻辑与组件分离还可以更容易地并行处理或优化这些计算,例如使用Web Workers进行异步计算,以减少对主线程的影响。

  3. 如果是在组件外进行计算,那么是否有推荐的方式进行做到性能提升?比如开辟线程进行处理之后传递给组件?

    是的,在组件外部进行计算并优化性能是一个好策略。以下是一些推荐的方法:

    • 使用Memoization(记忆化):对于需要频繁计算但结果变化不大的函数,可以使用Memoization来缓存结果,避免重复计算。
    • 异步处理:对于耗时较长的计算,可以使用Web Workers或async/await等机制在后台线程中执行,避免阻塞UI线程。
    • 数据预处理:在应用启动时或数据变化前,对数据进行预处理和计算,以减少运行时的计算量。
    • 优化算法:选择更高效的算法来减少计算复杂度。

    关于开辟线程,在Electron中,你可以利用Node.js的worker_threads模块来创建工作线程,这些线程可以执行JavaScript代码,而不会阻塞主线程(即UI线程)。但是,请注意线程间通信的开销,并确保数据在线程之间安全地传递和同步。

总结

为了提升React应用的性能,建议将计算逻辑与组件展示逻辑分离。在组件外部进行计算,并通过props将计算结果传递给组件进行渲染。这样可以避免重复计算,提高代码的可维护性和可测试性。同时,可以考虑使用Memoization、异步处理、数据预处理和优化算法等技术来进一步提升性能。在Electron项目中,可以利用Node.js的线程能力来执行耗时的计算任务。

 类似资料:
  • 问题内容: 我正在尝试访问DetailsPage组件中的 ID ,但无法访问它。我试过了 将参数传递给DetailsPage,但徒劳。 所以有什么想法如何将ID传递给DetailsPage吗? 问题答案: 如果要将props传递到路线内的组件,最简单的方法是利用,如下所示: 您可以使用以下内容访问道具: 将需要通过原路线的道具,否则你将只能得到内。

  • 问题内容: 我已经在子组件的窗体上创建了。使用jquery ajax方法提交该表单后,我将以json格式检索一些数据。我想将该数据置于父组件的状态。那么,react.js中是否有任何方法可以将值或数据从子组件传递到其父组件? 谢谢.. 问题答案: 在没有某种Flux实现的情况下执行此操作的方法是在父元素上创建一个函数来处理来自子级的响应/数据,并将该函数作为道具传递。然后从孩子那里调用该函数。像这

  • 本文向大家介绍Vue.js组件使用props传递数据的方法,包括了Vue.js组件使用props传递数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Vue.js使用props传递数据的具体代码,供大家参考,具体内容如下 基本用法 通常父组件的模板中包含子组件,父组件要正向地向子组件传递数据或参数,子组件接收到后根据参数的不同来渲染不同的内容或执行操作。这个正向传递数据的过程

  • React 的props传递是否只能传递对象,而不能传递数组? 我有如下的数组数据: 传递数据到: 我在组件内接受的时候,会变成对象: 所以,是否React 的props传递是否只能传递对象,而不能传递数组?如果想要传递数组应该怎么传递呢?对treeData 进一步封装是吗?

  • 问题内容: 我有一个带有一些componentDidMount逻辑的React组件: 是否可以通过props传递此组件,以便componentDidMount()中的所有内容都被执行,以某种方式伪造以便截取屏幕截图?遵循以下原则: 我知道我可以使用,但是我有一些复杂的登录逻辑,我想使用这样的快捷方式来避免,而是将所有需要的道具直接传递给组件? 问题答案: 在这里回答了这个问题。让我们在这里尝试相同

  • 问题内容: 我想使用数组作为参数调用一个函数: 有路过的内容的一种更好的方式进入? 问题答案: const args = [‘p0’, ‘p1’, ‘p2’]; call_me.apply(this, args); 请参阅MDN文档。 如果环境支持ECMAScript6,则可以改用传播参数:

  • 问题内容: 有谁知道如何将C#ASP.NET数组传递给JavaScript数组?示例代码也将很好。 对不起,如果我以前的人含糊不清。这个问题实际上很简单。为了简单起见,我在文件中声明: 现在,我想传递给客户端,并在JavaScript中使用数组中的数据。我该怎么做? 问题答案: 您可以使用ClientScript.RegisterStartUpScript将javascript注入Page_Loa

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。