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

您的位置:首頁技術(shù)文章
文章詳情頁

Vue Element UI自定義描述列表組件

瀏覽:158日期:2022-09-29 14:34:37

本文實(shí)例為大家分享了Vue Element UI自定義描述列表組件的具體代碼,供大家參考,具體內(nèi)容如下

效果圖

Vue Element UI自定義描述列表組件

寫在前面

寫后臺(tái)管理經(jīng)常從列表點(diǎn)擊查看詳情,展示數(shù)據(jù)信息,Element UI雖然有表格組件,但是描述組件并沒有,之前團(tuán)隊(duì)的成員遇到這種情況都自己去寫樣式,寫起來也麻煩,而且每個(gè)人寫出來的樣式也不統(tǒng)一,破壞了項(xiàng)目的整體風(fēng)格。像是Ant Design UI就有描述組件,用起來特別舒服,所以索性自己結(jié)合Element UI的el-row和el-col自己寫了一個(gè)。

實(shí)現(xiàn)哪些功能

1、每行的高度根據(jù)改行中某一列的最大高度自動(dòng)撐開2、列寬度自動(dòng)補(bǔ)全,避免最后一列出現(xiàn)殘缺的情況3、支持純文本與HTML插槽4、支持每行幾列的設(shè)置5、支持每列寬度自定義6、支持動(dòng)態(tài)數(shù)據(jù)重繪

組件設(shè)計(jì)

1、使用父子組件嵌套實(shí)現(xiàn),父組件為 e-desc, 子組件為 e-desc-item 。2、e-desc-item傳遞props的label 和 插槽的value,使用 $slots.content來顯示DOM3、利用 el-row 和 el-col 來實(shí)現(xiàn)整體組件布局

封裝e-desc組件

<template> <div :style='{margin}'> <!-- 標(biāo)題 --> <h1 v-if='title' v-html='title'></h1> <el-row class='desc-row'> <slot/> </el-row> </div></template><script>export default { name: ’EDesc’, // 通過provide提供給子組件 provide () { return { labelWidth: this.labelWidth, column: this.column, size: this.size } }, props: { // 數(shù)據(jù)源,監(jiān)聽數(shù)據(jù)重繪 data: { type: Object, required: true, default () {return {} } }, // 標(biāo)題 title: { type: String, default: ’’ }, // 邊距 margin: { type: String, default: ’0’ }, // label寬度 labelWidth: { type: String, default: ’120px’ }, column: { // 每行顯示的項(xiàng)目個(gè)數(shù) type: [Number, String], default: 3 }, size: { // 大小 type: String, default: ’’ } }, watch: { data: { handler () {this.$nextTick(() => { // 篩選出子組件e-desc-item const dataSource = this.$slots.default const dataList = [] dataSource.forEach(item => { if (item.componentOptions && item.componentOptions.tag === ’e-desc-item’) { dataList.push(item.componentInstance) } }) // 剩余span let leftSpan = this.column const len = dataList.length dataList.forEach((item, index) => { // 處理column與span之間的關(guān)系 // 剩余的列數(shù)小于設(shè)置的span數(shù) const hasLeft = leftSpan <= (item.span || 1) // 當(dāng)前列的下一列大于了剩余span const nextColumnSpan = (index < (len - 1)) && (dataList[index + 1].span >= leftSpan) // 是最后一行的最后一列 const isLast = index === (len - 1) if (hasLeft || nextColumnSpan || isLast) { // 滿足以上條件,需要自動(dòng)補(bǔ)全span,避免最后一列出現(xiàn)殘缺的情況 item.selfSpan = leftSpan leftSpan = this.column } else { leftSpan -= item.span || 1 } })}) }, deep: true, immediate: true } }}</script><style scoped lang='scss'> .desc{ .desc-title { margin-bottom: 10px; color: #333; font-weight: 700; font-size: 16px; line-height: 1.5715; } .desc-row{ display: flex; flex-wrap: wrap; border-radius: 2px; border: 1px solid #EBEEF5; border-bottom: 0; border-right: 0; width: 100%; } }</style>封裝e-desc-item組件

<template> <el-col :span='computedSpan' class='desc-item'> <div :class='size'> <label : v-html='label'></label> <div v-if='$slots'><!-- 純文本 --><slot v-if='$slots.default && $slots.default[0].text'/><!-- HTML --><slot name='content' v-else-if='$slots.content'/><span v-else>暫無數(shù)據(jù)</span> </div> </div> </el-col></template><script>export default { name: ’EDescItem’, inject: [’labelWidth’, ’column’, ’size’], props: { span: { type: [Number, String], required: false, default: 0 }, label: { type: String, required: false, default: ’’ } }, data () { return { // 子組件自己的span selfSpan: 0 } }, computed: { computedSpan () { // 子組件自己的span,用于父組件計(jì)算修改span if (this.selfSpan) {return 24 / this.column * this.selfSpan } else if (this.span) { // props傳遞的spanreturn 24 / this.column * this.span } else { // 未傳遞span時(shí),取columnreturn 24 / this.column } } }}</script><style scoped lang='scss'> .desc-item { border-right: 1px solid #EBEEF5; border-bottom: 1px solid #EBEEF5; .desc-item-content { display: flex; justify-content: flex-start; align-items: center; color: rgba(0,0,0,.65); font-size: 14px; line-height: 1.5; width: 100%; background-color: #fafafa; height: 100%; .desc-item-label{border-right: 1px solid #EBEEF5;display: inline-block;padding: 12px 16px;flex-grow: 0;flex-shrink: 0;color: rgba(0, 0, 0, 0.6);font-weight: 400;font-size: 14px;line-height: 1.5;height: 100%;display: flex;align-items: center; } .desc-item-value{background: #fff;padding: 12px 16px;flex-grow: 1;overflow: hidden;word-break: break-all;height: 100%;display: flex;align-items: center;color: #444;span{ color: #aaa;} } &.small {.desc-item-label,.desc-item-value { padding: 10px 14px;} } } }</style>使用方式

<template> <e-desc :data=’info’ margin=’0 12px’ label-width=’100px’> <e-desc-item label='姓名'>{{info.name}}</e-desc-item> <e-desc-item label='年齡'>{{ info.age }}歲</e-desc-item> <e-desc-item label='性別'>{{ info.sex }}</e-desc-item> <e-desc-item label='學(xué)校'>{{ info.school }}</e-desc-item> <e-desc-item label='專業(yè)'>{{ info.major }}</e-desc-item> <e-desc-item label='愛好'>{{ info.hobby }}</e-desc-item> <e-desc-item label='手機(jī)號(hào)'>{{ info.phone }}</e-desc-item> <e-desc-item label='微信'>{{ info.wx }}</e-desc-item> <e-desc-item label='QQ'>{{ info.qq }}</e-desc-item> <e-desc-item label='住址'>{{ info.address }}</e-desc-item> <e-desc-item label='自我描述' :span=’2’>{{ info.intro }}</e-desc-item> <e-desc-item label='操作' :span=’3’> <template slot='content'><el-button size='small' type='primary'>修改</el-button><el-button size='small' type='danger'>刪除</el-button> </template> </e-desc-item> </e-desc></template><script>import EDesc from ’./e-desc’import EDescItem from ’./e-desc-item’export default { components: { EDesc, EDescItem }, data () { return { info: {name: ’Jerry’,age: 26,sex: ’男’,school: ’四川大學(xué)’,major: ’碼農(nóng)專業(yè)’,address: ’四川省成都市’,hobby: ’搬磚、前端、賺錢’,phone: 18888888888,wx: ’Nice2cu_Hu’,qq: 332983810,intro: ’我是一個(gè)粉刷匠,粉刷本領(lǐng)強(qiáng)。我要把那新房子,刷得更漂亮。刷了房頂又刷墻,刷子飛舞忙。哎呀我的小鼻子,變呀變了樣。我是一個(gè)粉刷匠,粉刷本領(lǐng)強(qiáng)。我要把那新房子,刷得更漂亮。刷了房頂又刷墻,刷子飛舞忙。哎呀我的小鼻子,變呀變了樣。’ } } }}</script>參數(shù)說明

Vue Element UI自定義描述列表組件

至此,代碼就寫完啦,考慮不周或者有bug的地方,還望多多留言告知我喲

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
噜噜噜躁狠狠躁狠狠精品视频 | 999久久久免费精品国产| 欧美精品97| 欧美精品97| 久久精品国产免费| 捆绑调教日本一区二区三区| 久草免费在线视频| 成人福利av| 久久久水蜜桃av免费网站| 免费不卡中文字幕在线| 亚洲欧洲一区| 蜜臀精品久久久久久蜜臀| 日韩一区免费| 欧美伊人久久| 国产高清精品二区| 国产伦久视频在线观看| 久久亚洲国产| 蜜桃伊人久久| 国产日韩欧美一区二区三区| 久久精品免视看国产成人| 亚洲黄色中文字幕| 欧美成人国产| 亚洲一区二区三区久久久| 精品一区二区三区的国产在线观看| 亚洲一区二区三区久久久| 欧美大黑bbbbbbbbb在线| 久久免费视频66| 久久久久美女| 精品亚洲成人| 国产日韩一区二区三区在线| 久久九九电影| 欧美日韩激情在线一区二区三区| 国产精品蜜芽在线观看| 精品国产午夜肉伦伦影院| 久久香蕉网站| 欧美国产视频| 麻豆成人在线观看| 麻豆极品一区二区三区| 国产福利一区二区三区在线播放| 日韩毛片在线| 蜜臀av在线播放一区二区三区| 丁香婷婷久久| 久久字幕精品一区| 欧美福利一区| 精品网站999| 91精品在线免费视频| 午夜欧美精品久久久久久久| 精品三级国产| 国产福利一区二区精品秒拍| 精品资源在线| 国产亚洲一级| 美女网站久久| 国产伦精品一区二区三区视频| 久久麻豆视频| 激情欧美日韩一区| 欧美性www| 日韩精品水蜜桃| 日韩精品成人| 精品一二三区| 亚洲精品影院在线观看| 亚洲黄色中文字幕| 欧美偷窥清纯综合图区| 18国产精品| 美女国产精品久久久| 日韩精品一区二区三区中文在线| 亚洲欧洲一区| 亚洲色图网站| 99视频精品| 五月国产精品| 天堂久久一区| 美女性感视频久久| 国产精久久久| sm久久捆绑调教精品一区| 麻豆精品99| 激情综合网址| 欧美黄页在线免费观看| 久久国产中文字幕| 日韩精品社区| 久久国产麻豆精品| 91成人精品观看| 亲子伦视频一区二区三区| 亚洲男人在线| 亚洲午夜91| 国产一区二区三区不卡av| 亚洲我射av| 精品亚洲美女网站| 国产精品亚洲综合在线观看| 国产精品普通话对白| 国产精品九九| 水蜜桃久久夜色精品一区的特点 | 免费视频久久| 亚洲精品.com| 久久xxx视频| 亚洲精品精选| 五月精品视频| 欧洲精品一区二区三区| 国产精品任我爽爆在线播放| 在线午夜精品| 久久网站免费观看| 国产成人免费精品| 国产欧美三级| 999国产精品999久久久久久| 麻豆精品在线播放| 少妇精品久久久一区二区三区| 成人看片网站| 国产精品亚洲片在线播放| 国产一区二区中文| 国产精品一区二区三区av麻| 国产欧洲在线| 99riav1国产精品视频| 欧美日本精品| 久久久久国产| 日本激情一区| 精品一区二区三区免费看| 日韩国产高清在线| 黄色欧美日韩| 久久在线91| 午夜av成人| 麻豆精品91| 综合激情视频| 蘑菇福利视频一区播放| 亚洲免费毛片| 亚洲精品一级二级三级| 首页亚洲欧美制服丝腿| 一区二区三区四区在线观看国产日韩| 欧美 日韩 国产精品免费观看| 中文字幕成在线观看| 免费一级欧美在线观看视频| 国产精品伦一区二区| 欧美亚洲一区二区三区| 清纯唯美亚洲综合一区| 中文字幕一区二区三区四区久久| 伊人影院久久| 久久都是精品| 中文字幕日韩高清在线| 亚洲精品国产精品粉嫩| 日韩精品视频网| 欧美一级网址| 久久这里只有| 久久毛片亚洲| 成人免费电影网址| 久久国产影院| 亚洲日本久久| 日韩av一区二| 国产精品99久久免费观看| 精品91福利视频| 国产一区2区| 91看片一区| 午夜欧美精品| 亚州av日韩av| 国产欧美日韩视频在线| 麻豆中文一区二区| 国产一区不卡| 蜜桃av一区二区| 色婷婷狠狠五月综合天色拍| 亚洲综合日韩| 亚洲韩日在线| 九九色在线视频| 免费久久精品视频| 麻豆视频一区二区| 日韩一级不卡| 欧美一级二级视频| 中文在线а√天堂| 久久亚洲影院| 欧美精品影院| 日本 国产 欧美色综合| 99久久婷婷| 日本午夜大片a在线观看| 久久丁香四色| 久久精品国产久精国产| 亚洲精品美女91| 亚洲韩日在线| 91精品啪在线观看国产爱臀| 高清在线一区| 午夜久久av | 国产麻豆一区| www.51av欧美视频| 视频一区中文字幕国产| 国产日韩在线观看视频| 日韩高清欧美| 亚洲一区有码| 久久一区国产| 国产视频久久| 国产精品多人| 亚洲精品99| 国产图片一区| 久久久人人人| 欧美一区激情| 亚洲二区精品| 久久精品99国产精品日本| 国产一区二区三区成人欧美日韩在线观看| 亚洲h色精品| 国产精品一区二区三区av | 国产一区二区久久久久| 性一交一乱一区二区洋洋av| 美女视频黄久久| 日韩专区欧美专区| 日本一区二区高清不卡| 日韩国产在线观看| 亚洲成人国产|