子组件在父组件循环调用,子组件的数据是固定的,想做优化,这样做对吗?

作者站长头像
站长
· 阅读数 12

问题1 子组件是个select ,数据都是从api获取,每次都是固定的内容。父组件中的列表需要大量调用这个子组件,每次这个组件都需要调用api获取数据,每次数据都是一样,这个地方是不是需要优化?

问题2 如果需要优化的话,从react官网找了一下,简单做了更改,理论上每次excuteCallBack 是同一个引用,但是debug的时候 useEffect每次被调用没法证明excuteCallBack 是不是同一个引用呢?

理解不足,希望解答一下。

import React, { useCallback, useEffect, useState } from "react";
import { Team, User } from "@/type/user";
import { Select } from "antd";
import { getTeams } from "@/api";
const { Option } = Select;

interface Props {
  record: User;
}

const CusSelect: React.FC<Props> = ({ record }) => {
  const [teams, setTeams] = useState<Array<Team>>();

 const excuteCallBack = useCallback(
   () => {
    return getTeams()
   },
   []
 )
 

  useEffect(() => {
    console.log('excuteCallBack reference:',new Date(), excuteCallBack);
    async function excute() {
      try {
        let rest = await excuteCallBack();
        //debugger
        setTeams(rest.data);
      } catch (error) {
        console.log(error);
      }
    }
    excute();
  }, [excuteCallBack]);

  return (
    <Select
      className="w-4/5"
      defaultValue={record.team_name}
      disabled={record.role_name != "コーチ"}
      onChange={(value) => {
        alert(JSON.stringify(record) + value);
      }}
    >
      {teams?.map((item) => (
        <Option value={item.team_id} key={item.team_id}>
          {item.team_name}
        </Option>
      ))}
    </Select>
  );
};

export default CusSelect;
回复
1个回答
avatar
test
2024-06-20

先说问题1,确实可以优化一下,直接不发起请求,做个 fetch 的 cache 就完事了

第二个问题不太懂,但是我理解你做个节流触发 action,数据统一存在 store 就行

你这种缓存组件的操作应该都不大行。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容