首页 > 其他分享 >React项目优化

React项目优化

时间:2025-01-16 09:31:28浏览次数:3  
标签:const 示例 data 项目 React useState 组件 优化

一、使用React.memo

对于纯组件(Pure Components), 使用 React.memo 包装,防止不必要的重染。

import React, { useState, memo } from "react";

// 定义一个纯组件
const ChildComponent = ({ value }) => {
  console.log("ChildComponent rendered");
  return <div>子组件的值: {value}</div>;
};

// 使用 React.memo 包装纯组件
const MemoizedChildComponent = memo(ChildComponent);

const App = () => {
  const [count, setCount] = useState(0);
  const [text, setText] = useState("");

  const increment = () => setCount(count + 1);

  return (
    <div>
      <h1>React.memo 示例</h1>
      <button onClick={increment}>增加计数器: {count}</button>
      <input
        type="text"
        value={text}
        onChange={(e) => setText(e.target.value)}
        placeholder="输入一些文字"
      />
      {/* 使用 MemoizedChildComponent 代替普通组件 */}
      <MemoizedChildComponent value={count} />
    </div>
  );
};

export default App;

二、使用useCallback和useMemo

1、useCallback用于缓存函数使用,避免子组件因为传入函数变化而重新渲染

2、useMemo 用于缓存计算结果,避免每次渲染时都重新计算。 示例:

const memoizedcallback=useCallback(()=>{
dosomething(a,b);
},[a, b]);
const memoizedValue = useMemo(()=>computeExpensiveValue(a, b),[a, b]);

三、拆分组件

将大组件拆分为更小的可复用组件,提高代码可读性和性能(通过减少不必 要的重渲染)

四、避免匿名函数和对象

在 JSX 中避免使用匿名函数和对象,因为每次渲染都会创建新的实例。 示例:

// 不推荐
<MyComponent onClick={()=>handleclick()} style={{ color:'red' }} />

// 推荐
const handleClick=usecallback(()=>{
// 点击处理逻辑
},[]);
const style ={color:'red'};

<MyComponent onclick={handleclick} style={style}/>

五、优化列表渲染

使用react-window或react-virtualized进行虚拟化长列表,提高渲染能力。 示例:

import {FixedsizeList as List }from 'react-window
const Row=({index,style })=>(
<div style={style}>Row {index}</div>
)
const Example=()=>
<List
height={150}
itemCount={1800}
itemsize={35}
width={300}
>
 {Row}
</List>
);

六、代码分割和懒加载

使用 React的 React.lazy 和 5uspense 动态加载组件,减少初 始加载时间 示例:

const otherComponent =React.lazy(() =>import("./othercomponent'));
function Mycomponent(){
 return (
  <Suspense fallback={<div>Loading...</div>}>
  <OtherComponent />
  </Suspense>
 );
}

七、使用性能优化工具

使用 React 开发者工具的 Profiler 分析和优化应用的渲染性能。 示例:在 Chrome 或 Firefox 中安装 React Developer Tools,然后在 Profiler 中查看各组件的渲染时间。

八、减少 Redux 或 Context 重渲染

使用 useselector 时,提供精确的选择器函数,避免整个状态变 化导致的组件重渲染。 示例:

const selectedData =useSelector(state =>state.somespecificPart);

九、避免不必要的副作用

确保useEffect中的依赖数组正确配置,避免不必要的副作用执行 示例:

useEffect(() =>{
//副作用逻辑
},[specificDependency])

十、提升图片和资源加载

使用现代图片格式(如 WebP)和图像懒加载技术(如 loading="lazy") 示例:

<img src="image.webp" alt="example" loading="lazy" />

十一、网络请求优化

1、合理使用缓存,避免重复请求。

import React, { useState } from "react";
import axios from "axios";

const cache = new Map(); // 用于存储请求缓存

const fetchData = async (url) => {
  if (cache.has(url)) {
    console.log("从缓存中获取数据");
    return cache.get(url);
  }
  console.log("从接口请求数据");
  const response = await axios.get(url);
  cache.set(url, response.data); // 存入缓存
  return response.data;
};

const App = () => {
  const [data, setData] = useState(null);

  const handleClick = async () => {
    const result = await fetchData("https://jsonplaceholder.typicode.com/posts/1");
    setData(result);
  };

  return (
    <div>
      <button onClick={handleClick}>获取数据</button>
      {data && <pre>{JSON.stringify(data, null, 2)}</pre>}
    </div>
  );
};

export default App;

2、使用abortController取消不再雪要的请求

import React, { useState, useEffect } from "react";
import axios from "axios";

const App = () => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [controller, setController] = useState(null); // 存储 AbortController 实例

  const fetchData = async () => {
    setLoading(true);
    // 创建新的 AbortController 实例
    const newController = new AbortController();
    setController(newController);

    try {
      const response = await axios.get(
        "https://jsonplaceholder.typicode.com/posts/1",
        { signal: newController.signal } // 将 signal 传递给请求
      );
      setData(response.data);
    } catch (error) {
      if (axios.isCancel(error)) {
        console.log("请求已取消", error.message);
      } else {
        console.error("请求失败", error);
      }
    } finally {
      setLoading(false);
    }
  };

  const handleCancel = () => {
    if (controller) {
      controller.abort(); // 取消请求
      console.log("取消请求");
    }
  };

  useEffect(() => {
    return () => {
      // 组件卸载时自动取消请求
      if (controller) {
        controller.abort();
      }
    };
  }, [controller]);

  return (
    <div>
      <button onClick={fetchData} disabled={loading}>
        获取数据
      </button>
      <button onClick={handleCancel} disabled={!loading}>
        取消请求
      </button>
      {loading && <p>加载中...</p>}
      {data && <pre>{JSON.stringify(data, null, 2)}</pre>}
    </div>
  );
};

export default App;

十二、优化CSS和样式

1、使用 CSS-in-]s 库(如 styled-components 或 Emotion)提高样式管 理的灵活性和性能。

2、避免全局样式污染,使用模块化样式。

标签:const,示例,data,项目,React,useState,组件,优化
From: https://blog.csdn.net/weixin_45304926/article/details/145173304

相关文章

  • AI 编程工具—Cursor进阶使用 阅读开源项目
    AI编程工具—Cursor进阶使用阅读开源项目首先我们打开一个最近很火的项目browser-use,直接从github上克隆即可索引整个代码库这里我们使用@Codebase这个选项会索引这个代码库,然后我们再选上这个项目的README.md文件开始提问@Codebase@README.md这个项目是用......
  • Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢
    一、查询优化1、查询优化器(QueryOptimizer)MySQL查询优化器(QueryOptimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗,从而提高查询性能。查询语句不同关键字(where、......
  • 黑狂野大数据3-项目2
    --项目2      --最起码需要有三个功能:1标签圈人,2用户画像3.标签查询 --技术选型 ......
  • G1原理—8.如何优化G1中的YGC
    大纲1.5千QPS的数据报表系统发生性能抖动的优化(停顿时间太小导致新生代上不去)2.由于产生大量大对象导致系统吞吐量降低的优化(大对象太多频繁MixedGC)3.YGC其他相关参数优化之TLAB参数优化4.YGC其他相关参数优化之RSet、PLAB和大对象的处理优化 1.5千QPS的数据报表系统......
  • MySQL优化
    SQL优化原则尽可能消除全表扫描,除非表数据量是在万条一下增加适当的索引能提高查询的速度,但增加索引需要遵循一定的基本规则: a.加在where条件上 b.加在表之间join的键值上 c.如果查询范围是少量字段,可以考虑增加覆盖索引(仅走索引) d.有多个查询条件时,考虑增加复合索引......
  • 一篇文章带你全面了解物联网智能项目!
     成长路上不孤单......
  • springboot 项目配置https
    当你的前端网页添加了https后,那么由于…前端调用后端的接口,同样的也需要配置https。下面以宝塔为例,如何实现,请看下面讲解:1.准备好SSL证书application.yml源文件:spring:redis:host:60.204.232.18port:6379database:3cloud:nacos:......
  • React项目准备
    目录1.创建项目并运行2.文件夹命名规范3.路由配置4.配置@别名路径(1)路径转换(2)VSCode联想提示5.使用git管理项目1.创建项目并运行在命令行输入创建指令:npxcreate-react-appxxx(xxx表示项目名称)进入对应目录,执行:npmi初始化安装包。(遇到报错有可能是包版本问题,去到packa......
  • 接口性能优化技巧
    哪些问题会引起接口性能问题?这个问题的答案非常多,需要根据自己的业务场景具体分析。这里做一个不完全的总结:数据库慢查询深度分页问题未加索引索引失效join过多子查询过多in中的值太多单纯的数据量过大业务逻辑复杂循环调用顺序调用线......
  • (二)C#同一个项目窗体应用程序复制粘贴窗体文件出现各种bug正确解决办法
        事情是这样的,如上图所示,因为一个系统里面有好几个子系统,有些子系统之间的“增删查改”又是相通的,于是想通过复制相同的窗体到另外一个文件夹的时候,如果不正确引用“新项目”将会出现以上各种错误。在网上搜索了各种方式,尝试了各种办法,最后找到下面这种亲测有效的解决......