首页 web前端 js教程 带钩子的 React 中不存在生命周期

带钩子的 React 中不存在生命周期

Nov 14, 2024 pm 03:18 PM

Lifecycle doesn

很久很久以前,我们在类中使用了 React,还记得吗?

当时,我们有了生命周期方法的概念,即接受在特定时刻执行的回调的类上的方法。三巨头:装载时、更新时和卸载时。

古老但黄金的课程

这很重要,在类组件上,返回的 JSX 是在 render 方法上生成的,状态附加到组件的 this 上,并且应用程序开发人员需要一种方法来知道在某些时刻执行操作。我们对组件生命周期的时间有了概念:

  • componentDidMount 是组件首次渲染并向 DOM 添加元素的时刻,也是开始连接和 API 请求等副作用的时刻。
  • shouldComponentUpdate 允许您手动设置逻辑来比较下一个 props 和状态,并返回一个布尔值来定义是否可以跳过重新渲染。
  • componentDidUpdate 是状态或 props 更改的时刻,再次调用 render 方法并对身份差异进行协调更改并应用于 DOM,有助于将状态与新 props 同步并执行逻辑操作。
  • componentWillUnmount 是 React 将从 DOM 中删除元素的时候,是清理内容和避免内存泄漏的好地方。

当然,您有一个重要的 API,例如forceUpdate,如果您使用的外部数据无法与 React 状态更新连接,它允许您手动触发重新渲染

在概念层面上,我们有一种更直接的方式来执行应用程序的流程。生命周期方法遵循 DOM 元素的类似生命周期,您可以自己执行 memo 和 forceUpdates,同步状态是执行逻辑的默认方式。

这种直接性被认为是简单的,与反应式模型相比,学习这些概念更容易。但后来,Hooks 出现并改变了一切。

未命名的反应性

过渡令人困惑。首先,为了让开发变得简单,并在某种程度上维护开发人员所拥有的 React 模型的概念愿景,许多交流试图展示 hooks 模型的相似之处。为了拥有 3 个主要的生命周期方法,他们展示了 useEffect 的解决方法。

// componentDidMount
 useEffect(() => {
    // code...

    // componentWillUnmount:
    return function cleanup() {
      // code...
    };
  }, []);

// componentDidUpdate
 useEffect(() => {
    // code...

  }, [dependencyState, dependencyProp]);
登录后复制
登录后复制

所以,大多数用 hooks 编写的新 React 代码都遵循这个想法,开始同步状态是一个自然的过程。为了保持生命周期方法的相同理念,这是调用 setState 并触发重新渲染过程的地方。

有什么问题吗?

同步状态成为问题,useEffect 的错误使用成为问题,双重重新渲染成为问题,太多重新渲染成为问题,性能成为问题。

React 的这一步有点令人困惑,至少对我来说是这样。因为,转向钩子就是转向反应式模型,即使它是一个粗粒度的模型。但传达的信息是,没有什么大的变化。没有关于反应性概念和理论的内容,即使使用 React 多年,我也只是阅读 Ryan Carniato 关于反应性和固体的博客文章才开始真正理解反应性。

即使知道 useEffect 有一个误用,我真的不明白为什么,而且缺乏关于反应性的概念理论使得钩子很容易犯错误。 useEffect 成为最令人讨厌的 hook,被一些人称为“useFootgun”。关键是,React 中存在概念上的混乱,表现为我们今天看到的 useEffect 的所有问题。

useEffect问题不是问题的原因,而是问题的结果。

钩子的生命周期怎么样

所以,这就是事情。反应性的概念中没有生命周期。

你发生了变化,你对它做出反应,产生副作用。效果是结果,而不是原因。没有状态同步,也没有挂载和卸载的概念。

无论是卸载前的第一个、第十个还是最后一个渲染都没有关系,而且钩子不关心它,顺便说一句,甚至 useEffect。

尝试一下:

// componentDidMount
 useEffect(() => {
    // code...

    // componentWillUnmount:
    return function cleanup() {
      // code...
    };
  }, []);

// componentDidUpdate
 useEffect(() => {
    // code...

  }, [dependencyState, dependencyProp]);
登录后复制
登录后复制

您将在控制台上看到每次状态更新时都会执行这两个函数。首先是清理,然后是效果回调。如果您使用带有某些状态或属性的 useEffect 来进行订阅,则每次依赖项发生更改时,都会调用清理函数,然后调用新的回调,再次进行订阅,但使用新值。

您应该将应用程序代码视为简化的 React 模型:

function EffectExample() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('effect', count);

    return () => {
      console.log('clean up', count);
    }
  }, [count]);

  return (
    <button onClick={() => setCount((state) => state + 1)}>
      {count}
    </button>
  )
}
登录后复制

如果您有这样的组件:

UI = fn(state)
登录后复制

当您单击按钮并将计数加 1 时,您真正拥有的概念上是这样的:

function Example() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount((state) => state + 1)}>
      {count}
    </button>
  )
}
登录后复制

每次点击都会再次调用 fn,并使用新的状态,生成新版本的 UI。状态应该通过用户的操作或通过异步派生生成的异步值来更改。

这样你就可以保持干净的想法:

  • 状态转换进行新的 fn 调用
  • 在新状态下,您将获得 UI 描述
  • 如果不同,请更新屏幕。

一个干净且一致的模型。

渲染器需要关心在屏幕上添加、更新和删除元素。在组件级别,重要的是:

  • 如果状态改变
  • 应用程序是否可以处理用户操作
  • JSX 中返回的结构。

Hooks 及其响应式模型使 React 与浏览器解耦,使应用程序代码不必关心您处于屏幕渲染过程的哪个时刻。您不再强制更新,甚至不再按照自己的规则处理备忘录,这对于应用开发人员来说不太直接,但在模型方面更直接。

每次重新渲染都会生成一个结构,React 负责剩下的事情。

以上是带钩子的 React 中不存在生命周期的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

See all articles