我正在寻找一个解决方案,这样我可以把getFavList个函数在服务文件中.但是,因为涉及到setAllData.我真的不能对如何做到这一点心中有数.以下是原始代码.

Index.tsx

export default function FavoriteList() {
  const [allData, setAllData] = useState<Data[]>([])
  const [hasUpdated, setHasUpdated] = useState<Boolean>(true)

  const getFavList = async () => {
    await axios.get(`${API}/api/favCharityList`)
      .then((res => {
        let arr = []
        arr = [...res.data.charities]
        setAllData(arr)
      }))
      .catch(err => console.error(`Error: ${err}`))
  }

  useEffect(() => {
    getFavList();
  }, [hasUpdated])

  return (
    <></>
  )
}

我试着把它放在一个单独的文件里.但是,第setAllData行返回错误. 错误讯息

Argument of type 'any[]' is not assignable to parameter of type 'SetStateAction<[]>'.
  Type 'any[]' is not assignable to type '(prevState: []) => []'.
    Type 'any[]' provides no match for the signature '(prevState: []): []'.

new Index.tsx

export default function FavoriteList() {
  const [allData, setAllData] = useState<Data[]>([])
  const [hasUpdated, setHasUpdated] = useState<Boolean>(true)

  const getFavList = async () => {
    await axios.get(`${API}/api/favCharityList`)
      .then((res => {
        let arr = []
        arr = [...res.data.charities]
        setAllData(arr)
      }))
      .catch(err => console.error(`Error: ${err}`))
  }

  useEffect(() => {
    getFavList({ API, setAllData });
  }, [hasUpdated])

  return (
    <></>
  )
}

服务

interface AxiosArg {
  API: string
  setAllData: Dispatch<SetStateAction<[]>>
}

const getFavList = async ({ API, setAllData }: AxiosArg) => {
  await axios.get(`${API}/api/favCharityList`)
    .then((res => {
      let arr = []
      arr = [...res.data.charities]
      setAllData(arr)
    }))
    .catch(err => console.error(`Error: ${err}`))
}

export { getFavList }

推荐答案

不是关闭specific状态更新器函数,而是将getFavList函数重构为简单地101获取的数据,并让调用代码处理它需要对该数据做什么.

这是一种将async/await与promise 链混合在一起的普遍反模式.在大多数情况下, Select 其中之一.

示例重构:

const getFavList = async () => {
  try {
    const { data } = await axios.get(`${API}/api/favCharityList`);
    return data.charities as Data[];
  } catch {
    return [] as Data[];
  }
}

用途:

import { getFavList } from '../service';

export default function FavoriteList() {
  const [allData, setAllData] = useState<Data[]>([]);
  const [hasUpdated, setHasUpdated] = useState<Boolean>(true);

  useEffect(() => {
    getFavList().then((data) => {
      setAllData(data);
    });
  }, [hasUpdated]);

  return (
    <>....</>
  )
}

Typescript相关问答推荐

创建一个将任意命名类型映射到其他类型的TypScript通用类型

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

无法将select选项的值设置为ngFor循环中的第一个元素

使Typescribe强制所有对象具有相同的 struct ,从两个选项

键集分页顺序/时间戳上的筛选器,精度不相同

泛型函数中输入参数类型的推断问题

使某些(嵌套)属性成为可选属性

如何使用泛型自动推断TS中的类型

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

如何使我的函数专门针对联合标记?

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

对象类型的TypeScrip隐式索引签名

如何在使用条件类型时使用void

如何使用泛型函数参数定义类型脚本函数

打字错误TS2305:模块常量没有导出的成员

具有匹配功能的TS通用事件处理程序

TS不能自己推断函数返回类型

Typescript泛型-键入对象时保持推理

将对象数组传递给 Typescript 中的导入函数

const nav: typechecking = useNavigation() 和 const nav = useNavigation() 之间有什么区别?