可刷新列表

将可滚动视图标记为 可刷新,允许用户下拉以触发异步的数据刷新操作。

类型

1refreshable?: () => Promise<void>

概述

在如 <List> 这样的可滚动视图上使用 refreshable 修饰符,可以启用下拉刷新的交互行为。当用户在页面顶部下拉时,框架会调用你提供的异步处理函数。

在处理函数中,你可以执行异步操作(例如请求网络数据或更新本地状态),当该函数返回后,刷新指示器将自动隐藏。

此行为与 SwiftUI 的 refreshable 非常相似。


使用示例

1<List
2  navigationTitle="可刷新列表"
3  navigationBarTitleDisplayMode="inline"
4  refreshable={refresh}
5/>

完整示例

1function Example() {
2  const [data, setData] = useState(generateRandomList)
3
4  function generateRandomList() {
5    const data: number[] = []
6    const count = Math.ceil(Math.random() * 100 + 10)
7
8    for (let i = 0; i < count; i++) {
9      const num = Math.ceil(Math.random() * 1000)
10      data.push(num)
11    }
12
13    return data
14  }
15
16  async function refresh() {
17    return new Promise<void>(resolve => {
18      setTimeout(() => {
19        setData(generateRandomList())
20        resolve()
21      }, 2000) // 模拟2秒刷新
22    })
23  }
24
25  return <NavigationStack>
26    <List
27      navigationTitle="可刷新列表"
28      navigationBarTitleDisplayMode="inline"
29      refreshable={refresh}
30    >
31      <Section header={<Text textCase={null}>下拉即可刷新</Text>}>
32        {data.map(item =>
33          <Text>数字:{item}</Text>
34        )}
35      </Section>
36    </List>
37  </NavigationStack>
38}

行为说明

  • refreshable 必须返回一个 Promise<void>。只有在该 promise 被解析(resolve)后,刷新指示器才会消失。

  • 在处理函数内部可以使用 await 进行异步操作:

    1refreshable={async () => {
    2  const result = await fetchData()
    3  setData(result)
    4}}
  • 此修饰符 仅适用于可滚动容器(如 <List>)。

  • 在刷新逻辑中应更新相关状态,以反映新的数据。

  • 避免长时间运行或无反馈的任务,必须确保 promise 能被及时解析以防止界面卡住。


使用建议

  • 保持刷新逻辑简洁高效。

  • 始终在逻辑结束后调用 resolve

  • 开发时可使用延迟模拟加载动画:

    1await new Promise(resolve => setTimeout(resolve, 1000))