Skip to content

Loading

加载指示器组件,支持动态创建、状态更新、成功/失败提示。

API

tsx
// 显示 Loading
const instance = await showLoading(message?: string): Promise<LoadingInstance>

// 隐藏 Loading
await hideLoading(): Promise<void>

// 显示成功提示
await showSuccess(message?: string, duration?: number): Promise<void>

// 显示失败提示
await showError(message?: string, duration?: number): Promise<void>

// 配置
setLoadingConfig(config: LoadingConfig): void

// Hook
const loading = useLoading()

LoadingInstance

tsx
interface LoadingInstance {
  setMessage(message: string): void  // 更新消息
  success(message?: string): void    // 显示成功并关闭
  error(message?: string): void      // 显示失败并关闭
  hide(): void                       // 立即关闭
}

示例

基础用法

tsx
import { showLoading, hideLoading } from '@0x30/navigation-vue'

async function fetchData() {
  await showLoading('加载中...')
  try {
    await api.getData()
  } finally {
    await hideLoading()
  }
}
tsx
import { showLoading, hideLoading } from '@0x30/navigation-react'

async function fetchData() {
  await showLoading('加载中...')
  try {
    await api.getData()
  } finally {
    await hideLoading()
  }
}

状态更新

tsx
import { showLoading } from '@0x30/navigation-vue'

async function submitForm() {
  const loading = await showLoading('提交中...')
  
  try {
    await api.validate()
    loading.setMessage('处理中...')
    
    await api.submit()
    loading.setMessage('即将完成...')
    
    await api.finalize()
    loading.success('提交成功!')
  } catch (e) {
    loading.error('提交失败')
  }
}
tsx
import { showLoading } from '@0x30/navigation-react'

async function submitForm() {
  const loading = await showLoading('提交中...')
  
  try {
    await api.validate()
    loading.setMessage('处理中...')
    
    await api.submit()
    loading.setMessage('即将完成...')
    
    await api.finalize()
    loading.success('提交成功!')
  } catch (e) {
    loading.error('提交失败')
  }
}

使用 Hook

tsx
import { defineComponent } from 'vue'
import { useLoading } from '@0x30/navigation-vue'

export default defineComponent({
  setup() {
    const loading = useLoading()
    
    const handleClick = async () => {
      await loading.show('加载中...')
      await someAsyncTask()
      await loading.hide()
    }
    
    return () => <button onClick={handleClick}>加载</button>
  }
})
tsx
import { useLoading } from '@0x30/navigation-react'

function MyComponent() {
  const loading = useLoading()
  
  const handleClick = async () => {
    await loading.show('加载中...')
    await someAsyncTask()
    await loading.hide()
  }
  
  return <button onClick={handleClick}>加载</button>
}

配置

tsx
import { setLoadingConfig } from '@0x30/navigation-vue'

setLoadingConfig({
  loadingImg: '/icons/loading.gif',  // 自定义加载图标
  successImg: '/icons/success.png',  // 自定义成功图标
  errorImg: '/icons/error.png',      // 自定义失败图标
  closeTimeout: 1500,                // 成功/失败后自动关闭时间 (ms)
})
tsx
import { setLoadingConfig } from '@0x30/navigation-react'

setLoadingConfig({
  loadingImg: '/icons/loading.gif',  // 自定义加载图标
  successImg: '/icons/success.png',  // 自定义成功图标
  errorImg: '/icons/error.png',      // 自定义失败图标
  closeTimeout: 1500,                // 成功/失败后自动关闭时间 (ms)
})

### LoadingConfig

| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `loadingImg` | `string` | - | 自定义加载图标 URL |
| `successImg` | `string` | - | 自定义成功图标 URL |
| `errorImg` | `string` | - | 自定义失败图标 URL |
| `closeTimeout` | `number` | `1500` | 成功/失败后自动关闭延时 |

## 特性

### 阻止返回

Loading 显示期间会自动阻止用户返回:

```tsx
await showLoading('处理中...')
// 此时用户无法:
// - 调用 back() 返回
// - 使用手势返回
// - 点击浏览器后退
await hideLoading()

无需容器

不需要在根组件添加任何容器,Loading 会自动创建 DOM。

内置动画

Loading 自带淡入淡出和缩放动画。

Released under the MIT License.