动态推导及其杀死useEffect的方法

动态推导及其杀死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 useMemoState = (memoFn, depsList) => {  const [state, setState] = useState(() => memoFn());  useEffect(() => {    setState(memoFn());  }, depsList)  return [state, setState];}

以上就是动态推导及其杀死useEffect的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1498982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 20:56:20
下一篇 2025年12月19日 20:56:34

相关推荐

  • 延迟加载和记忆化| ReactJS |第 1 部分

    ReactJS 上下文中延迟加载和记忆化的比较,包括定义、用例和示例: 延迟加载 定义 React 中的延迟加载是指仅在需要时加载组件或资源的做法,而不是在初始页面加载时加载。这减少了初始加载时间并提高了性能。 要点 目标:减少初始包大小并优化性能。 使用时:对于不立即需要的组件或资产(例如,隐藏选…

    2025年12月19日
    000
  • React组件渲染完成后如何安全地操作DOM?

    react 中渲染生命周期 在 react 中,组件的生命周期包括以下阶段: componentwillmount(已废弃,使用 componentdidmount 代替)componentdidmountcomponentwillreceivepropsshouldcomponentupdatec…

    2025年12月19日
    000
  • React组件渲染完成如何安全地操作DOM?

    react 中页面渲染完成的生命周期 react 组件生命周期提供了几个方法回调,允许开发者在组件不同阶段执行特定的任务。页面渲染完成的生命周期是 componentdidmount()。 页面渲染前后查询 dom 在 componentdidmount() 内查询 dom 元素可能导致问题,因为此…

    2025年12月19日
    000
  • React组件渲染完成后的DOM操作:如何避免useEffect中查询DOM元素失败?

    react 中页面渲染完成的生命周期 react 提供了几个生命周期函数来管理组件生命周期中的不同阶段。当页面渲染完成时,调用的生命周期函数是 componentdidmount。 遇到的问题 在问题中,当组件挂载时使用 useeffect 并在其中尝试查询 dom 元素时,出现错误,提示无法找到指…

    2025年12月19日
    000
  • React组件渲染前如何确保初始化操作完成?

    在组件渲染前确保初始化完成 当组件接收到更新的props时,需要在渲染自身数据之前进行初始化操作。为确保此操作在渲染前完成,可以使用以下生命周期方法: 对于简单场景: 无需任何复杂操作,可以直接在组件函数中声明初始化变量。例如,以下代码: const updateddata = props.data…

    2025年12月19日
    000
  • React自动伸缩文本组件动画闪烁:如何避免渲染闪烁?

    react 中自动伸缩文本组件的动画闪烁问题 在 react 中创建了一个自动根据文本长度缩放的组件,但是在文本变化时,组件在缩放动画中会产生闪烁问题。如何解决这种情况? 解决方案 通过使用 uselayouteffect 代替 useeffect 可以减少动画闪烁。uselayouteffect …

    2025年12月19日
    000
  • Vue中“与“同时使用时如何解决报错?

    在 vue 中使用 错误提示: error cannot use the “src” attribute when is also present because they must be processed together. 解决方案: 立即学习“前端免费学习笔记(深入)”; 为了解决此错误,可…

    2025年12月19日
    000
  • React中useState在异步代码中为何无法更新?

    react中usestate在异步代码中为何无法更新? 背景:以下react代码旨在单击按钮时将计数增加1: import { usestate } from ‘react’;export default function app() { const [count, setcount] = uses…

    2025年12月19日
    000
  • React 中的异步派生

    我们遇到了一个问题,异步很难。 假设您有一个简单的 get api,一个接收 searchtext 作为参数的搜索。您使用您偏好的 http 请求工具调用它并得到一个承诺,它解析为您正在搜索的任何内容的列表。 如何在 react 组件中调用它? 首先,需要注意一件事,我所描述的可以建模为: resu…

    2025年12月19日
    000
  • useMemo 与 useCallback

    简介 react 提供了广泛的钩子来帮助我们高效地构建动态应用程序。在这些钩子中,usememo和usecallback是提高组件性能的重要工具。尽管两者都有相似的目的——防止不必要的重新计算或函数重新创建——但它们适用于不同的场景。 在本文中,我们将探讨 usememo 和 usecallback…

    2025年12月19日
    000
  • Reactmemo 与 useMemo:如何优化 React 性能

    性能优化是构建可扩展的 react 应用程序的一个关键方面。随着组件树的增长,不必要的重新渲染可能会减慢您的应用程序的速度。幸运的是,react 提供了两个有用的钩子——react.memo() 和 usememo()——它们通过记忆组件和值来帮助减少不必要的渲染。 在本文中,我们将深入探讨 Rea…

    2025年12月19日
    000
  • 理解 Reactjs 中的 useCallback

    usecallback 钩子会记住函数本身,而不是它的返回值。 usecallback 缓存函数引用 组件内部声明的函数会在每次渲染时重新创建,类似于变量。不同之处在于,它每次都会使用不同的参考进行渲染。所以, 依赖于此函数的 useeffect 将在每次渲染时再次执行。 子组件也会发生类似的情况。…

    2025年12月19日
    000
  • React 性能优化技术:记忆化、延迟加载等

    构建现代 web 应用程序时,性能是关键。用户期望应用程序快速、响应灵敏,即使是轻微的延迟也会导致沮丧。 react 虽然功能强大,但有时会遇到性能瓶颈,尤其是当应用程序规模和复杂性不断增长时。幸运的是,有多种技术可以优化性能,包括记忆、延迟加载等等。 在本指南中,我们将详细介绍一些优化 react…

    2025年12月19日
    000
  • 如何制作js组件

    JavaScript 组件是可重用的代码块,用于构建交互式 web 界面。创建组件涉及:导出组件类、定义属性、定义方法和渲染 HTML 模板。使用组件包括导入、实例化并将其渲染到 DOM 中。最佳实践建议保持组件简洁、使用 Props 传递数据、使用 State 管理内部数据、遵循命名约定和进行测试…

    2025年12月19日
    000
  • 了解具有正确路由的 React Outlet

    本文将探讨 react 出口的功能以及 react 应用程序中的路由基础知识。首先也是最重要的,我们需要了解路由的基础知识 了解基础知识 在深入研究之前,让我们确保我们对 react router 有深入的了解。 什么是 react router? ​​react router 是一个流行的 jav…

    2025年12月19日
    000
  • Vuejs 初学者 VueJs 部分理解生命周期钩子

    生命周期钩子是 vue.js 的一项重要功能,它允许您在组件生命周期的特定阶段运行代码。在这篇文章中,我们将探讨什么是生命周期钩子以及如何在 vue 应用程序中有效地使用它们。 – 什么是生命周期钩子?生命周期挂钩是在组件生命周期的不同阶段(从创建到销毁)调用的方法。了解这些钩子可以帮助…

    2025年12月19日
    000
  • 每个开发人员都应该了解的核心 React 概念

    掌握 react:关键概念综合指南 react 彻底改变了我们构建用户界面的方式。本指南将引导您了解基本的 react 概念,帮助您了解如何创建动态、高效且可维护的应用程序。 jsx 和动​​态值react 的核心优势之一是 jsx,它允许您在标记中使用动态 javascript 值。您可以使用花括…

    2025年12月19日
    000
  • useRef 钩子解释

    react 中的 useref 钩子是一个强大的功能,它允许您创建对 dom 元素或在组件的整个生命周期中持续存在的任何其他值的可变引用。以下是其工作原理及其用例的详细说明: 什么是 useref? 持久存储:useref 提供了一种保存可变引用的方法,该引用在更新时不会触发重新渲染。这与状态不同,…

    2025年12月19日
    000
  • `useCallback` vs `useMemo` Hooks

    提升 react 性能:usecallback 与 usememo hooks react 的 usecallback 和 usememo 挂钩对于优化应用程序的性能至关重要。了解何时以及如何使用它们可以使您避免不必要的重新渲染并确保您的应用程序顺利运行。在本文中,我们将深入研究有效使用 useca…

    2025年12月19日
    000
  • React 基础知识第 2 部分

    以下是一些更高级的 react 概念和术语: 12。上下文 api context api 提供了一种通过组件树传递数据的方法,而无需在每个级别手动传递 props。它对于主题、身份验证或用户数据等全局数据很有用。 示例: const themecontext = react.createconte…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信