理解 Reactjs 中的 useCallback

理解 Reactjs 中的 useCallback
usecallback 钩子会记住函数本身,而不是它的返回值。 usecallback 缓存函数引用

组件内部声明的函数会在每次渲染时重新创建,类似于变量。不同之处在于,它每次都会使用不同的参考进行渲染。所以,

依赖于此函数的 useeffect 将在每次渲染时再次执行。 子组件也会发生类似的情况。

依赖于此函数的 useeffect 将在每次渲染时再次执行:

import react, { usestate, useeffect, usecallback } from 'react';// parent componentconst parentcomponent = () => {  const [count, setcount] = usestate(0);  const [text, settext] = usestate("");  // function declared inside the component  const handleclick = () => {    setcount(count + 1);  };  // useeffect depending on handleclick  useeffect(() => {    console.log("handleclick changed, running useeffect");  }, [handleclick]);  return (    

count: {count}

);};// child componentconst childcomponent = react.memo(({ handleclick }) => { console.log("childcomponent re-rendered"); return ;});export default parentcomponent;

登录后复制

子组件也会发生类似的情况:

当我们将一个具有昂贵或“慢”渲染逻辑的组件作为另一个组件的子组件时,每次父组件渲染时,其所有子组件也会重新渲染。

为了防止这些不必要的重新渲染,我们可以使用 react.memo。这个高阶组件会缓存子组件,确保它仅在其 props 实际发生变化时才重新渲染。然而,当将函数作为 props 传递时,有一个微妙的问题,这会导致子进程重新渲染,即使它不应该重新渲染。

函数引用的问题

想象一下我们有一个 slowcomponent 作为 app 的子组件。在 app 中,我们有一个状态会在按钮单击时发生变化,从而触发 app 的重新渲染。尽管我们没有更改 slowcomponent 的 props,但它仍然会在每次点击时重新渲染。

为什么?在每次渲染时,handleclick 函数都会使用新的引用重新创建,react 将其解释为更改后的 prop,导致 slowcomponent 重新渲染。为了解决这个问题,我们使用 usecallback 钩子来跨渲染缓存函数的引用。

使用 usecallback 的解决方案

通过将handleclick包装在usecallback中,我们告诉react仅在特定依赖项发生变化时重新创建它。语法如下:

const cachedfn = usecallback(fn, [dependencies]);

登录后复制fn:这是您要缓存的函数定义。它可以接受参数并返回任何值。依赖项:这是一个依赖项数组。如果任何依赖项发生变化,react 将重新创建 fn。在第一次渲染时,react 创建并缓存该函数。在后续渲染中,只要依赖项没有改变,就会返回缓存的函数,确保它有一个稳定的引用。

在我们的示例中应用 usecallback
让我们看看如何使用 usecallback 来优化我们的 app 组件:

import React, { useState, useCallback } from "react";const App = () => {  const [count, setCount] = useState(0);  const [value, setValue] = useState("");  // Wrapping handleClick with useCallback to cache its reference  const handleClick = useCallback(() => {    setValue("Kunal");  }, [setValue]);  return (    

Count: {count}

);};const SlowComponent = React.memo(({ handleClick }) => {// Intentially making the component slow for (let i = 0; i < 1000000000; i++) {} console.log("SlowComponent re-rendered"); return ;});export default App;

登录后复制

何时使用 usecallback

当您为组件内的元素定义了事件处理程序时,请将它们包装在 usecallback 中,以避免不必要地重新创建事件处理程序。当您在 useeffect 中调用函数时,通常会将该函数作为依赖项传递。为了避免在每次渲染时不必要地使用 useeffect,请将函数定义包装在 usecallback 中。如果您正在编写自定义钩子,并且它返回一个函数,建议将其包装在 usecallback 中。因此,用户无需担心优化钩子 – 相反,他们可以专注于自己的代码。

buy me a coffee

以上就是理解 Reactjs 中的 useCallback的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3084413.html

(0)
上一篇 2025年3月28日 04:38:14
下一篇 2025年3月13日 18:22:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • React TSX页面加载时如何请求接口及处理动态接口地址?

    在 react tsx 中实现页面加载时请求接口 本文将详细解答如何在 react tsx 项目中,实现页面加载完成后立即发起接口请求,并解决接口地址动态变化的问题。提问者希望类似 vue 的 mounted 生命周期钩子,在组件挂载后执行…

    编程技术 2025年3月28日
    100
  • Vue低代码表单拖拽生成器:如何实现下拉选项的组件关联?

    Vue低代码表单拖拽生成器:巧妙实现下拉选项组件关联 构建Vue低代码表单拖拽生成器时,一个核心功能是实现下拉选项与其他组件的关联。 用户拖拽下拉选择组件后,可为每个选项指定关联的表单组件。选择特定选项时,仅显示关联组件,其余组件隐藏。本文…

    2025年3月28日
    100
  • Vue+ElementUI表格异步加载导致字段缺失:如何解决数据渲染与加载时机不匹配问题?

    Vue+ElementUI表格异步加载字段缺失问题详解及解决方案 在Vue和ElementUI项目中,异步加载数据经常导致表格部分字段缺失,本文将深入分析此问题,并提供有效的解决方案。 问题描述: 使用el-table组件显示数据时,从后端…

    2025年3月13日
    200
  • uniapp如何使用watch监听器动态设置宽度

    UniApp的watch监听器 动态调整宽度需使用this.$nextTick()方法以确保DOM更新完成后修改生效。此外,留意组件渲染顺序,使用异步等待或v-if控制元素显示,使用计算属性优化计算逻辑,避免频繁更新宽度,并善用调试技巧,如…

    2025年3月13日
    200
  • Vue中如何使用render函数进行组件的渲染

    Vue中如何使用render函数进行组件的渲染 Vue是一款前端框架,它通过组件化开发的思想,使得我们可以将页面拆分成多个独立的组件进行开发和维护。在Vue的组件中,我们通常使用template来定义组件的结构和逻辑。但是在某些情况下,te…

    2025年3月13日
    200
  • vue中路由的作用

    Vue.js 中的路由是一个管理单页应用程序 (SPA) 中页面导航的系统,提供以下主要作用:声明式导航,允许您在单独的文件中声明程序的路由。页面切换,实现应用程序不同部分之间的无缝导航。路径解析,解析当前 URL 并确定要渲染哪个组件。U…

    2025年3月13日
    200
  • vue中create的作用

    Vue 中 create 方法用于在组件实例化之前创建响应式对象,以便初始化组件数据、创建可复用对象、延迟加载数据和在组件销毁时清理资源。它返回一个新的响应式对象,其属性可随着时间的推移自动更新。 Vue 中 create 的作用 在 Vu…

    2025年3月13日
    200
  • vue中slot的作用

    Slot 在 Vue 中允许子组件向父组件传递内容,提升组件的可重用性和定制化。主要作用包括:内容投影:使子组件将内容投影到父组件。可定制化:使子组件能够定制父组件的布局和内容。解耦:保持父子组件分离,子组件专注内容,父组件负责布局交互。 …

    2025年3月13日
    200
  • vue中使用组件的步骤

    Vue 中使用组件的步骤为:创建组件定义组件模板定义组件脚本注册组件在模板中使用组件传递 props(可选)发射事件(可选)使用 slots(可选) Vue 中使用组件的步骤 第一步:创建组件 使用 Vue CLI 脚手架创建新组件:vue…

    2025年3月13日
    200
  • vue中为什么要写key

    为什么在 Vue 中需要使用 key?Vue 中使用 key 至关重要,因为它可:标识列表项,以进行准确的更新。优化 diff 算法,以高效检测更改。缓存子组件,以提高性能。避免 DOM 不一致。 为何在 Vue 中需要使用 key 在 V…

    2025年3月13日
    200

发表回复

登录后才能评论