优化element-ui表格数据结构

看下面的element-ui表格结构

 1 <el-table :data="tableData" border style="width: 100%">
 2     <el-table-column fixed prop="date" label="日期" width="150">
 3     </el-table-column>
 4     <el-table-column prop="name" label="姓名" width="160">
 5     </el-table-column>
 6     <el-table-column prop="name" label="年龄" width="160">
 7     </el-table-column>
 8     <el-table-column prop="name" label="身高" width="160">
 9     </el-table-column>
10     <el-table-column prop="name" label="体重" width="160">
11     </el-table-column>
12     <el-table-column prop="province" label="省份" width="160">
13     </el-table-column>
14     <el-table-column prop="city" label="市区" width="160">
15     </el-table-column>
16     <el-table-column prop="address" label="地址" width="300">
17     </el-table-column>
18     <el-table-column prop="zip" label="邮编" width="120">
19     </el-table-column>
20 </el-table>

 

上面的20行代码只能描述表格的9列数据,当我们遇到十几列甚至是二十几列的表格数据,如果我们按照上面的罗列,代码会特别冗余

 

 

此时我们模仿iviewui的写法,去设置自己的表格结构

 设置对应的增删数据方法

我们可以自己新建一个文件夹,处理和存放数据

 

 

methodData.js数据处理中心

 1 /*综合了所有的关于table数据的方法*/
 2 export default class linkEnum{
 3     constructor(value){
 4       //  console.log(value,123)
 5         this.value=value
 6         // 获取相关的obj
 7     }
 8     get(...val) {
 9         // 如果当前的方法没有传入值,或或者不是数组,我们就返回所有
10         if (val.length === 0) return this.value
11             // 否则就获取对应的数据
12             // arr的作用就是返回得到的枚举数据
13         let arr = []
14             // val是需要的数据
15         val.forEach((item) => {
16             // val的item和this.value的title进行一一匹配,从而获取对应的数据
17             this.value.forEach((name) => {
18                 if (item === name.title) {
19                     arr.push(name)
20                 }
21             })
22         })
23         return arr
24     }
25     // 过滤对应的数据
26     // data指的是需要的过滤的数据源
27      // val是需要过滤的内容
28     un(val,data){
29         let arr=data;
30          // 判断如果val是数组,则直接用数组,则直接用数组,不是将该数据转换为数组
31          let value = Array.isArray(val) ? val : [val];
32         // 对数据进行过滤操作
33         return arr.filter((item) => !value.includes(item.title))
34     }
35       // 头部增加方法
36       unshift(val,data){
37             // data指的是需要的过滤的数据源
38             // val是需要增加的内容
39             let arr=data || [];
40              // 判断如果val是数组,则直接用数组,则直接用数组,不是将该数据转换为数组
41             let value = Array.isArray(val) ? val : [val];
42             this.value.forEach((item)=>{
43                 if(value.includes(item.title)){
44                     arr.unshift(item)
45                 }
46             })
47            return arr
48       }
49       // 尾部增加方法
50       push(val, data) {
51         // data指的是需要的过滤的数据源
52         // val是需要增加的内容
53         let arr = data || []
54             // 判断如果val是数组,则直接用数组,则直接用数组,不是将该数据转换为数组
55         let value = Array.isArray(val) ? val : [val];
56         // 在整个大的数据源中进行查找增加
57         this.value.forEach((item) => {
58             if (value.includes(item.title)) {
59                 arr.push(item)
60             }
61         })
62         return arr
63     }
64     // 指定位置增加内容
65     insert(val,index,data){
66           // val是需要增加的内容
67         // index指的是增加的下标位置
68         // data数据源
69         let arr = data;
70         // 判断如果val是数组,则直接用数组,则直接用数组,不是将该数据转换为数组
71         let value = Array.isArray(val) ? val : [val];
72          // 在整个大的数据源中进行查找增加
73         this.value.forEach((item)=>{
74             if(value.includes(item.title)){
75                 arr.splice(index,0,item)
76             }
77         })
78         return arr
79     }
80 
81 }

 

linkData.js数据管理中心

 1  import linkEnum from "./methodsData"
 2 /*
 3 key   对应table表格的prop,也就是后端的返回字段
 4 title 列表显示的名称(可拓展国际化)
 5 width 列表的宽度
 6 */
 7 const rq = {
 8     key: 'date',
 9     title: '日期',
10     width: '150'
11 }
12 const xm = {
13     key: 'date',
14     title: '姓名',
15     width: '160'
16 }
17 const nl = {
18     key: 'date',
19     title: '年龄',
20     width: '160'
21 }
22 const sg = {
23     key: 'date',
24     title: '身高',
25     width: '160'
26 }
27 const tz = {
28     key: 'date',
29     title: '体重',
30     width: '160'
31 }
32 const sf = {
33     key: 'date',
34     title: '省份',
35     width: '160'
36 }
37 const sq = {
38     key: 'date',
39     title: '市区',
40     width: '160'
41 }
42 const dz = {
43     key: 'date',
44     title: '地址',
45     width: '300'
46 }
47 const yb = {
48     key: 'date',
49     title: '邮编',
50     width: '120'
51 }
52 const DataObj = [rq,xm,nl,tz,sg,sf,sq,dz,yb]
53 export default new linkEnum(DataObj)

 

此时我们就可以引入并且调用相应的方法

比如我们在vue页面中获取相关内容

App.vue

 1 <template>
 2 <div>
 3  <el-table :data="tableData" border style="width: 100%">
 4     <el-table-column fixed prop="date" label="日期" width="150">
 5     </el-table-column>
 6     <el-table-column prop="name" label="姓名" width="160">
 7     </el-table-column>
 8     <el-table-column prop="name" label="年龄" width="160">
 9     </el-table-column>
10     <el-table-column prop="name" label="身高" width="160">
11     </el-table-column>
12     <el-table-column prop="name" label="体重" width="160">
13     </el-table-column>
14     <el-table-column prop="province" label="省份" width="160">
15     </el-table-column>
16     <el-table-column prop="city" label="市区" width="160">
17     </el-table-column>
18     <el-table-column prop="address" label="地址" width="300">
19     </el-table-column>
20     <el-table-column prop="zip" label="邮编" width="120">
21     </el-table-column>
22 </el-table>
23 
24   </div>
25 </template>
26 
27 <script>
28 import linkData from "./link/linkData"
29   export default {
30     data() {
31       return {
32           cloumn:linkData.get('姓名','年龄','身高','体重','邮编'),
33         tableData: [{
34           date: '2016-05-02',
35           name: '王小虎',
36           province: '上海',
37           city: '普陀区',
38           address: '上海市普陀区金沙江路 1518 弄',
39           zip: 200333
40         }, {
41           date: '2016-05-04',
42           name: '王小虎',
43           province: '上海',
44           city: '普陀区',
45           address: '上海市普陀区金沙江路 1517 弄',
46           zip: 200333
47         }, {
48           date: '2016-05-01',
49           name: '王小虎',
50           province: '上海',
51           city: '普陀区',
52           address: '上海市普陀区金沙江路 1519 弄',
53           zip: 200333
54         }, {
55           date: '2016-05-03',
56           name: '王小虎',
57           province: '上海',
58           city: '普陀区',
59           address: '上海市普陀区金沙江路 1516 弄',
60           zip: 200333
61         }]
62       }
63     },
64     mounted(){
65         console.log(this.cloumn,123456789)
66      //  console.log(linkData.un('体重',this.cloumn),'00000')
67       // console.log(linkData.unshift('省份',this.cloumn),'00000')
68       // console.log(linkData.push('省份',this.cloumn),'00000')
69        console.log(linkData.insert('省份',1,this.cloumn),'00000')
70 
71     }
72   
73   }
74 </script>
75 
76 <style lang="scss" scoped>
77 
78 </style>

 

上面的column内容就是从linkData中得到的对应数据

 

 

比如我们还可以进行任意位置插入

console.log(linkData.insert('省份',1,this.cloumn),'00000')

 

 封装属于自己的table组件

 

在components文件夹中设置一个BaseTable组件,用来拓展我们表格功能

 

 1 <template>
 2  <div>
 3     <el-table v-bind='$attrs' v-on='$listeners' :data="data" style="width: 100%">
 4         <template v-for='(item,index) in column'>
 5             <!--拓展slot-->
 6             <template v-if="item.slot && item.slot == 'slot'">
 7                 <el-table-column :key='index' :prop="item.key" :label="item.titleName" :width="item.width">
 8                     <template slot-scope="scope">
 9                         <!--通过具名插槽传递出去-->
10                         <slot :name='item.key' :data='scope.row[item.key]'>
11                             <span>
12                                 {{scope.row[item.key]}}
13                             </span>
14                         </slot>
15                     </template>
16                 </el-table-column>
17             </template>
18             <el-table-column v-else :key='index' :prop="item.key" :label="item.titleName" :width="item.width">
19             </el-table-column>
20         </template>
21     </el-table>
22 </div>
23 </template>
24 
25 <script>
26     export default {
27     props: {
28         data: {
29             type: Array,
30             require: true,
31             default: () => {
32                 return []
33             }
34         },
35         column: {
36             type: Array,
37             require: true,
38             default: () => {
39                 return []
40             }
41         }
42     }
43 }
44 </script>
45 
46 <style lang="scss" scoped>
47 
48 </style>

 

 

此时结合我们之前的对数据的封装,我们可以把整个页面变得更加简单

 

 1 <template>
 2 <div>
 3     <el-button type="primary" @click='changeLang'>切换语言</el-button>
 4     <BaseTable :column='column' :data='tableData'>
 5         <template v-slot:hdxs='{data}'>
 6             {{data}}男
 7         </template>
 8         <template v-slot:ms='{data}'>
 9             {{data | food}}
10         </template>
11     </BaseTable>
12 </div>
13 </template>
14 
15 <script>
16 import linkData from '@/link/linkData'
17 import BaseTable from '@/components/BaseTable'
18 export default {
19     components: {
20         BaseTable
21     },
22     data() {
23         return {
24             column: linkData.get("活动名称", "活动形式", '地推活动', '特殊资源', '线下主题', '美食'),
25             tableData: [{
26                 hdmc: '2016-05-02',
27                 hdxs: '王小虎',
28                 dthd: '上海',
29                 tszy: '普陀区',
30                 xxzt: '上海市普陀区金沙江路 1518 弄',
31                 ms: 1
32             }, {
33                 hdmc: '2016-05-02',
34                 hdxs: '王小虎',
35                 dthd: '上海',
36                 tszy: '普陀区',
37                 xxzt: '上海市普陀区金沙江路 1518 弄',
38                 ms: 2
39             }, {
40                 hdmc: '2016-05-02',
41                 hdxs: '王小虎',
42                 dthd: '上海',
43                 tszy: '普陀区',
44                 xxzt: '上海市普陀区金沙江路 1518 弄',
45                 ms: 1
46             }, {
47                 hdmc: '2016-05-02',
48                 hdxs: '王小虎',
49                 dthd: '上海',
50                 tszy: '普陀区',
51                 xxzt: '上海市普陀区金沙江路 1518 弄',
52                 ms: 2
53             }]
54         }
55     },
56     mounted() {
57         console.log(this.column, '878')
58         console.log(linkData.insert('省份', 3, this.column), '9987')
59     },
60     methods: {
61         changeLang() {
62 
63             let lang = localStorage.getItem("lang") == 'zh' ? 'en' : 'zh';
64             this.$i18n.locale = lang
65             localStorage.setItem('lang', lang)
66             location.reload()
67         }
68     },
69     filters: {
70         food(val) {
71             return val === 1 ? '好吃' : '不好吃'
72         }
73     }
74 }
75 </script>
76 
77 <style scoped>
78 
79 </style>

页面效果

posted @ 2021-09-26 15:19  keyeking  阅读(322)  评论(0编辑  收藏  举报