Name Last Update
..
__tests__ Loading commit data...
README.md Loading commit data...
useCollectOperation.js Loading commit data...
useEventTracking.js Loading commit data...
useFieldDependencies.js Loading commit data...
useFieldValueTransform.js Loading commit data...
useFileOperation.js Loading commit data...
useListItemClick.js Loading commit data...
usePermission.js Loading commit data...
usePermission.test.js Loading commit data...
usePlanSubmit.js Loading commit data...
usePlanView.js Loading commit data...
useSectionList.js Loading commit data...

Composables 目录

本项目使用 Vue 3 Composition API 的 Composables 模式封装可复用逻辑。


📚 快速索引

Composable 功能描述 使用场景
usePermission 权限检查(登录/VIP/认证) 页面权限控制
useFileOperation 文件下载、打开、预览 资料库、文档查看
useSectionList 分组列表管理 设置页面、帮助中心
useCollectOperation 收藏/取消收藏 产品收藏、资料收藏
usePlanSubmit 计划书提交后处理 计划书功能
useEventTracking 事件埋点 用户行为追踪
useListItemClick 列表项点击处理 列表导航
useFieldDependencies 字段依赖管理 表单联动
useFieldValueTransform 字段值转换 表单数据处理
usePlanView 计划书视图管理 计划书查看

详细说明

usePermission.js

功能:统一的权限检查逻辑

核心方法

  • requireLogin(callback, options) - 检查登录权限(最常用)
  • checkPermission(type, callback, options) - 通用权限检查
  • hasPermission(type) - 静默检查权限(不弹窗)
  • isLoggedIn() - 获取登录状态

使用示例

import { usePermission } from '@/composables/usePermission'

const { requireLogin } = usePermission()

// 查看资料需要登录
const viewMaterial = (item) => {
  requireLogin(() => {
    openDocument(item.url)
  }, {
    content: '请先登录后查看完整资料',
    confirmText: '立即登录'
  })
}

useFileOperation.js

功能:文件下载、打开、预览

核心方法

  • viewFile(item) - 入口函数,自动判断文件类型
  • openFile(filePath, item) - 使用 Taro.openDocument 打开文件
  • downloadAndOpenFile(item) - 下载并打开文件

支持的文件类型

  • 图片:jpg, jpeg, png, gif, webp, bmp, svg
  • 视频:mp4, mov 等(跳转播放页面)
  • 文档:pdf(直接预览),Office 文档(提示不支持)

使用示例

import { useFileOperation } from '@/composables/useFileOperation'

const { viewFile } = useFileOperation()

// 打开文件
await viewFile({
  downloadUrl: 'https://example.com/file.pdf',
  fileName: 'document.pdf',
  extension: 'pdf'  // 可选,优先使用此字段判断类型
})

useSectionList.js

功能:分组列表页面管理

核心方法

  • sections - 分组列表数据(shallowRef)
  • handleItemClick(item) - 列表项点击处理

使用示例

import { useSectionList } from '@/composables/useSectionList'

const { sections, handleItemClick } = useSectionList(
  [
    {
      title: '常用功能',
      items: [
        { title: '我的收藏', icon: 'star', subtitle: '查看收藏内容' }
      ]
    }
  ],
  (item, go) => {
    // 自定义导航逻辑
    go('/pages/favorites/index')
  }
)

useCollectOperation.js

功能:收藏/取消收藏(乐观更新)

核心方法

  • toggleCollect(item, successMsg, errorMsg) - 切换收藏状态

特性

  • 乐观更新 UI(先更新界面,后调用 API)
  • 失败自动回滚
  • 发送事件通知其他页面

使用示例

import { useCollectOperation } from '@/composables/useCollectOperation'

const { toggleCollect } = useCollectOperation()

// 切换收藏
await toggleCollect(item, '收藏成功', '已取消收藏')

usePlanSubmit.js

功能:计划书提交后统一处理

核心方法

  • handlePlanSubmit(result, callbacks) - 处理提交结果

特性

  • 自动关闭弹窗
  • 自动清空选中产品
  • 支持导航前后回调

使用示例

import { usePlanSubmit } from '@/composables/usePlanSubmit'

const { handlePlanSubmit } = usePlanSubmit({
  getPopupState: () => showPlanPopup.value,
  setPopupState: (state) => { showPlanPopup.value = state },
  clearSelectedProduct: () => { selectedProduct.value = null }
})

await handlePlanSubmit(result, {
  beforeNav: async () => { console.log('导航前') },
  afterNav: async () => { console.log('导航后') }
})

useEventTracking.js

功能:事件埋点

核心方法

  • trackEvent(type, objectId, extraData) - 追踪事件
  • trackFileRead(fileId, extraData) - 追踪文件阅读

使用示例

import { useEventTracking, EventType } from '@/composables/useEventTracking'

const { trackFileRead } = useEventTracking()

// 追踪文件阅读
await trackFileRead('file-id-123', {
  title: '保险产品手册',
  category: '产品资料'
})

useListItemClick.js

功能:列表项点击处理(带权限检查)

核心方法

  • handleListItemClick(item, config) - 处理列表项点击

使用示例

import { useListItemClick } from '@/composables/useListItemClick'

const { handleListItemClick } = useListItemClick()

// 点击列表项(自动检查登录权限)
handleListItemClick(item, {
  needLogin: true,
  onClick: (item) => {
    console.log('点击了', item)
  }
})

useFieldDependencies.js

功能:表单字段依赖管理

核心方法

  • 当字段 A 变化时,自动更新字段 B

useFieldValueTransform.js

功能:字段值转换

核心方法

  • 将用户输入转换为后端需要的格式

usePlanView.js

功能:计划书视图管理

核心方法

  • 管理计划书的显示状态

🎯 最佳实践

命名规范

// ✅ GOOD - 清晰的命名
usePermission()
useFileOperation()
useSectionList()

// ❌ BAD - 过于通用
useData()
useList()

抽取原则

必须抽取 Composable

  • ✅ 业务逻辑在 ≥ 3 个组件中重复
  • ✅ 相同的状态管理模式重复
  • ✅ 复杂的异步操作模式重复

返回值规范

// ✅ 返回响应式 refs 和函数
return {
  // 响应式状态
  users,      // ref
  loading,    // ref
  // 方法
  fetchUsers,
  refresh     // 别名方法
}

📖 参考文档