动态推导及其杀死useEffect的方法
标题有点“点击诱饵”,但想法并没有错。
我并不认为 useEffect 是一个不好的 hook,实际上恰恰相反。但在作为派生机的 React 中,使用 useEffect 进行状态同步并不是最好的选择,核心团队也不推荐。
但是等等,如果我有需要同步状态的情况?
是的,这是非常罕见的情况,也许有更好的解决方案选项,但想象一下我们在应用程序中有一个帖子,并且当用户单击“喜欢”按钮时,我们希望有一个本地状态来处理乐观更新,但它与外部状态(来自后端)同步,以真正了解是否发生了类似情况。
可变的派生
在这种情况下,我们需要一个可以同时进行状态和推导的原语。从概念上讲,我们可以将其视为可变推导。 Ryan Carniato 有一篇关于它的很好的博客文章,但是存在一些与 React 管理反应性的方式相关的限制,但是这个新的原语将是推导和状态:
派生作为默认行为,获取最后更新的事实来源(来自服务器的数据道具)。
说明用户何时单击“喜欢”按钮。此更改是临时的,将在下一次依赖项更改时被覆盖。
当然,我们在 React 上没有它,但我们可以想象这样的原语。它的优点:
- 它从 useEffect 中又删除了一个用例。
- 它清楚地表明我们有一个可以作为状态处理的推导。
使用MemoState
const [internalState, setInternalState] = useMemoState(() => data, [data]);
钩子像普通的useMemo一样接受两个参数,第一个参数是memo函数,通常会在第一次执行,返回值将是状态。第二个参数是众所周知的依赖项数组,用于跟踪值并在必要时重新计算备忘录。它返回一个包含两个值的元组,即状态/备忘录值和临时更改状态的设置器。
使用钩子就像这个例子:
function MemoState ({ data }: { data: State}) { const [internalState, setInternalState] = useMemoState(() => data, [data]); return () } name: {internalState?.title}
{internalState?.like ? "liked post" : "not liked post"}
通过这种方式,您可以消除这里对 useEffect 的需求,确切地知道这个钩子正在做什么和能够做什么,并填补这个概念空白,我们的问题同时需要一个状态和一个派生。讽刺的是,它因此消除了对效果的需要。
我们如何在 React 中做类似的事情?
为了遵循 React 规则并保持钩子安全,我们需要使用 useEffect 在今天的 React 中创建类似的东西。我不认为将来会做出这样的钩子,但谁知道呢,对吧?
为了避免在这里使用 useEffect,我们需要使用一些外部代码(例如迷你状态库)来处理它,或者如果我们想保留严格的 React 原语,则使用 useRef 来保持值的同步。
这种方法的问题在于它违反了 React 规则,并且文档不建议这样做。因为它在没有效果的情况下工作的唯一方法是在组件渲染期间同步引用,一点也不安全。
因此,为了保持简单和安全,hook 的示例如下:
const [internalState, setInternalState] = useMemoState(() => data, [data]);
以上是动态推导及其杀死useEffect的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。
