vue 3.2 + sv-table(二次封装vxe,使用将 sv 替换为 vxe 即可) 合并功能

<template>
  <div class="app-container">
    <a-form class="table-page-search-wrapper" :model="query" ref="queryRef">
      <a-row :gutter="10">
        <a-col :span="6">
          <a-form-item label="编码" name="code">
            <a-input v-model:value="query.code" placeholder="编码" allowCLear />
          </a-form-item>
        </a-col>
        <a-col :span="6">
          <a-space>
            <a-button type="primary" @click="handelSearch">查询</a-button>
            <a-button @click="handelReset">重置</a-button>
          </a-space>
        </a-col>
      </a-row>
    </a-form>
    <div style="margin: 10px 0">
      <a-button @click="handleAdd" type="primary">新增</a-button>
    </div>
    <sv-table
      :data="list"
      v-loading="loading"
      :height="500"
      :span-method="spanMethod"
    >
      <sv-column
        v-for="(item, index) in tableOptions.columns"
        :key="index"
        :title="item.title"
        :field="item.field"
      ></sv-column>
    </sv-table>
    <s-pagination
      v-show="total > 0"
      :total="total"
      v-model:current="pager.pageNum"
      v-model:pageSize="pager.pageSize"
      @change="getList"
    />
  </div>
</template>
<script setup>
const query = ref({})
const total = ref(0)
const pager = ref({
  pageNum: 1,
  pageSize: 20
})
const list = ref([])
const loading = ref(false)
const addRef = ref()
const tableOptions = ref({})
function handelSearch() {
  getList()
}

function initTable() {
  const columns = [
    {
      title: 'id',
      field: 'id'
    },
    {
      title: '供应商',
      field: 'supplierName'
    },
    {
      title: '商品名称',
      field: 'goodsName'
    },
    {
      title: '商品code',
      field: 'goodsCode'
    },
    {
      title: '项目',
      field: 'project'
    },
    {
      title: '202401',
      field: '202401'
    },
    {
      title: '202402',
      field: '202402'
    },
    {
      title: '202403',
      field: '202403'
    }
  ]
  const mergeField = ['id', 'supplierName', 'goodsName', 'goodsCode']
  const mergeFieldIndex = mergeField.map((field) =>
    columns.findIndex((item) => item.field === field)
  )
  tableOptions.value = {
    columns,
    mergeField,
    mergeFieldIndex
  }
}

function handelReset() {
  query.value = {}
}

function handleDelete(id) {
  console.log(id)
}

function handleAdd() {
  addRef.value.open()
}

function handleEdit() {}

async function getList() {
  loading.value = true
  try {
    const { data, total: totalNum } = await new Promise((resolve, reject) => {
      resolve({
        data: [
          {
            id: 1,
            supplierName: '供应商1',
            goodsName: '商品名称1',
            goodsCode: '商品code',
            projects: [
              {
                title: '成品库存',
                data: {
                  202401: 10,
                  202402: 10,
                  202403: 10
                }
              },
              {
                title: '库存调整数量',
                data: {
                  202401: 10,
                  202402: 10,
                  202403: 10
                }
              }
            ]
          }
        ],
        total: 10
      })
    })
    list.value = handleData(data) // 处理数据
    total.value = totalNum
  } finally {
    loading.value = false
  }
}

function handleData(list) {
  let result = []
  for (let i = 0; i < list.length; i++) {
    const projects = list[i].projects
    for (let k = 0; k < projects.length; k++) {
      const project = projects[k]
      let item = {
        ...list[i],
        project: project.title,
        pid: list[i].id
      }
      Object.entries(project.data).forEach(([key, value]) => {
        item[key] = value
      })
      result.push(item)
    }
  }
  return result
}

const groupedData = computed(() => {
  const map = new Map()
  list.value.forEach((row) => {
    const pid = row.pid
    if (!map.has(pid)) {
      map.set(pid, {
        span: 1
      })
    } else {
      map.get(pid).span++
    }
  })
  return map
})

const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
  const fieldsIndex = tableOptions.value.mergeFieldIndex
  if (fieldsIndex.includes(columnIndex)) {
    const pid = row.pid
    const group = groupedData.value.get(pid)
    if (group) {
      if (rowIndex === list.value.findIndex((r) => r.pid === pid)) {
        return {
          rowspan: group.span,
          colspan: 1
        }
      } else {
        return {
          rowspan: 0,
          colspan: 0
        }
      }
    }
  }
  return {}
}

initTable() // 初始化table
</script>

<style scoped lang="scss"></style>

在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3中使用vxe-table和TypeScript进行国际化的步骤如下: 1. 首先,安装vxe-tablevue-i18n依赖: ```shell npm install vxe-table vue-i18n ``` 2. 在Vue的入口文件(通常是main.ts)中,引入vxe-tablevue-i18n,并进行相关配置: ```typescript import { createApp } from 'vue'; import App from './App.vue'; import XEUtils from 'xe-utils'; import VXETable from 'vxe-table'; import 'vxe-table/lib/style.css'; import { createI18n } from 'vue-i18n'; // 导入vxe-table的国际化语言包 import zhCN from 'vxe-table/lib/locale/lang/zh-CN'; import enUS from 'vxe-table/lib/locale/lang/en-US'; // 创建vue-i18n实例 const i18n = createI18n({ locale: 'zh-CN', // 设置默认语言 messages: { 'zh-CN': zhCN, 'en-US': enUS } }); // 使用vxe-table const app = createApp(App); app.use(VXETable); app.use(i18n); app.mount('#app'); ``` 3. 在组件中使用vxe-table的国际化功能,可以通过`$t`方法来获取对应的翻译文本: ```html <template> <div> <vxe-table :data="tableData"> <vxe-table-column type="index" title="序号"></vxe-table-column> <vxe-table-column field="name" title="姓名"></vxe-table-column> <vxe-table-column field="age" title="年龄"></vxe-table-column> </vxe-table> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 } ] }; } }; </script> ``` 4. 在组件中使用vue-i18n的国际化功能,可以通过`$t`方法来获取对应的翻译文本: ```html <template> <div> <p>{{ $t('message.greeting') }}</p> </div> </template> <script> export default { mounted() { console.log(this.$t('message.greeting')); } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web_Hsir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值