日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:301日期: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.b3g6.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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人久久成人| 99成人在线| 亚洲精品在线二区| 亚洲免费观看| 久久午夜精品一区二区| 国产精品毛片| 免费在线观看精品| 亚洲人成毛片在线播放女女| 亚洲三级观看| 婷婷精品在线观看| 日韩av成人高清| 国产欧美三级| 久久午夜影院| 国产视频一区二区在线播放| 国产日韩免费| 久久影院资源站| 日韩免费久久| 一区在线免费观看| 亚洲精品日韩久久| 国产亚洲精品精品国产亚洲综合| 欧美精品影院| 欧美91在线| 九九精品调教| 一区在线免费观看| 在线看片日韩| 91麻豆精品| 国产成人免费精品| 亚洲手机视频| 美女国产一区| 国产精品网站在线看| 中国字幕a在线看韩国电影| 不卡中文一二三区| 日韩精品欧美大片| 国产在线不卡一区二区三区| 久久婷婷av| 视频在线观看一区| 国产欧美日韩在线一区二区| 日韩电影在线视频| 欧美在线综合| 欧美91在线|欧美| 激情久久久久久久| 日韩国产一二三区| 国产99在线| 亚洲男女自偷自拍| 国产精品.xx视频.xxtv| 久久一区二区三区电影| 亚洲日韩视频| 国产一区调教| 久久亚洲图片| 久久精品三级| 亚洲欧美日韩国产综合精品二区 | 国产精品国产一区| 1024精品久久久久久久久| 噜噜噜久久亚洲精品国产品小说| 国产精品高清一区二区| 91精品久久久久久久久久不卡| 在线一区二区三区视频| 欧美精品成人| 一区福利视频| 国产欧美精品久久| 激情六月综合| 国产欧美日韩综合一区在线播放| 日韩欧美字幕| 五月亚洲婷婷| 日韩成人三级| 欧美日本精品| 91成人精品视频| 你懂的国产精品永久在线| 香蕉成人av| 欧美日韩黄网站| 国产精品女主播一区二区三区| 国产一区丝袜| 日韩美女精品| 国产亚洲精品久久久久婷婷瑜伽| 精品久久视频| 日韩1区2区3区| 美女亚洲一区| av资源中文在线天堂| 日韩美女国产精品| 激情91久久| 欧美freesex黑人又粗又大| 日本少妇精品亚洲第一区| 999视频精品| 日韩欧美三区| 欧美特黄一区| 日韩不卡免费高清视频| 国产乱码精品| 亚洲免费观看高清完整版在线观| 日韩国产综合| 你懂的国产精品| 日韩精彩视频在线观看| 国产日韩综合| 久久国产电影| 麻豆视频在线观看免费网站黄| 天海翼亚洲一区二区三区| 亚洲国内精品| 日韩在线第七页| 欧美成人精品午夜一区二区| 蜜桃av一区二区| 亚洲一本视频| 日本精品在线中文字幕| 国产va免费精品观看精品视频| 日本电影久久久| 老司机久久99久久精品播放免费| 伊人精品一区| av高清不卡| 国产一区一一区高清不卡| 欧美激情五月| 麻豆国产欧美日韩综合精品二区| 日产欧产美韩系列久久99| 日韩精品一区第一页| 国产一区日韩一区| 99精品在线观看| 福利视频一区| 久久精品网址| 国产精品99久久免费| 国产欧美在线| 国产亚洲久久| 欧美日韩18| 国产亚洲一区| 国产欧美三级| 国产精品地址| 国产精品一区2区3区| 日韩不卡在线观看日韩不卡视频| 亚洲精品欧美| 日韩一区二区三区精品视频第3页| 综合激情网站| 日韩av一区二| 久久国产精品免费精品3p| 欧美日本二区| 青青青国产精品| 欧美a级一区二区| 精品国产aⅴ| 国产精选在线| 在线天堂中文资源最新版| 久久久久国产精品一区二区| 91精品一区国产高清在线gif | 久久激情五月婷婷| 欧美日韩国产一区二区在线观看| 日韩一级网站| 午夜性色一区二区三区免费视频| 日韩一区二区三区在线看| 好看的亚洲午夜视频在线| 99国产精品久久久久久久| 老牛国产精品一区的观看方式| 蜜臀精品一区二区三区在线观看| 亚洲一区欧美| 国产欧美丝祙| 福利视频一区| 久久久久免费av| 首页国产欧美日韩丝袜| 无码日韩精品一区二区免费| 国产精品传媒麻豆hd| 国产黄大片在线观看| 国产一区二区久久久久| 四虎8848精品成人免费网站| 九九精品调教| 国产精品嫩草99av在线| 日本亚州欧洲精品不卡| 里番精品3d一二三区| 综合日韩av| 国产精品人人爽人人做我的可爱| 日韩精品一区二区三区中文| 久久精品五月| 蜜臀91精品国产高清在线观看| 免费日韩一区二区| 国产欧美日韩亚洲一区二区三区| 国产欧洲在线| 免费欧美在线视频| 国产九九精品| 中文字幕系列一区| 免费日本视频一区| 欧美国产专区| 亚洲午夜久久久久久尤物| 亚洲天堂av资源在线观看| 国产日韩欧美一区二区三区在线观看| 成人亚洲一区| 狠狠色综合网| 国产伦精品一区二区三区视频 | 一区二区三区四区精品视频| 国产美女久久| 欧美色图国产精品| 国产精品v日韩精品v欧美精品网站| 在线亚洲精品| 日本一区二区免费高清| 色狠狠一区二区三区| 精品一区二区三区的国产在线观看 | 一区二区三区视频免费观看| 少妇精品久久久| 成人国产精品一区二区免费麻豆| 日本少妇一区| 91成人在线精品视频| 色综合五月天| 中文字幕日韩亚洲| 日韩中文欧美| 蜜臀a∨国产成人精品| 老鸭窝一区二区久久精品| 亚洲欧美网站| 给我免费播放日韩视频| 久色成人在线|