vue3实战技巧 - 封装筛选、表格和请求逻辑

文章展示了如何使用Vue的CompositionAPI来封装一个表格组件,包括数据请求和筛选功能。FilterExample01组件利用useList函数获取数据,并结合tableMeta定义表格结构。Table组件接受tableMeta和data作为props,渲染表格头和主体,而THead和TBody分别处理表头和数据行的展示。

目录

封装表格筛选组件的请求部分

\src\examples\table.module.scss

\src\examples\FilterExample.tsx


封装表格筛选组件的请求部分

  • 目标:封装composition API为表格筛选、请求提供能力
  • Coding

\src\examples\table.module.scss

.table {
  border-collapse: collapse;
  tr {
    td {
      border : 1px solid #717174;
      padding : 5px 10px;
    }
  }
}

\src\examples\FilterExample.tsx

import { defineComponent, ref } from "vue";
import classes from "./table.module.scss";
type TableMeta = {
  title: string,
  key: string
}
function request() {
  return Promise.resolve([
    { name: "杨木", score: 97 },
    { name: "韩土", score: 98 },
    { name: "张水", score: 92 },
    { name: "王金", score: 68 },
    { name: "王火", score: 58 }
  ])
}
function useList() {
  const data = ref<any>(null)
  request().then(res => {
    data.value = res
  })
  return data
}
export const FilterExample01 = defineComponent({
  setup() {
    // table描述
    const tableMeta: TableMeta[] = [{
      title: "姓名",
      key: "name"
    }, {
      title: "分数",
      key: "score"
    }]
    const data = useList()
    return () => {
      return <div>
        <Table tableMeta={tableMeta} data={data.value} />
      </div>
    }
  }
})
type TableProps = {
  tableMeta: TableMeta[],
  data: Array<Record<string, any>>
}
const Table = ({
  tableMeta,
  data
}: TableProps) => {
  return (
    <table class={classes.table}>
      <THead tableMeta={tableMeta} />
      <TBody tableMeta={tableMeta} data={data} />
    </table>
  )
}
// Omit<TableProps, "data"> 从TableProps类型中去掉"data"
const THead = ({ tableMeta }: Omit<TableProps, "data">) => {
  return <tr>
    {tableMeta.map(item => {
      return <td key={item.key}>{item.title}</td>
    })}
  </tr>
}
const TBody = ({ tableMeta, data }: TableProps) => {
  return <>
    {data && data.map((item, i) => {
      return <tr key={i}>
        {tableMeta.map(meta => {
          return <td key={meta.key}>{item[meta.key]}</td>
        })}
      </tr>
    })}
  </>
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值