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

中小企业网站制作哪家好容桂网站建设找顺的

中小企业网站制作哪家好,容桂网站建设找顺的,推动房地产发展新模式,wordpress app 登录目录 场景优化方案示例延伸例子:为什么这很重要?常见的请求 hook 封装优化前优化后优化点一览优化后的 useLoadData使用方式示例:优点回顾 场景 如果你写了一个自定义 Hook,比如 useMyHook(),它暴露出某些值或函数给外…

目录

  • 场景
  • 优化方案
  • 示例
  • 延伸例子:为什么这很重要?
  • 常见的请求 hook 封装
    • 优化前
    • 优化后
      • 优化点一览
      • 优化后的 useLoadData
      • 使用方式示例:
      • 优点回顾

场景

  • 如果你写了一个自定义 Hook,比如 useMyHook(),它暴露出某些值或函数给外部组件使用。
  • 那么你要特别注意 这些值或函数是否在每次渲染时都保持稳定,否则使用这些值的组件会频繁地重新渲染,或者造成外部 useEffectuseCallbackuseMemo 等 Hook 的依赖不准确,出现难以追踪的 bug。

优化方案

  • 如果你的 Hook 返回的是回一个值,你应该使用 useMemo 或者 useRef 将它缓存。
  • 如果你的 Hook 返回的是一个回调函数(如 handleChangeonClick),你应该使用 useCallback 将它缓存。

即,尽量使用 React 已提供的稳定引用,比如 useMemo, useCallback, useRef, 而不是每次都创建新值。这样能我们提供的 Hook 更高效、更可控。

示例

function useCounter() {const [count, setCount] = useState(0);// ⚠️ 不推荐:每次调用 useCounter 都返回新函数// const increment = () => setCount(count + 1);// ✅ 推荐:使用 useCallback 缓存回调const increment = useCallback(() => {setCount(c => c + 1);}, []);return { count, increment };
}

延伸例子:为什么这很重要?

function useTodos() {const [todos, setTodos] = useState([]);// 每次渲染都返回新引用const addTodo = (text) => setTodos([...todos, { text }]);return { todos, addTodo };
}

如果外部组件用 useEffect(() => { ... }, [addTodo]),那它就会在每次渲染时重新执行,因为 addTodo 函数每次都是新引用。

改进后👇:

const addTodo = useCallback((text) => setTodos(todos => [...todos, { text }]),[]
);

常见的请求 hook 封装

优化前

const useLoadData = (fetchData) => {const [result, setResult] = useState({type: "pending",});const loadData = async () => {setResult({ type: "loading" });try {const data = await fetchData();setResult({ type: "loaded", data });} catch (err) {setResult({ type: "error", error: err });}};return { result, loadData };
};

优化后

下面是一个更高性能、语义更清晰且适合共享的版本,优化点包括:

优化点一览

  1. 使用 useCallback 缓存 loadData,防止外部组件因引用变化而频繁 re-render。
  2. 支持可选的自动加载(autoLoad)或依赖加载(传入依赖数组)。
  3. 支持外部传入初始状态和重置逻辑。
  4. 使用 useRef 存储 isMounted 防止组件卸载后状态更新(可选安全处理)。

优化后的 useLoadData

import { useCallback, useEffect, useRef, useState } from "react";type LoadState<T> =| { type: "pending" }| { type: "loading" }| { type: "loaded"; data: T }| { type: "error"; error: unknown };interface UseLoadDataOptions {autoLoad?: boolean;deps?: any[];
}function useLoadData<T>(fetchData: () => Promise<T>,options: UseLoadDataOptions = {}
) {const { autoLoad = false, deps = [] } = options;const [result, setResult] = useState<LoadState<T>>({ type: "pending" });const isMounted = useRef(true);useEffect(() => {return () => {isMounted.current = false;};}, []);const loadData = useCallback(async () => {setResult({ type: "loading" });try {const data = await fetchData();if (isMounted.current) {setResult({ type: "loaded", data });}} catch (err) {if (isMounted.current) {setResult({ type: "error", error: err });}}}, [fetchData]);// 自动加载逻辑useEffect(() => {if (autoLoad) {loadData();}// eslint-disable-next-line react-hooks/exhaustive-deps}, deps);return { result, loadData };
}

使用方式示例:

const fetchUsers = () => fetch("/api/users").then(res => res.json());const { result, loadData } = useLoadData(fetchUsers, {autoLoad: true,deps: [], // 你可以传入 [userId] 等依赖
});if (result.type === "loading") return <p>加载中...</p>;
if (result.type === "error") return <p>出错啦:{String(result.error)}</p>;
if (result.type === "loaded") return <UserList users={result.data} />;

优点回顾

优化点好处
useCallback 缓存外部组件可稳定依赖 loadData,避免不必要副作用
自动加载支持更通用,可在多场景下使用
isMounted 防护防止异步请求完成后组件已经卸载导致的警告或错误
泛型支持 T类型更友好,适用于各种返回值类型的数据加载

文章转载自:

http://27fqcgKf.jzpxj.cn
http://UrVZBHOM.jzpxj.cn
http://3TMxK5uI.jzpxj.cn
http://THsMQGTu.jzpxj.cn
http://pQyJjh6Z.jzpxj.cn
http://Lh9AejTx.jzpxj.cn
http://6OB30iyv.jzpxj.cn
http://PtYD2WBG.jzpxj.cn
http://o1uIfJyn.jzpxj.cn
http://E2mxvfck.jzpxj.cn
http://aeZC1PqG.jzpxj.cn
http://HxDkbE9J.jzpxj.cn
http://5svzz1fy.jzpxj.cn
http://JOrkoroV.jzpxj.cn
http://gStxE72P.jzpxj.cn
http://Gja8RpXO.jzpxj.cn
http://m6d2DPSM.jzpxj.cn
http://SAktr5o1.jzpxj.cn
http://tUTPfGj0.jzpxj.cn
http://QzQONvXr.jzpxj.cn
http://bwq6Z39M.jzpxj.cn
http://iYYxDvR7.jzpxj.cn
http://ojYkR96W.jzpxj.cn
http://I89HPw8p.jzpxj.cn
http://Yyzta2qi.jzpxj.cn
http://NgvLBNX1.jzpxj.cn
http://BYEeEoBP.jzpxj.cn
http://D5jZT1YL.jzpxj.cn
http://lN8jtK9i.jzpxj.cn
http://BZeEjBaJ.jzpxj.cn
http://www.dtcms.com/wzjs/747127.html

相关文章:

  • 培训网站建设方案云南建设人才网站首页
  • 运营网站销售队伍建设与管理网站源码检测
  • 如何创立网站网站ico如何添加
  • 怎么根据网站前端做网站后台温州网站优化指导
  • 江苏省网站备案电话唯品会购物网站开发项目
  • 遵义网站开发哪家好自己做企业网站的步骤
  • 知名的网站制作免费个人网站模版下载
  • 多城市网站开发网络营销十大成功案例
  • 公司英文网站多少钱浙江建设信息港网站
  • 永久免费手机网站建设的好处沧州网络公司排名
  • wordpress后台修改文章浏览数企业关键词排名优化哪家好
  • 网站开发主流框架wordpress装模板
  • 免费广州网站开发维护市场营销公司排名
  • 月子中心网站建设需求找事做网站
  • iis网站子目录设置二级域名网站开发上海
  • 服装营销型网站建设济南房产网官网首页
  • 卓手机建网站西安制作手机网站
  • 江门住房和城乡建设部网站seo网站课程
  • 物流信息网站承德网站制作多少钱
  • 二级学院英语网站建设通知建设银行网站查询密码怎么开通
  • 高端集团响应式企业网站模板大连建设网水电费查询网址
  • jsp网站怎么做邮箱验证码做一钓鱼网站
  • php网站开发工具有哪些沈阳cms建站模板
  • 南宁伯才网络公司做网站好吗成都网页设计多少钱
  • 免费的企业黄页网站wordpress 伪静态
  • 白云网站建设价格网站做系统下载
  • 西安做酒店用品的网站龙华新区做网站
  • 上海外包公司网站建设找网页模板的网站
  • 旧域名新网站国内网站建设公司排名
  • 南充网站建设公司平台网站怎么做seo