共计 3135 个字符,预计需要花费 8 分钟才能阅读完成。
原文地址:http://isee.xyz/a/60370591cfe9924ea139030d
前言
以前用 ant design vue
,组件特地多。外面有一个形容组件很好用 (
),起初切换到 element
发现没有这种组件,每次都须要本人编写。然而一个我的项目界面风格要对立,每次都复制代码很是麻烦,而且如果要改款式,那么就是一个炸弹呀,还不得累死。一咬牙,一跺脚,本人写一个吧。
组件设计思路
- 应用父子组件嵌套实现,父组件为
el-description
, 子组件为el-description-item
。 el-description-item
要保障默认显示label
和value
,而且还能够应用slot
来定制内容- 利用
vue
的$slot.content
是否存在来实现子组件的内容定制,不存在则显示默认value
,存在则示意是定制内容 - 利用
el-row
和el-col
来实现栅格布局
组件开发
-
父组件
el-description
<template> <div class="descriptions"> <div v-if="Boolean(title)" class="descriptions-title">{{title}}</div> <div class="descriptions-view"> <el-row class="descriptions-row"> <slot v-if="$slots.default" /> <div v-else style="text-align: center; color: grey;"> 暂无数据 </div> </el-row> </div> </div> </template> <script> export default { name: 'ElDescription', props: { title: { type: String, required: false, default: '' } } } </script> <style scoped lang="scss"> .descriptions{ .descriptions-title{ margin-bottom: 20px; color: rgba(0,0,0,.85); font-weight: 700; font-size: 16px; line-height: 1.5; } .descriptions-view{ width: 100%; overflow: hidden; table{ width: 100%; table-layout: fixed; border-collapse: collapse; } .descriptions-row{}} } </style>
-
子组件 el-description-item
<template> <el-col :span="span" :xs="spanMap.xs" :sm="spanMap.sm" :md="spanMap.md" :lg="spanMap.lg" :xl="spanMap.xl" class="descriptions-item" > <div class="descriptions-item-content"> <div class="descriptions-item-label">{{label}}:</div> <div class="descriptions-item-value"> <slot v-if="$slots.content" name="content" /> <div v-else class="default-value" :title="value">{{value}}</div> </div> </div> </el-col> </template> <script> export default { name: 'ElDescriptionItem', props: { spanMap: { type: Object, required: false, default: () => { return {} } }, span: { type: Number, required: false, default: 6 }, label: {required: true}, value: { required: false, default() {return ''} } } } </script> <style scoped lang="scss"> .descriptions-item { padding-bottom: 16px; padding-right: 20px; span {display: inline-block;} .descriptions-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%; .descriptions-item-label{ flex-grow: 0; flex-shrink: 0; color: rgba(0,0,0,.85); font-weight: 400; font-size: 14px; line-height: 1.5; } .descriptions-item-value{ flex-grow: 1; overflow: hidden; .default-value{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } } } </style>
组件应用
-
组件援用
// 引入组件 import ElDescription from '@/components/ElDescription' import ElDescriptionItem from '@/components/ElDescriptionItem' export default { // 申明组件 components: {ElDescription, ElDescriptionItem} }
-
组件应用
<!-- 能够应用 span 和 span-map 对象来管制栅格的大小 --> <el-description title="测试数据"> <el-description-item label="题目 1" value="我是内容 1" :span-map="{xl:8}" /> <el-description-item label="题目 2" value="我是内容 2" :span="6" /> <el-description-item label="题目 3" value="超长文本省略号显示,超长文本省略号显示,超长文本省略号显示,超长文本省略号显示,超长文本省略号显示," /> <el-description-item label="题目 4" value="我是内容 4" :span="8" :span-map="{md:12}" /> <el-description-item label="题目 5" value="我是内容 5" /> <el-description-item label="题目 6" value="我是内容 6" /> <el-description-item label="题目 7" value="我是内容 7" /> <el-description-item label="题目 8" value="我是内容 8" /> <el-description-item label="定制"> <!-- 应用名称为 conent 的 slot 来定制 --> <template slot="content"> <div style="color: red;"> 我是定制内容 </div> </template> </el-description-item> </el-description>
- 显示成果
正文完