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

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

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

瀏覽:309日期: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://m.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久久,三上悠亚国产精品一区二区三区
久久男人av| 亚洲免费专区| 麻豆精品在线| 麻豆视频观看网址久久| 国产欧美一级| 综合色一区二区| 亚洲精品极品| 日本不卡一区二区三区| 一区二区不卡| 亚洲日韩视频| 欧美亚洲一级| 久久免费精品| 成人自拍av| 午夜免费一区| 日本在线视频一区二区| 国产精品久久久一区二区| 牛牛精品成人免费视频| 91日韩免费| 99在线|亚洲一区二区| 亚欧洲精品视频在线观看| 日韩欧美激情| 精品国产精品久久一区免费式| 成人三级高清视频在线看| 亚洲午夜91| 亚洲精品观看| 国内精品伊人| 亚洲精品1区2区| 欧美伊人影院| 91欧美国产| 亚洲欧美日韩国产| 7777精品| 日本不良网站在线观看| 欧美资源在线| 国产精品毛片视频| 亚洲www啪成人一区二区| 午夜精品婷婷| 日本不卡一二三区黄网| 国产一区二区三区日韩精品| 成人羞羞在线观看网站| 噜噜噜躁狠狠躁狠狠精品视频| 91亚洲精品视频在线观看| 精品久久97| 午夜在线一区| 欧美精品1区| 亚洲特级毛片| 91av一区| 久久免费高清| 欧美日韩亚洲三区| 成人看片网站| 亚洲精品在线a| 国产成人久久精品麻豆二区| 黑丝一区二区| 牛牛精品成人免费视频| 午夜久久福利| 久久一区精品| 老牛国产精品一区的观看方式| 久久影院一区二区三区| 亚洲免费精品| 精品国产欧美| 一区二区三区四区精品视频| 国产成人久久精品一区二区三区| 亚洲欧美日韩专区| 久久久精品区| 亚洲最新av| 人在线成免费视频| 日韩综合一区二区| 视频福利一区| 国产精品白丝av嫩草影院| 亚洲一区欧美激情| 97欧美在线视频| 日韩福利视频一区| 亚洲婷婷免费| 日产精品一区二区| 日韩国产一区二| 欧美网站在线| 亚洲最新无码中文字幕久久 | 国产精品亚洲欧美日韩一区在线| 精品亚洲美女网站| 国产欧美日韩在线观看视频| 在线国产一区| 日韩欧美自拍| 精品国产中文字幕第一页| 一本综合精品| 亚洲福利专区| 丁香六月综合| 欧美黄色一区| 日韩av一区二区三区四区| 一本色道久久精品| 99久久亚洲精品蜜臀| 精品视频亚洲| 国产精品香蕉| 亚洲色图国产| 午夜精品网站| 91精品国产乱码久久久久久久| 国产精品videosex极品| 日韩有吗在线观看| 黑丝一区二区三区| 亚洲午夜91| 四虎4545www国产精品| 成人精品高清在线视频| 国产精品多人| 国产亚洲欧美日韩在线观看一区二区| 先锋影音国产一区| 尹人成人综合网| 久久久成人网| 久久久精品网| 人人精品亚洲| 日韩欧美午夜| 日韩欧美二区| 欧美黄色网页| 亚洲人成在线网站| 亚洲天堂资源| 欧美日韩免费观看视频| 日韩一区自拍| 亚洲成人不卡| 日韩精品网站| 久久精品一区二区不卡| 日韩在线短视频| 99精品视频精品精品视频| 美女福利一区二区三区| 日韩电影免费在线观看| 一区二区精品伦理...| 精品久久免费| 水蜜桃精品av一区二区| 国产盗摄——sm在线视频| 国产精品精品国产一区二区| 精品国产18久久久久久二百| 国产一区二区色噜噜| 国产 日韩 欧美 综合 一区 | 欧美日韩亚洲一区二区三区在线| 日韩不卡手机在线v区| 日韩av中文字幕一区二区| 久久黄色影视| 欧美激情一区| 97人人精品| 秋霞影院一区二区三区| se01亚洲视频| 国内亚洲精品| 日韩视频一区| 亚洲乱码一区| 国产精品日韩精品在线播放| 久久影院资源站| 日韩一区电影| 红桃视频国产一区| 久久午夜精品| 日韩中文一区二区| 国产欧美日韩精品一区二区三区| 国产精品视频一区视频二区| 精品视频自拍| 国产综合精品| 免费看黄色91| 青青国产精品| 精品欧美日韩精品| 久久久人人人| 一区二区日韩免费看| 青青草伊人久久| caoporn视频在线| 国产精品99免费看| 亚洲午夜久久| 老牛国内精品亚洲成av人片| 婷婷激情一区| 日韩中文字幕视频网| 久久中文欧美| 欧美影院三区| 亚洲精品一区二区在线播放∴| 欧美aa在线视频| 久久精品1区| 日韩中文字幕| 伊人久久高清| 日本一不卡视频| 国产在线观看www| 亚洲欧美网站| 国产精品手机在线播放| 日韩精品午夜| 日韩国产高清在线| 日韩中文首页| 日本精品久久| 亚洲a一区二区三区| 欧美影院精品| 人人精品亚洲| 国产日韩视频| 国产成人免费视频网站视频社区| 在线视频日韩| 精品国产一区二区三区2021| 在线精品视频在线观看高清| 欧美日韩亚洲一区三区| 久久精品国内一区二区三区水蜜桃| 亚洲va久久| 欧美不卡高清一区二区三区| 日本少妇精品亚洲第一区| 日韩av免费| 国产精品久久久久久久久久齐齐| 亚洲国产成人精品女人| 国产毛片精品| 国产高清一区| 久久精品色播| 性色一区二区| 日韩国产欧美一区二区| 日韩高清国产一区在线| 久久精品国产www456c0m|