"重要" vue3.2二次封裝antd vue 中的Table組件(基礎(chǔ)封裝)

主要是針對(duì)vue3.2中的<script setup>語法

這次這個(gè)項(xiàng)目使用的是一個(gè) vue3.2+vite+antd vue

因?yàn)檫@個(gè)項(xiàng)目中多處使用到表格組件,所以進(jìn)行了一個(gè)基礎(chǔ)的封裝,主要是通過antd vue 中表格的slots配置項(xiàng),通過配合插槽來進(jìn)行封裝自定義表格;

子組件的代碼

<template>
  <!-- 表格組件 -->
  <a-table
    :dataSource="dataSource"
    :columns="columns"
    class="ant-table-striped mar_t10"
    size="small"
    :pagination="false"
    :scroll="tableHeight"
    :rowClassName="
      (record, index) => (index % 2 === 1 ? 'table-striped' : null)
    "
    :row-key="(record) => `${record[rowkey]}`"
    :row-selection="
      isSelect
        ? {
            selectedRowKeys: selectedRowKeys,
            onChange: onRowSel,
          }
        : null
    "
  >
    <template v-slot:[item]="scope" v-for="item in renderArr">
      <!-- // 插槽后面-slot:[item] 如果是動(dòng)態(tài)渲染插槽需要使用這種方式
         //renderArr 是父組件傳遞過來的用了插槽的名字,等下會(huì)在父組件中講清楚,通過這個(gè)數(shù)組來遍歷生成插槽 -->
      <!-- //再通過這個(gè)插槽傳遞數(shù)據(jù)給父組件,做一些編輯提交的操作等等 -->
      <slot :name="item" :scope="scope" v-bind="scope || {}"></slot>
    </template>
  </a-table>
</template>

<script lang="ts" setup>
// 把setup放在 script 標(biāo)簽里面,相當(dāng)于 setup()語法糖, 具體可以看vue的官網(wǎng)
import { useSlots } from "vue";
// 如果要知道使用插槽的實(shí)例需要引入 useSlots

defineProps({
  dataSource: {
    type: Object,
    required: true,
  },
  columns: {
    type: Object,
    required: true,
  },
  isSelect: {
    type: Boolean,
    required: true,
  },

  rowkey: {
    type: String,
    required: true,
  },
});
// defineProps是3.2中新的語法,不需要從 vue里面引入出來

const slots = useSlots();
const emit = defineEmits(["onSelRowKeys"])
// 插槽的實(shí)例

const renderArr = Object.keys(slots);
const state = reactive({
  selectedRowKeys: [] as (string | number)[],
});
const onRowSel = (selectedRowKeys: (string | number)[], selectedRows) => {
  state.selectedRowKeys = selectedRowKeys;
  emit("onSelRowKeys", selectedRowKeys)
};
// 此處減去的190是其他固定元素塊的總高度
const tableHeight = ref({ x: 4800, y: document.body.clientHeight - 190 });
onMounted(() => {
  // 監(jiān)聽瀏覽器窗口變化
  window.onresize = () => {
    return (() => {
      tableHeight.value.y = document.body.clientHeight - 190;
    })();
  };
});
// 渲染的數(shù)據(jù)

const { selectedRowKeys } = toRefs(state);
</script>
<style lang="less" scoped>
  .ant-table-striped :deep(.table-striped) td {
    background-color: #fafafa;
  }
</style>


里面最主要的就是通過useSlots來知道父組件在使用表格組件的時(shí)候使用了幾個(gè)插槽,通過返回的這個(gè)對(duì)象來通過Object.Keys 來遍歷渲染生成新的插槽.

父組件的使用

//rowkey是唯一值隨自己數(shù)據(jù)而修改
<template>
 <MyTable   :loading="loading"
        :columns="columns"
        :dataSource="viewList"
        :isSelect="isSelect"
        @onSelRowKeys="onSelRowKeys"
        rowkey="xxxxxxxxxxx">
        <template v-slot:bodyCell="{ scope }">
          <span v-if="scope.column.key === 'action'"  class="recent_linkcolor" @click="onDel(scope.record.fnid, 'nor')" >{{ $t("common.del") }}</span >
        </template>
      </MyTable>
</template>
<script setup>
 const isSelect=ref(false)
const state=reactive({
  rowKeys :[]
})
const dataSource = ref([])
const columns = [
  {
    title: '序號(hào)',
    dataIndex: 'numbers',
    key: 'numbers',
    width: '6%'
  },
  {
    title: '資源名稱',
    dataIndex: 'ResourceName',
    slots: { customRender: 'ResourceName' }, //slots這個(gè)是重點(diǎn),通過這個(gè)相當(dāng)于告訴表格組件我有一個(gè)具名插槽要用,名字就是customRender后面的名字, 父組件中的useSlots插槽的實(shí)例就有這個(gè)ResourceName,下面也一樣
    width: '12%'
  },
  {
    title: '資源名稱IP',
    dataIndex: 'IP',
    slots: { customRender: 'IP' },
    width: '12%'
  },
  {
    title: '數(shù)據(jù)庫類型',
    dataIndex: 'DatabaseType',
    slots: { customRender: 'DatabaseType' },
    width: '12%'
  },
  {
    title: '數(shù)據(jù)庫名',
    dataIndex: 'Dbname',
    slots: { customRender: 'Dbname' },
    width: '12%'
  },
  {
    title: '用戶名',
    dataIndex: 'Username',
    slots: { customRender: 'Username' },
    width: '12%'
  },
  {
    title: '端口',
    dataIndex: 'Port',
    slots: { customRender: 'Port' },
    width: '12%'
  },
  {
    title: '操作',
    isSlot: true,
    dataIndex: 'action',
    slots: { customRender: 'action' }
  }
]
const onSelRowKeys = (rowKeys: (string | number)[]) => {
  state.rowKeys = rowKeys;
};
const changePage=()=>{
    console.log('xxxx')
}
const onDel=()=>{
   console.log('xxxx')
}
const {rowKeys }=toRefs(state)
</script>

這次主要的一個(gè)功能是編輯之后變成input框 修改了之后變成完成發(fā)送請(qǐng)求重新渲染表格

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荠割,一起剝皮案震驚了整個(gè)濱河市精盅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乎芳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帖池,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門奈惑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人睡汹,你說我怎么就攤上這事肴甸。” “怎么了囚巴?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵原在,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我彤叉,道長(zhǎng)庶柿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任姆坚,我火速辦了婚禮澳泵,結(jié)果婚禮上实愚,老公的妹妹穿的比我還像新娘兼呵。我一直安慰自己,他們只是感情好腊敲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布击喂。 她就那樣靜靜地躺著,像睡著了一般碰辅。 火紅的嫁衣襯著肌膚如雪懂昂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天没宾,我揣著相機(jī)與錄音凌彬,去河邊找鬼。 笑死循衰,一個(gè)胖子當(dāng)著我的面吹牛铲敛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播会钝,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伐蒋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起先鱼,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤俭正,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后焙畔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掸读,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年宏多,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寺枉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绷落,死狀恐怖姥闪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砌烁,我是刑警寧澤筐喳,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站函喉,受9級(jí)特大地震影響避归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜管呵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一梳毙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捐下,春花似錦账锹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婴程,卻和暖如春廓奕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背档叔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工桌粉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衙四。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓铃肯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親届搁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缘薛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容