vue3 hooks el-table封装 (未使用ts版本)

 基于elementuiPlus el-table 表格

import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
/**
 * @FileDescription: el-table 函数式组件hooks,
 * @function:useTable(config)
 * @param {object} config useTable(配置项)
 * @param {function} config.loadDataFunc 分页列表接口函数
 * @param {object} config.queryForm 表单配置
 * @param {function} config.deleteDataFunc 删除接口函数
 * @param {object} config.options 内部函数配置项(分页 | 接口配置)
 * @param {boolean} config.options.immediate 是否默认执行
 * @param {object} config.options.pageSizeConfig 分页字段配置
 * @param {string} config.options.pageSizeConfig.table_page 页数
 * @param {string} config.options.pageSizeConfig.table_size 页码
 * @param {string} config.options.pageSizeConfig.table_pageNum 默认页数
 * @param {string} config.options.pageSizeConfig.table_sizeNum 默认页码
 * @param {object} config.options.apiConfig 列表接口返回值配置
 * @param {string} config.options.apiConfig.dataProp 返回值字段名
 * @param {string} config.options.apiConfig.total 返回值总数字段名
 * @returns {array} 【tableData-- 表格值】;
 * @returns {array} 【multipleSelection -- 表格多选数组】;
 * @returns {boolean} 【lodding -- 列表接口加载状态】;
 * @returns {object} 【pagination -- 分页数据】;
 * @returns {number} 【total -- 分页总数】;
 * @returns {function} 【getData -- 分页接口调用函数】;
 * @returns {function} 【handleSearch -- 搜索函数】;
 * @returns {function} 【handleExport -- 导出-暂未测试】;
 * @returns {function} 【handleSelectionChange -- 多选触发函数】;
 * @returns {function} 【handleDelete -- ({id:{array | string},y_delece_type:{string},prop:{string}}) 删除函数(id:删除的id,有传id的情况下为单选。没传id为默认表格复选数组,y_delece_type:接口接收类型为字符或者数组,prop:匹配字段名) - 支持多选与单选】;
 * @example
 const {
  tableData,
  loading,
  pagination,
  total,
  getData,
  handleSearch,
  handleExport,
  handleDelete,
  handleSelectionChange,
  multipleSelection
} = useTable({loadDataFunc:pageList, queryForm:queryParams, deleteDataFunc:{},options:{apiConfig:{
  dataProp:'rows',totalProp:'total'
},pageSizeConfig:{
 table_page:'page',
 table_sizeNum:20
}}})
 * @Date:2024:07:04 18:16:00
 * @LastEditTime:2024:07:08 23:47:00
 * @Author: Lanky
 * */
export function useTable(config) {
    const {loadDataFunc,queryForm,deleteDataFunc,options = {
        immediate:true
    }} = config
    const {
        pageSizeConfig={},
        apiConfig = {}
    } = options
    let {table_page = 'pageNum',table_pageNum = 1,table_size = 'pageSize',table_sizeNum=10} = pageSizeConfig
    let {dataProp='list',totalProp = 'total'} = apiConfig
    let loading = ref(true)
    let tableData = ref()
    let total = ref(0)
    const pagination = reactive({
        [table_page]: table_pageNum,
        [table_size]: table_sizeNum
    })
    const getData = async () => {
        loading.value = true
        const res = await loadDataFunc({ ...queryForm, ...pagination })
        tableData.value = res.list || res[dataProp] || res.data && res.data[dataProp] || res.rows && res.rows[dataProp] || []
        total.value = res.total || res[totalProp] || 0
        loading.value = false
    }

    onMounted(() => {
        if (options?.immediate === undefined || options?.immediate === true) getData()
    })

    // 搜索
    const handleSearch = () => {
        table_page = 1
        getData()
    }

    // 切换页码
    const handlePageChange = (val) => {
        const {page,size} = val
        table_page = page
        table_size = size
        getData()
    }

    let multipleSelection = ref([])
    const handleSelectionChange = (val) => {
        multipleSelection.value = val
    }

    // 单个删除、批量删除
    const handleDelete = ({id,y_delece_type = 'string',prop='id'}) => {
        let ids = [] || null
        let arr = multipleSelection.value.map(i => i[prop])
        if (id !== undefined) {
            y_delece_type === 'string' ? ids = ids : ids = [id]
        } else {
            y_delece_type === 'string' ? ids = arr.join(',') : ids = arr
        }
        if (!ids || ids.length === 0) {
            ElMessage.warning('请选择需要删除的数据!')
            return
        }
        ElMessageBox.confirm('确定删除?此操作不可恢复。', '提示', {
            type: 'warning'
        })
            .then(async () => {
                await deleteDataFunc(ids)

                ElMessage.success('删除成功')
                getData()
            })
            .catch((err) => {
                return err
            })
    }

    // 导出表格数据
    const handleExport = () => {
        ElMessageBox.confirm('确定导出所选数据?', '提示')
            .then(() => {
                ElNotification({
                    title: '数据导出',
                    message: '正在为您导出数据,请稍后',
                    position: 'bottom-right'
                })
            })
            .catch((err) => { return err })
    }

    return {
        loading,
        tableData,
        total,
        pagination,
        multipleSelection,
        getData,
        handleSearch,
        handleExport,
        handleSelectionChange,
        handlePageChange,
        handleDelete
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3封装el-table可以通过以下步骤进行: 1. 首先,我们需要创建一个自定义组件,可以命名为MyTable。 2. 在MyTable组件,我们需要导入el-tableel-table-column组件,可以使用import语句进行导入。 3. 在template标签,我们可以使用el-table来渲染表格。可以设置属性如:data、border、stripe等。 4. 在el-table标签内部,我们可以使用el-table-column来定义表格的列。可以设置属性如:prop(对应数据源)、label(列名)、width(列宽)等。 5. 在script标签,我们需要定义MyTable组件的props,用于接收父组件传递的数据。 6. 在script标签,我们可以定义一些方法或者计算属性,用于处理表格的点击事件、排序、筛选等。 7. 最后,我们需要在父组件使用MyTable组件,并传递数据和配置选项给MyTable组件的props,来渲染自定义的表格。 总结一下,Vue3封装el-table的关键步骤包括创建自定义组件、导入el-tableel-table-column组件、在MyTable组件使用el-tableel-table-column来渲染表格、定义props、定义方法和计算属性以及在父组件使用MyTable组件。通过封装el-table,我们可以更好地复用和管理表格组件,并实现更灵活的表格功能。 ### 回答2: Vue3是一个用于构建用户界面的渐进式JavaScript框架。它具有轻量级、高效、易用的特点,并且在Vue3可以灵活地封装el-table。 首先,为了封装el-table,我们可以创建一个自定义组件,命名为TableWrapper。在TableWrapper组件的模板使用el-table,并将el-table的相关属性、事件和插槽通过props进行传递和接收。 在TableWrapper组件的props,我们可以定义例如data、columns、pagination等与el-table相关的属性。这样,我们就可以通过在使用TableWrapper组件时传递这些属性来配置el-table的行为。 另外,我们还可以在TableWrapper组件定义一些需要自定义的功能,例如表格的样式、表头的固定、排序功能等。这些功能可以通过在TableWrapper组件添加相关的方法和事件来实现。 除了属性和方法外,我们还可以使用插槽在TableWrapper组件自定义表格的各个部分,例如表头、表尾、表格内容等。通过在TableWrapper组件的模板使用<slot>元素,并在使用TableWrapper组件时传递相应的内容,可以方便地自定义el-table的外观和布局。 总之,通过将el-table封装到自定义组件TableWrapper,我们可以更好地控制和定制el-table的行为和外观。这样,我们就能够根据实际需要快速构建出符合需求的数据表格。 ### 回答3: Vue3封装el-table的步骤如下: 1. 首先,创建一个名为el-table-wrapper的组件,该组件用于封装el-table。 2. 在el-table-wrapper组件,引入el-table组件,并在模板使用el-table进行数据展示。 3. 在el-table-wrapper组件,接收名为data的props属性,用于传递表格数据。 4. 在el-table-wrapper组件,通过v-for指令遍历data数据,并使用el-table-column组件进行表格列的定义。 5. 在el-table-wrapper组件使用slot插槽来支持自定义表格内容,例如添加操作按钮等。 6. 在el-table-wrapper组件,可以设置一些其他属性,如border、stripe等,以适应不同的需求。 7. 在el-table-wrapper组件,可以使用事件监听器来捕获el-table的一些事件,例如选择行、排序等。 8. 在el-table-wrapper组件,通过emit方法触发自定义事件,以便在父组件处理表格的交互逻辑。 总结:在Vue3封装el-table,需要通过创建一个包装组件,在其引入el-table组件并定义相应的列和属性,同时支持自定义内容和事件。这样可以提高代码的复用性和可维护性,方便在不同的项目使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值