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

反应-拥有不可变的道具有什么好处?

邢高爽
2023-03-14

在学习了React之后,我仍然认为很多概念很难理解。

其中包括:道具的不变性。

如果我没弄错的话,那么组件或多或少相当于面向对象编程中的对象。

在面向对象编程中,您通过方法参数将数据传递给对象。在React中,您获得了将数据传递给组件的道具。

如果将参数传递给Java方法,则可以在方法体中更改这些数据。没问题。

在 React 中是不可能的,因为道具是不可变的。

我看过的所有文献和材料都提到了这些不变性作为一个重要概念。但到目前为止,没有人真正告诉我原因。

有人能告诉我:拥有不可改变的道具有什么好处吗?

或者分别是:不具有不变性的最大缺点是什么?如果道具是可变的,会发生什么?

作为一个好例子更可取。那么我得到它的机会就更大了。

共有3个答案

裴宜春
2023-03-14

不可变性的最大好处是,无论组件呈现什么,都是可预测的。生成的视图只是一些道具的地图。想象一下,如果在层次结构中,每个组件都能够更改传递的道具。很难追踪谁是进行修改的人。

这就是为什么在函数式编程中纯函数和不可变类型是常态的原因。这很容易推理出来——纯函数是输入和输出的纯映射,仅此而已。

卞琨
2023-03-14

(看了下面为什么不能在react.js中更新道具?)

如果你只能改变自己的状态,并且你用道具间接传达你的状态,这是一个很好的责任分离。这导致更高的凝聚力。

如果允许您在组件A中通过直接更改道具来更改组件B的状态,则可能会使代码不太容易理解。

我希望这能回答为什么。

祁默
2023-03-14

我长话短说,因为我不是函数式编程的专家。我相信最终会有更有经验的人加入进来。

首先,不要把你的组件看成对象,而是看成功能(用数学术语来说)。您的组件是其属性的函数。更确切地说,这是一个渲染函数。它接受道具并返回HTML(实际上它返回虚拟dom树,但这是不相关的)

数学中的函数是纯函数。你给他们输入,他们给你输出。它们没有副作用,并且不使用任何其他输入。这给你带来了很多好处:

  1. 纯函数是可预测的。每个输入将具有完全相同的输出。可预测的意味着它们可以被优化并利用记忆之类的东西来缓存它们的结果,或者如果它们的道具没有改变,就不必渲染你的部分 UI,因为你知道它们不会改变。
  2. 仅依靠您获得的输入在尝试调试时出现问题时有很大帮助,因为您无需担心全局状态。您只需要担心传递给您的属性。
  3. 您不必担心纯函数的执行顺序,因为它们保证没有副作用。
  4. 它允许非常酷的开发人员体验,如时间旅行调试和热插拔组件。

这些只是一些好处,像我这样的普通开发人员可以看到。我相信有真正函数式编程经验的人可以带来更多。希望有帮助

 类似资料:
  • 我不太喜欢JavaScript。因此,我们进行了以下修补: 我向函数传递一个字符串。一次作为基元变量,下一次作为对象属性。 之后,原始数据保持不变= 现在我想知道: 为什么它们在React中具有这些不变性特性? 我的意思是:他们说函数应该做一些事情,并提供结果。但不改变整个系统。 但如果数据还是按值传递呢?为什么有了不变性,世界变得如此重要?

  • 我一直在阅读React的快速启动文档; 为什么React道具是只读的?

  • 问题内容: 我一直在阅读React的快速入门文档。 无论您将组件声明为函数还是类,都不得修改其自身的道具 这是一个“纯”函数,因为它不尝试更改其输入,并且对于相同的输入始终返回相同的结果: 这是“不纯”函数,因为它更改了自己的输入:https : //codesandbox.io/s/9z38xv4x7r 为什么React道具是只读的? 问题答案: 组件应管理自己的状态,但不应管理自己的道具。本质

  • 有没有一种最佳实践可以将函数类型与React prop类型和TypeScript结合使用? 我以为这会奏效,但事实上它错了: 按照这个思路,我让它工作了,但它似乎不必要地冗长:https://github.com/Microsoft/TypeScript/issues/20007

  • 我正在我的react项目中使用react路由dom V5。我需要通过受保护的路由将道具从应用程序组件(我在其中导入路由器)传递到子组件。问题是道具是空的,没有匹配、位置和历史记录。。 **应用组件 注意:我将道具从应用程序传递到需要使用this.props.match的子组件,但match未定义