当前位置: 首页 > news >正文

React Native 中的 useCallback

一个简单的比喻:点菜和厨师

想象一下,你是一个顾客(组件),你在一个餐厅里点菜。

没有 useCallback 的情况(普通做法):

  • 你每次喊服务员(子组件)过来,哪怕只是问一句“我的菜好了吗?”,你都会重新写一张全新的、一模一样的菜单交给他。
  • 服务员(子组件)很困惑:“这张新菜单和上一张完全一样啊?为什么又要给我一份?”
    虽然他可能还是会去后厨问一下,但这个“重新写菜单”的动作是多余的,浪费了纸张和精力。

使用 useCallback 的情况(聪明做法):

  • 你第一次点菜时,写好了菜单(创建了函数)。

  • 你告诉服务员:“这是我的菜单,只要我点的菜不变(依赖项不变),你就一直用这张旧菜单,不用我每次都重写。”

  • 这样,只有当你想加菜或退菜(依赖项改变)时,你才会写一张新菜单给他。否则,每次都递给他同一张旧菜单。

服务员(子组件)拿到旧菜单,一看:“哦,这张菜单和上次一模一样,内容根本没变,我就不用再跑去后厨问厨师了,直接告诉你‘还没好’就行了。” 这样就节省了不必要的沟通成本。

在代码里是什么意思?

在 React Native 中,这个“服务员”通常就是你的子组件,特别是用 React.memo 包装过的、被优化过的子组件。

  • 函数(菜单): 就是你定义在组件内部的函数,比如 handlePress, onSubmit
  • 依赖项(点的菜): 就是函数内部使用到的、来自组件外部的变量,比如 state, props

为什么要用 useCallback

主要目的是性能优化。通过避免在每次渲染时都创建新的函数,可以让依赖于此函数的子组件避免不必要的重新渲染。

语法超级简单

import { useCallback } from 'react';const MyComponent = () => {const [count, setCount] = useState(0);// 没有 useCallback - 每次渲染都创建新函数// const handlePress = () => {//   console.log('Pressed!', count);// };// 使用 useCallback - 只有当 count 改变时,才会创建新函数const handlePress = useCallback(() => {console.log('Pressed!', count);}, [count]); // <-- 依赖项数组:count 变了,函数才更新return (<View><Text>Count: {count}</Text>{/* 这个ChildComponent如果用了React.memo,就能从useCallback中受益 */}<ChildComponent onPress={handlePress} /></View>);
};

给小白的关键总结

  1. 是什么: useCallback 是一个“记忆函数”的工具。它能把一个函数“缓存”起来。

  2. 为什么用: 为了防止因为父组件重新渲染,导致传给子组件的函数每次都变成新的,从而触发子组件不必要的渲染。主要是为了性能优化。

  3. 什么时候用:

    • 当你把一个函数作为 prop 传递给一个被 React.memo 包装的子组件时。

    • 当你把一个函数作为依赖项传给其他 Hook(比如 useEffect)时。

  4. 怎么用: 用 useCallback 把你的函数包起来,并在第二个参数里告诉它,这个函数依赖了哪些变量。

最后提醒: 不要滥用!不是每个函数都需要 useCallback。只有当它真的能解决性能问题时才使用。对于简单的组件,用了反而可能增加复杂度,得不偿失。先写没有它的代码,遇到性能问题再考虑它。

http://www.dtcms.com/a/423884.html

相关文章:

  • 哪些网站做的比较好看480元做网站
  • DSC蓝宝石法:精准测量材料比热容的核心技术
  • 在 Kubernetes 集群中运行并发布应用程序
  • Node.js面试题及详细答案120题(81-92) -- 框架与生态篇
  • 永久网站域名注册网页版传奇大全
  • 软考~系统规划与管理师考试—知识篇—第二版—1.2 信息技术及其发展
  • 常德网站开发服务抚顺网络推广
  • 建设网站的个人心得青冈网站建设
  • LeetCode 分类刷题:33. 搜索旋转排序数组
  • Pi Network创始人Dr. Chengdiao Fan将在TOKEN2049发表演讲,探讨加密货币现实应用
  • 网站建设工具哪家好邵阳网站建设制作
  • 【WSL2】win11访问ubuntu
  • 网站建设专家排名信誉好的龙岗网站设计
  • SpringWebFlux:响应式Web框架
  • 网站建设中的图片及视频要求青岛的互联网企业
  • CS231n 2025——作业参考与学习笔记导航页
  • 【Android之路】 Kotlin 的 data class、enum class、sealed interface
  • 公司网站注册要多少钱网页设计作业 介绍家乡
  • [特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)
  • 海口网站建设高端asp.net做电商网站
  • C++ 面向对象进阶:继承深化与多态详解
  • 达建网站长沙网站快速排名优化
  • 网站浏览器兼容性问题吗产品介绍网站源码
  • 20.Nginx 服务器
  • CTFshow萌新杂项详细解题攻略及学习笔记
  • jsp网站服务器如何做防护飘云网络科技有限公司
  • Effective Python 第34条: 避免使用 `send()` 给生成器注入数据
  • wordpress站内301上海对外经贸大学
  • 当AI助手“记忆混乱”:理解与应对Roo Code的上下文污染问题
  • Docker 网络详解:(二)虚拟网络环境搭建与测试