成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Vue封裝通用table組件的完整步驟記錄

瀏覽:229日期:2023-02-10 09:30:25
目錄前言為什么需要封裝table組件?第一步:定義通用組件第二步:父組件與子組件進行render通信第三步:使用組件總結前言

隨著業務的發展和功能的增多,我們發現不少頁面都具備相似的功能,這里舉幾個比較俗的例子:可以多選的下拉菜單,帶輸入的對話框,日期選擇器等等,于是我們會想辦法將這些共有的功能抽取成一個個公共組件,以便能夠在不同的頁面或業務中使用。

為什么需要封裝table組件?

后臺管理系統表格使用頻率高,減少關于table的業務代碼,且便于后期統一修改、便于后期維護。如給table內容展示,超出單元格以省略號展示等。

對于大部分的后臺管理系統,數據表格的展示大同小異,由于不想寫重復的代碼,所以我選擇封裝通用table組件,解放雙手。如果你的表格有一列并不是簡單dom元素,比如switch按鈕,完全可以傳入一個render函數,來達到目的。

第一步:定義通用組件

<!-- pro-table.vue --><template> <div> <el-table :data='tableData' :stripe='tableTitle.stripe' :border='tableTitle.border' :fit='tableTitle.fit' :highlight-current-row='tableTitle.highlightCurrentRow' @selection-change='handleSelectionChange'> <!--表格第一列--> <el-table-column:type='firstTableCol.type': v-if='firstTableCol.select' > </el-table-column> <!--表格其它列--> <el-table-column v-for='(value,index) in tableCol' :key='index' :prop='value.prop' :label='value.label' :width='value.width || 180'><template slot-scope='scope'> <template v-if='!value.render'> <template v-if='value.formatter'> {{ value.formatter(scope.row, value) }} </template> <template v-else-if='value.getImgurl'> <el-image :src='http://www.piao2010.com/bcjs/value.getImgurl(scope.row, value)' :preview-src-list='value.previewSrcList ? value.previewSrcList(scope.row, value) : value.getImgurl(scope.row, value).split(’,’)'/> </template> <template v-else> {{ scope.row[value.prop] }} </template> </template> <!--擴展dom--> <template v-else> <Table :key='`cus${index}`' :render='value.render' :param='scope.row'></Table> </template></template> </el-table-column> <!--基礎操作--> <el-table-column label='操作'><template slot-scope='scope'> <el-button type='text' v-for='(value,index) in operator' @click='value.click(scope.row, value)' :key='index'> {{ value.text }} </el-button></template> </el-table-column> </el-table> <!--分頁插件--> <el-pagination v-show='total>0' :total='total' :page-size.sync='pageSize' :current-page.sync='currentPage' :page-sizes='[10, 20, 30, 50]' layout='total, sizes, prev, pager, next, jumper' @current-change='handleCurrentChange' @size-change='handleSizeChange' v-bind='$attrs'> </el-pagination> </div></template><script>// render函數import Table from ’./table’export default { components: {Table}, props: { tableTitle: { type: Object, default: {stripe: false,border: false,fit: true,highlightCurrentRow: false } }, firstTableCol: { type: Object, default: {select: false,width: 55,type: ’selection’ } }, tableCol: { type: Array, default: [] }, tableData: { type: Array, default: [] }, operator: { type: Array, default: [] }, total: { type: Number, default: 0 }, page: { type: Number, default: 1 }, limit: { type: Number, default: 10 }, autoScroll: { type: Boolean, default: true } }, computed: { currentPage: { get () {return this.page }, set (val) {this.$emit(’update:page’, val) } }, pageSize: { get () {return this.limit }, set (val) {this.$emit(’update:limit’, val) } } }, data () { return { } }, methods: { // 監聽table選擇框 handleSelectionChange (selection) { // 調用父組件對應的方法 handleSelectionChange this.$emit(’handleSelectionChange’, selection) }, // 監聽每頁多少條數據(limit) handleSizeChange (limit) { this.$emit(’pagination’, {page: this.currentPage, limit: limit}) if (this.autoScroll) {scrollTo(0, 800) } }, // 監聽當前是第幾頁(page) handleCurrentChange (page) { this.$emit(’pagination’, {page: page, limit: this.pageSize}) if (this.autoScroll) {scrollTo(0, 800) } } }}</script><style scoped></style>第二步:父組件與子組件進行render通信

為了實現父組件render函數在子組件中生效,我們需要定義一個render函數,在子組件中引用。

// table.jsexport default { props: { render: { type: Function }, param: { type: Object } }, render(h) { return this.render(h, this.param) }}第三步:使用組件

<template> <div> <!--@自定義事件='父組件方法', 子組件中,this.$emit(’自定義事件名稱’) 觸發父組件事件。ref='proTable',標記在子組件上,指向子組件實例 --> <proTable ref='proTable' :tableTitle='tableTitle' :tableCol='tableCol' :tableData='tableData' :operator='operator':firstTableCol='firstTableCol'@handleSelectionChange='handleSelectionChange':total='total' :page.sync='queryParams.page' :limit.sync='queryParams.limit' @pagination='getList'/> </div></template><script>import proTable from ’./pro-table’export default { components: { proTable }, data() { return { queryParams: {page: 1,limit: 10, }, type: ’success’, total: 50, // element-ui中對table屬性的設置 tableTitle: {’stripe’: true,'highlightCurrentRow': true }, // 設置table的列 tableCol: [{ prop:’date’,label:’日期’},{ prop:’name’,label:’姓名’},{ prop:’address’,label:’地址’,width: 300},{ prop:’src’,label:’圖片’, getImgurl: (row, col, cellValue) => { return this.getImgurl(row)}, previewSrcList: (row, col, cellValue) => {return this.listImgUrl(row)}},{ prop:’sex’,label:’性別’, formatter: (row, col, cellVaule) => {return this.sexFormatter(row)}},{ prop:’src’,label:’圖片’, getImgurl: (row, col, cellValue) => { return this.getImgurl(row)}},{ prop:’text’,label:’函數’, render: (h, params) => {return this.render(h, params)}} ], // table的基本操作 operator: [{’text’:’詳情’, click: (row, col, cellValue) => {return this.getInfo(row)}},{’text’:’刪除’, click: (row, col, cellValue) => {return this.delInfo(row)}},{’text’:’編輯’, click: (row, col, cellValue) => {return this.editInfo(row)}}, ], // 模擬數據 tableData: [{ date: ’2016-05-02’, name: ’王小虎’, address: ’上海市普陀區金沙江路 1518 弄’, sex: 0, img:’https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic2.zhimg.com%2F50%2Fv2-193cbb243dc14d3a016caaa54ba02837_hd.jpg&refer=http%3A%2F%2Fpic2.zhimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1628435704&t=deb5584cb9ff53fe6977f14a5e0755bb’}, { date: ’2016-05-04’, name: ’王小虎’, address: ’上海市普陀區金沙江路 1517 弄’, sex: 1, img:’https://pic1.zhimg.com/80/v2-894ab624807fd4cfa33dd4e42cc90ac8_720w.jpg?source=1940ef5c’}, { date: ’2016-05-01’, name: ’王小虎’, address: ’上海市普陀區金沙江路 1519 弄’, sex: 0, img:’xx.jpg’}, { date: ’2016-05-03’, name: ’王小虎’, address: ’上海市普陀區金沙江路 1516 弄’, sex: 1, img:’xx.jpg’}], firstTableCol: {’select’: true,’type’: ’selection’ } } }, methods: { getInfo(val) { // 觸發父方法 console.log('獲取詳情',val) }, delInfo(val) { // 觸發父方法 console.log('刪除信息',val) }, editInfo(val) { // 觸發父方法 console.log('編輯信息',val) }, getImgurl(val) { console.log(val.img) return val.img }, sexFormatter(val) { return val.sex === 0 ? ’男’ : ’女’ }, handleSelectionChange(val) { console.log('監聽選擇框',val) }, getList(queryParams) { console.log('父級方法',queryParams) }, listImgUrl() { let array = []; array.push('https://pic1.zhimg.com/80/v2-894ab624807fd4cfa33dd4e42cc90ac8_720w.jpg?source=1940ef5c'); array.push('https://cdn.pixabay.com/photo/2021/07/01/21/20/girl-6380331_960_720.jpg'); return array; }, render(h, params) { return h(’span’, null , ’我是一個render組件’) } }}</script>總結

在引用組件的頁面中,我們可以給每一個table列加方法,也可以給編輯、刪除、詳情添加自定義的方法,完全實現定制化。也可以自定義render函數。效果圖如下:

Vue封裝通用table組件的完整步驟記錄

到此這篇關于Vue封裝通用table組件的文章就介紹到這了,更多相關Vue封裝通用table組件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产欧美一区二区精品秋霞影院 | 亚洲国产一区二区三区| av高清不卡在线| 91精品国产综合久久久久久漫画| 一区二区三区毛片| 日韩图片一区| 日韩理论电影院| 国产在线精品一区二区中文| 国产欧美日韩在线| 欧美在线看片| 久久久久久久久岛国免费| 不卡av电影在线播放| www亚洲一区| 成人av电影在线播放| 日韩免费电影一区| 精品不卡在线视频| 从欧美一区二区三区| 日韩欧美国产一二三区| 成人自拍视频在线| 日韩欧美一区在线| 99这里只有精品| 欧美zozo另类异族| av一区二区三区四区| 欧美精品一区二区三区蜜臀| 成人性视频网站| 日韩免费一区二区| av综合在线播放| 精品欧美乱码久久久久久1区2区 | 国产mv日韩mv欧美| 在线亚洲精品| 婷婷综合在线观看| 欧美日韩久久不卡| 国产一区二区美女| 精品少妇一区二区三区在线视频| www.欧美日韩| 欧美国产日韩亚洲一区| 亚洲黑丝在线| 亚洲高清视频中文字幕| 色婷婷综合久久久久中文| 蜜桃精品视频在线| 在线播放中文一区| a亚洲天堂av| 国产精品国产精品国产专区不蜜| 亚洲精品综合| 婷婷国产在线综合| 欧美日韩在线精品一区二区三区激情| 韩国av一区二区三区在线观看| 91精品国产入口| 91免费看片在线观看| 中文字幕一区视频| 麻豆精品网站| 国产精品亚洲一区二区三区妖精| 久久久青草青青国产亚洲免观| 欧美视频福利| 午夜精品123| 欧美日韩三级在线| 不卡一区二区在线| 亚洲视频一区在线观看| 性伦欧美刺激片在线观看| 老汉av免费一区二区三区| 精品女同一区二区| 亚洲欧洲日韩综合二区| 丝袜脚交一区二区| 欧美一区二区三区影视| 国产精品国产三级国产专区53| 一级日本不卡的影视| 欧美日韩中文一区| 欧美福利一区| 亚洲成人午夜电影| 日韩午夜精品电影| 亚洲久久成人| 久久精品999| 精品国产欧美一区二区| 亚洲欧洲一二三| 久草在线在线精品观看| 国产丝袜在线精品| 久久午夜激情| 成人av资源站| 亚洲精品视频在线| 欧美三级资源在线| 国内一区二区三区| 久久精品国产**网站演员| 国产亚洲一区二区三区四区| 亚洲欧美日韩另类精品一区二区三区| 麻豆精品视频在线观看| 日本一区二区三区国色天香| 久久精品99| 国产91精品一区二区麻豆亚洲| 亚洲天堂免费看| 91麻豆精品国产综合久久久久久 | 久久综合九色综合欧美狠狠| 国产福利一区二区三区| 亚洲天堂网中文字| 日韩一区二区三| 国产女优一区| 97se狠狠狠综合亚洲狠狠| 日本美女一区二区三区| 日本一区二区三区免费乱视频| 欧亚洲嫩模精品一区三区| 欧美精品一区二区三区在线看午夜| 日韩高清不卡在线| 国产日产亚洲精品系列| 欧美视频在线播放| 国产一区清纯| 国产原创一区二区三区| 亚洲黄色免费网站| 精品福利av导航| 久久人人97超碰人人澡爱香蕉| 91在线视频播放地址| 麻豆精品一区二区综合av| 国产精品青草综合久久久久99| 欧洲av在线精品| 亚洲无线视频| 成人高清视频在线| 美女视频黄久久| 一区二区三区四区在线| 精品免费国产一区二区三区四区| 校园春色综合网| 欧美日韩一区自拍| 国产成人h网站| 午夜av电影一区| 日本一区二区综合亚洲| 在线播放一区二区三区| 久久精品麻豆| 亚洲亚洲精品三区日韩精品在线视频| 国模少妇一区二区三区| 亚洲国产精品一区二区久久恐怖片| 国产女人aaa级久久久级| 在线播放91灌醉迷j高跟美女| 亚洲综合日本| 国内自拍视频一区二区三区| 高清国产一区二区| 美国一区二区三区在线播放| 一区二区三区欧美日| 久久午夜电影网| 在线电影院国产精品| 久久99伊人| 99热免费精品| 亚洲午夜精品久久| av一区二区三区四区| 国产美女娇喘av呻吟久久| 天堂成人国产精品一区| 中文字幕佐山爱一区二区免费| 26uuu国产电影一区二区| 在线综合视频播放| 欧美三区在线观看| 久色成人在线| 国产精品毛片在线| 一本久道久久综合婷婷鲸鱼| 国产精品高清一区二区三区| 91老司机福利 在线| 国产黑丝在线一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲一二三级电影| 亚洲猫色日本管| 国产精品入口麻豆九色| 久久久噜噜噜久久人人看| 91精品国产91久久久久久最新毛片 | 亚洲国产电影在线观看| 日韩女优视频免费观看| 8x8x8国产精品| 欧美网站大全在线观看| 色嗨嗨av一区二区三区| 久久久久欧美精品| 久久伊人一区二区| 久久婷婷久久| 色综合久久久久综合99| 久久免费一区| 在线观看日韩国产| 91福利在线导航| 91福利视频久久久久| 在线精品亚洲一区二区不卡| 91成人在线观看喷潮| 色94色欧美sute亚洲线路二| 一本色道a无线码一区v| 色综合久久99| 久久婷婷麻豆| 在线观看国产一区二区| 色八戒一区二区三区| 在线观看亚洲成人| 欧美日韩一区国产| 欧美日韩激情在线| 欧美日韩免费电影| 欧美军同video69gay| 欧美一区二区视频在线观看| 日韩一区二区中文字幕| 日韩一级免费观看| 日韩视频在线观看一区二区| 97久久久精品综合88久久| 91亚洲精品久久久蜜桃网站| 91日韩一区二区三区| 欧美+日本+国产+在线a∨观看| 欧美福利一区二区三区| 日韩精品一区二区在线| 亚洲一区二区在线免费看| 国产三级精品在线不卡| 老司机精品视频网站| 日本韩国一区二区三区视频| 欧美日韩一区二区在线观看视频 | 99国产精品|