【发布时间】:2021-06-05 04:41:56
【问题描述】:
我想进行基于当前状态的 API 调用,但无法使 setState 函数作为异步函数工作。
handlePage = (direction: number) => {
this.setState( async (state) => {
const tickets: Ticket[] = await api.getTickets(`?page=${state.pageNum + direction}`)
const pageNum: number = state.pageNum + direction;
return { pageNum, tickets };
});
}
告诉我错误:
类型参数 '(state: Readonly) => Promise' 不可分配给“AppState |”类型的参数((prevState: Readonly, props: Readonly) => AppState | Pick
| null) |选择<...> |空值'。 输入 '(state: Readonly) => Promise' 不可分配给类型 '(prevState: Readonly, props: Readonly) => AppState | Pick |空值'。 键入 'Promise' 不可分配给类型 'AppState | Pick |空值'。 键入 'Promise' 缺少类型 'Pick ': 搜索、主题、pageNumts(2345)
如果我在 setState 方法之外获取数据,它会起作用,但我害怕对过时的页码进行 API 调用:
handlePage = async (direction: number) => {
const tickets: Ticket[] = await api.getTickets(`?page=${this.state.pageNum + direction}`)
this.setState( (state) => {
const pageNum: number = state.pageNum + direction;
return { pageNum, tickets };
});
}
【问题讨论】:
-
通过声明 React 状态更新函数
async它隐式返回一个 Promise 并且这似乎与您声明的状态类型声明不兼容。 “过时的页码”是什么意思?this.state.pageNum将是调用handlePage时当前渲染周期的值。 -
似乎 OP 提出了一个XY Problem
-
如果
this.state.pageNum没有用于渲染 UI 的任何部分而仅用于 API 调用,您可以使用useRef挂钩将其存储为 ref。 -
outdated page number??是什么意思 -
outdated page number我的意思是如果我不使用以前的状态设置状态,多次快速点击可能无法更新状态,如react documentation中所述
标签: reactjs typescript async-await