vue解构平铺VS对象包裹

vue解构平铺VS对象包裹

composable(useXxx):函数内部存在 ref/reactive Vue 响应式 API,返回一个对象,把所有状态和方法打包进去,方便统一接收。

解构平铺

复制代码
export function useTableSearch(initQuery, apiFun) {
  const queryParams = reactive({ ...initQuery })
  const tableData = ref([])
  const total = ref(0)

  const getList = async () => {
    const res = await apiFun(queryParams)
    tableData.value = res.data.records
    total.value = res.data.total
  }

  const resetQuery = () => {
    Object.assign(queryParams, initQuery)
    queryParams.pageNum = 1
    getList()
  }

  return {
    queryParams,
    tableData,
    total,
    getList,
    resetQuery
  }
}

组件使用:

复制代码
const { queryParams, tableData, total, getList, resetQuery } = useTableSearch({}, getListApi)

对象包裹

复制代码
import { reactive, ref } from 'vue'

export function useTableSearch(initQuery, apiFun) {
  const queryParams = reactive({ ...initQuery })
  const tableData = ref([])
  const total = ref(0)

  const getList = async () => {
    const res = await apiFun(queryParams)
    tableData.value = res.data.records
    total.value = res.data.total
  }

  const resetQuery = () => {
    Object.assign(queryParams, initQuery)
    queryParams.pageNum = 1
    getList()
  }

  // ✅ 全部打包到 table 对象里面返回
  const table = {
    queryParams,
    tableData,
    total,
    getList,
    resetQuery
  }

  return { table }
}

组件调用方式

复制代码
const { table } = useTableSearch({}, getListApi)

// 使用
table.queryParams.pageNum = 1
table.getList()
table.resetQuery()

为什么 composable 适合对象包裹,而 helper/utils 是另一种形态

  1. composables/useXxx.js (useTableSearch)
    内部有 ref/reactive,返回一个包裹对象 。
    好处:
  • 导入简单:只解构拿到 table,不用一堆变量
  • 溯源:table.getList(),一眼知道是表格相关方法
  • 多个 composable 共存时不会变量命名冲突(页面同时有 userTable、deptTable)
  1. helper/xxxHelper.js
    直接export default导出对象,toastHelper.showSuccess()
  2. utils/xxxUtil.js
    直接export default导出对象,treeUtil.arrayToTree()

三层规范汇总:

  • composable:export function useXxx(){ return { xxx } }
  • helper:const xxxHelper = {}; export default xxxHelper
  • utils:const xxxUtil = {}; export default xxxUtil

补充优化(加上 try catch 和组件卸载标记,和你之前 useTableQuery 保持一致)

复制代码
import { reactive, ref, onUnmounted } from 'vue'

export function useTableSearch(initQuery, apiFun) {
  const queryParams = reactive({ ...initQuery })
  const tableData = ref([])
  const total = ref(0)
  let isUnmount = false

  const getList = async () => {
    try {
      const res = await apiFun(queryParams)
      if (isUnmount) return
      tableData.value = res.data.records
      total.value = res.data.total
    } catch (err) {
      console.error('查询表格失败:', err)
    }
  }

  const resetQuery = () => {
    Object.assign(queryParams, initQuery)
    queryParams.pageNum = 1
    getList()
  }

  onUnmounted(() => {
    isUnmount = true
  })

  const table = {
    queryParams,
    tableData,
    total,
    getList,
    resetQuery
  }

  return { table }
}

重点区分:

✅ composable 是函数执行后返回包裹对象

✅ helper/utils 是直接导出静态对象

相关推荐
小poop41 分钟前
CSS 基础与实战:从入门到精通网页美化
前端
Csvn2 小时前
运行时性能
前端
Never_every993 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck3 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖4 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
欣欣之王来了5 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒5 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师6 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端
paopaokaka_luck6 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
特立独行的猫A6 小时前
10 MB 的桌面 AI 客户端:用仓颉 + 系统 WebView 替代 Electron
前端·harmonyos