react 保持组件纯粹

     部分 JavaScript 函数是 纯粹 的,这类函数通常被称为纯函数。纯函数仅执行计算操作,不做其他操作。你可以通过将组件按纯函数严格编写,以避免一些随着代码库的增长而出现的、令人困扰的 bug 以及不可预测的行为。但为了获得这些好处,你需要遵循一些规则。

纯函数:组件作为公式 

在计算机科学中(尤其是函数式编程的世界中),纯函数 通常具有如下特征:

  • 只负责自己的任务。它不会更改在该函数调用前就已存在的对象或变量。
  • 输入相同,则输出相同。给定相同的输入,纯函数应总是返回相同的结果。

举个你非常熟悉的纯函数示例:数学中的公式。

考虑如下数学公式:y = 2x。

若 x = 2 则 y = 4。永远如此。

若 x = 3 则 y = 6。永远如此。

若 x = 3,那么 y 并不会因为时间或股市的影响,而有时等于 9 、 –1 或 2.5。

若 y = 2x 且 x = 3, 那么 y 永远 等于 6.

我们使用 JavaScript 的函数实现,看起来将会是这样:

function double(number) {
  return 2 * number;
}

上述例子中,double() 就是一个 纯函数。如果你传入 3 ,它将总是返回 6

React 便围绕着这个概念进行设计。React 假设你编写的所有组件都是纯函数。也就是说,对于相同的输入,你所编写的 React 组件必须总是返回相同的 JSX。

当你给函数 Recipe 传入 drinkers={2} 参数时,它将返回包含 2 cups of water 的 JSX。永远如此。

而当你传入 drinkers={4} 时,它将返回包含 4 cups of water 的 JSX。永远如此。

就像数学公式一样。

你可以把你的组件当作食谱:如果你遵循它们,并且在烹饪过程中不引入新食材,你每次都会得到相同的菜肴。那这道 “菜肴” 就是组件用于 React 渲染 的 JSX。

function Recipe({ drinkers }) {
  return (
    <ol>    
      <li>Boil {drinkers} cups of water.</li>
      <li>Add {drinkers} spoons of tea and {0.5 * drinkers} spoons of spice.</li>
      <li>Add {0.5 * drinkers} cups of milk to boil and sugar to taste.</li>
    </ol>
  );
}

export default function App() {
  return (
    <section>
      <h1>Spiced Chai Recipe</h1>
      <h2>For two</h2>
      <Recipe drinkers={2} />
      <h2>For a gathering</h2>
      <Recipe drinkers={4} />
    </section>
  );
}

副作用:(不符合)预期的后果 

React 的渲染过程必须自始至终是纯粹的。组件应该只 返回 它们的 JSX,而不 改变 在渲染前,就已存在的任何对象或变量 — 这将会使它们变得不纯粹!

let guest = 0;

function Cup() {
  // Bad: changing a preexisting variable!
  guest = guest + 1;
  return <h2>Tea cup for guest #{guest}</h2>;
}

export default function TeaSet() {
  return (
    <>
      <Cup />
      <Cup />
      <Cup />
    </>
  );

该组件正在读写其外部声明的 guest 变量。这意味着 多次调用这个组件会产生不同的 JSX!并且,如果 其他 组件读取 guest ,它们也会产生不同的 JSX,其结果取决于它们何时被渲染!这是无法预测的。

回到我们的公式 y = 2x ,现在即使 x = 2 ,我们也不能相信 y = 4 。我们的测试可能会失败,我们的用户可能会感到困扰,飞机可能会从天空坠毁——你将看到这会引发多么扑朔迷离的 bugs!

你可以 将 guest 作为 prop 传入 来修复此组件:

function Cup({ guest }) {
  return <h2>Tea cup for guest #{guest}</h2>;
}

export default function TeaSet() {
  return (
    <>
      <Cup guest={1} />
      <Cup guest={2} />
      <Cup guest={3} />
    </>
  );
}

现在你的组件就是纯粹的,因为它返回的 JSX 只依赖于 guest prop。

一般来说,你不应该期望你的组件以任何特定的顺序被渲染。调用 y = 5x 和 y = 2x 的先后顺序并不重要:这两个公式相互独立。同样地,每个组件也应该“独立思考”,而不是在渲染过程中试图与其他组件协调,或者依赖于其他组件。渲染过程就像是一场学校考试:每个组件都应该自己计算 JSX!

说白了 就是一个参数问题  你不用参数传递 计算  就会出现太多不可能性 因为外面的变量会错误啥的 但是 你用参数 传递的话  相当于把这个公式传死了 只能这样传 固定了一样 就是表达的这个意思

相关推荐

  1. React中hooks使用限制及保存函数组件状态

    2024-06-08 08:10:04       49 阅读
  2. ReactReact表单组件

    2024-06-08 08:10:04       39 阅读
  3. React实现抽屉组件

    2024-06-08 08:10:04       64 阅读
  4. React——组件

    2024-06-08 08:10:04       48 阅读
  5. React——组件通讯

    2024-06-08 08:10:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 08:10:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 08:10:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 08:10:04       82 阅读
  4. Python语言-面向对象

    2024-06-08 08:10:04       91 阅读

热门阅读

  1. PyWhatKit ,一个全自动发送消息多功能的Pyhton库

    2024-06-08 08:10:04       32 阅读
  2. npm安装依赖过慢

    2024-06-08 08:10:04       31 阅读
  3. ArcGIS for js 4.x FeatureLayer 加载、点选、高亮

    2024-06-08 08:10:04       24 阅读
  4. 微信小程序和支付宝小程序生成二维码

    2024-06-08 08:10:04       27 阅读
  5. mysql 如何分布式部署

    2024-06-08 08:10:04       30 阅读
  6. 公司面试题总结(一)

    2024-06-08 08:10:04       25 阅读
  7. 正则表达式

    2024-06-08 08:10:04       30 阅读
  8. Spring Boot 常用注解

    2024-06-08 08:10:04       27 阅读
  9. Ajax + Easy Excel 通过Blob实现导出excel

    2024-06-08 08:10:04       29 阅读
  10. ARCGIS 几种SHP融合、拼接等方法

    2024-06-08 08:10:04       31 阅读