性能优化之—react可视化视图页面卡顿

背景描述: 项目中有3D地图、3D饼图、平面饼图、柱状图、滚动列表...元素比较多的页面,需要注重性能问题

页面存在的问题:3D地图有点和飞线,加载3D地图时会影响到了其他元素的加载

一、通过控制台Performance监控页面性能

二、检查页面渲染次数,console.count(),减少数据更新或者整合数据。

1、当前为react17版本,promise中不会对state进行批处理,所以同一个请求可以把数据同时放在同一个useState中,不需要存储在多个useState中避免多次渲染

(在v18之前 只在事件处理函数中实现了批处理(将多次useState事件合并),在v18中所有更新都将自动批处理,包括promise链、setTimeout等异步代码以及原生事件处理函数)

js 复制代码
  // 把下面的useState:
  const [flyLineData, setFlyLineData] = useState([]);
  const [pointData, setPointData] = useState([]);
  
  // 更改为:
  const [mapData, setMapData] = useState({});
  const { flyLineData = [], pointData = [] } = mapData

三、检查性能差的代码块和数据,可通过useMemo和memo来优化组件性能

1、检查地图数据时发现存在很多重复的飞线数据导致页面卡顿,对数据进行过滤或者后端处理接口数据

2、3D地图的加载和更新,使用useMemo优化代码块,依赖改变后才会重新执行该代码块:

注意:如果把React.useMemo钩子写在renderNationMap方法中,当renderNationMap销毁的时候会报错 Uncaught Error: Rendered fewer hooks than expected. This may be caused by an accidental early return statement.

js 复制代码
  // center.js中的代码块
  const renderContent = React.useMemo(() => {
    if (areaKey) {
      return renderAreaMap()
    } else if (mapKey === 'nation') {
      return renderNationMap()
    } else {
      return renderCityMap()
    }
  }, [JSON.stringify(mapData), areaKey, mapKey])

3、此外还可以使用React.lazy,配合Suspense,对组件进行懒加载。Suspense是React 中的一个组件,能够将其包裹的异步组件挂起,直到组件加载完成后再渲染

js 复制代码
import React, { Suspense, useState } from 'react';
const LazyCenter = React.lazy(() => import('./center.js'));

export default () => (
  <Suspense fallback={<div />}>
    <LazyCenter hdywl={hdywl} dtjcs={dtjcs} />
  </Suspense>
)
相关推荐
Jmyd01233 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
半个落月3 小时前
LangChain Agent 中间件实战(上):生命周期、状态、短路与工具包
javascript·langchain
砚凝霜3 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
半个落月3 小时前
LangChain Agent 中间件实战(下):DeepAgents文件权限、长期记忆与对话摘要
javascript·langchain
u0111026755 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
jerrywus5 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
派小心.6 小时前
小程序分享链路中来源参数的传递校验
大数据·前端·数据库·人工智能·小程序·数据分析
hhb_6186 小时前
一键生成数据看板,ECharts实战演示
前端·javascript·echarts
Java后端的Ai之路6 小时前
08_React组件API
前端·react.js·前端框架
小马不起床6 小时前
零基础玩转 FastAPI_09:前端基础工程构建
前端·状态模式·fastapi