在学习了React之后,我仍然认为很多概念很难理解。
其中包括:道具的不变性。
如果我没弄错的话,那么组件或多或少相当于面向对象编程中的对象。
在面向对象编程中,您通过方法参数将数据传递给对象。在React中,您获得了将数据传递给组件的道具。
如果将参数传递给Java方法,则可以在方法体中更改这些数据。没问题。
在 React 中是不可能的,因为道具是不可变的。
我看过的所有文献和材料都提到了这些不变性作为一个重要概念。但到目前为止,没有人真正告诉我原因。
有人能告诉我:拥有不可改变的道具有什么好处吗?
或者分别是:不具有不变性的最大缺点是什么?如果道具是可变的,会发生什么?
作为一个好例子更可取。那么我得到它的机会就更大了。
不可变性的最大好处是,无论组件呈现什么,都是可预测的。生成的视图只是一些道具的地图。想象一下,如果在层次结构中,每个组件都能够更改传递的道具。很难追踪谁是进行修改的人。
这就是为什么在函数式编程中纯函数和不可变类型是常态的原因。这很容易推理出来——纯函数是输入和输出的纯映射,仅此而已。
(看了下面为什么不能在react.js中更新道具?)
如果你只能改变自己的状态,并且你用道具间接传达你的状态,这是一个很好的责任分离。这导致更高的凝聚力。
如果允许您在组件A中通过直接更改道具来更改组件B的状态,则可能会使代码不太容易理解。
我希望这能回答为什么。
我长话短说,因为我不是函数式编程的专家。我相信最终会有更有经验的人加入进来。
首先,不要把你的组件看成对象,而是看成功能(用数学术语来说)。您的组件是其属性的函数。更确切地说,这是一个渲染函数。它接受道具并返回HTML(实际上它返回虚拟dom树,但这是不相关的)
数学中的函数是纯函数。你给他们输入,他们给你输出。它们没有副作用,并且不使用任何其他输入。这给你带来了很多好处:
这些只是一些好处,像我这样的普通开发人员可以看到。我相信有真正函数式编程经验的人可以带来更多。希望有帮助
我不太喜欢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未定义