Vue 패키지 유 니 버 설 table 구성 요소 의 전체 절차 기록
12188 단어 vue 패키지table 구성 요소
업무 의 발전 과 기능 이 증가 함 에 따라 우 리 는 많은 페이지 가 비슷 한 기능 을 가지 고 있다 는 것 을 알 게 되 었 다.여기 서 몇 가지 일반적인 예 를 들 어 선택 할 수 있 는 드 롭 다운 메뉴,입력 할 수 있 는 대화 상자,날짜 선택 기 등 을 들 수 있다.그래서 우 리 는 이러한 공 통 된 기능 을 하나의 공공 구성 요소 로 추출 하여 서로 다른 페이지 나 업무 에서 사용 할 수 있 도록 방법 을 강구 할 것 이다.
왜 table 구성 요 소 를 봉인 해 야 합 니까?
백 스테이지 관리 시스템 표 의 사용 빈도 가 높 고 table 에 관 한 업무 코드 를 줄 이 며 후기 에 통일 적 으로 수정 하고 후기 유지 에 편리 합 니 다.예 를 들 어 table 내용 을 보 여 주 는 것 은 셀 을 넘 어 생략 번호 로 보 여 주 는 것 등 입 니 다.
대부분의 배경 관리 시스템 에 대해 데이터 시트 의 전 시 는 대동소이 합 니 다.중복 되 는 코드 를 쓰 고 싶 지 않 기 때문에 저 는 유 니 버 설 table 구성 요 소 를 패키지 하여 두 손 을 해방 시 키 겠 습 니 다.만약 당신 의 표 에 간단 한 dom 요소 가 있다 면,예 를 들 어 switch 단 추 는 render 함수 에 들 어가 서 목적 을 달성 할 수 있 습 니 다.
첫 번 째 단계:유 니 버 설 구성 요소 정의
<!-- pro-table.vue -->
<template>
<div>
<el-table
:data="tableData"
style="width: 100%"
:stripe="tableTitle.stripe"
:border="tableTitle.border"
:fit="tableTitle.fit"
:highlight-current-row="tableTitle.highlightCurrentRow"
@selection-change="handleSelectionChange">
<!-- -->
<el-table-column
:type="firstTableCol.type"
:width="firstTableCol.width"
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="value.getImgurl(scope.row, value)" style="width: 70px; height: 70px"
: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.js
export 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 구성 요소 에 관 한 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!