antd-pro项目之优化

2026-05-02 20:31:44 201
分类:react

问题一:数据多次渲染问题

问题描述:当页面中加了loading状态的时候,页面会 render 4次:

第一次loading为false,数据为空;
第二次loading为true,数据为空;
第三次loading为true,数据不为空;
第四次loading为false,数据不为空;

第三次和第四次数据已经存在,开始正常渲染页面,但是执行了两次,如何让页面只在第四次数据加载完了之后才开始渲染呢?

解决方案一:

通过dispatch().then()在接口请求完成后回调执行数据赋值,这样jsonData只在最后一次才不为空,但是这样就放弃了数据流的模式。大数据页面都是以数据流的方式驱动,这种方式要每次去setData比较麻烦,不推荐。

const [jsonData, setJsonData] = useState({});
dispatch({
  type: 'importantCustProtect/getJsonData',
  method: 'imptCustList',
  payload: {
    intfcType: "",
    intfcTypeName: ""
  }
}).then(function (result) {
  let response = result.payload;

  if (response.status === '0') {
    setJsonData(response.result);
  }
})

解决方案二:

使用useMemo或useCallback解决重复渲染问题

当你调用 useEffect 时,就是在告诉 React 在完成对 DOM 的更改后运行你的“副作用”函数。我们的目标是在DOM发生变化时,不相关的函数不需要触发,而effect只能在DOM更新后再触发。

使用 useMemo 的函数会在渲染期间执行,在DOM改变的时候,useMemo 能控制某些函数不被触发。

let html = useMemo(() => {
  let jsonData = props.imptCustList;

  return <div>
      ...
  </div>
}, [props.imptCustList]);

这样只有在数据改变的时候才会触发,而loading状态改变不会触发。

问题二:通过接口请求的数据一定会强制重新渲染页面

问题描述:页面访问后,请求的数据一直保留在store中,当切换页面返回后,该页面store里面已有数据会执行一次渲染,当页面再次请求后同样的数据还是会再次渲染。

采用memo(与PureComponent功能相同)、useMemo或useCallback都无法解决。

纯组件在每次更新会自动帮你对更新前后的props和state进行一个简单对比,来决定是否进行更新,采用的是“浅比较”,仍可能出现没有必要的重新渲染。