美文网首页
自定义 elementUI 描述列表组件

自定义 elementUI 描述列表组件

作者: 大橙子Hi | 来源:发表于2021-02-25 10:15 被阅读0次

    原文地址:http://isee.xyz/a/60370591cfe9924ea139030d

    前言

    以前用 ant design vue,组件特别多。 里面有一个描述组件很好用(描述组件),后来切换到 element 发现没有这种组件,每次都需要自己编写。但是一个项目界面风格要统一,每次都复制代码很是麻烦,而且如果要改样式,那么就是一个炸弹呀,还不得累死。一咬牙,一跺脚,自己写一个吧。

    组件设计思路

    1. 使用父子组件嵌套实现,父组件为 el-description , 子组件为 el-description-item
    2. el-description-item 要保证默认显示 labelvalue ,而且还可以使用 slot 来定制内容
    3. 利用 vue$slot.content是否存在来实现子组件的内容定制,不存在则显示默认 value,存在则表示是定制内容
    4. 利用 el-rowel-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>
      
    • 显示效果

      description.jpg

    相关文章

      网友评论

          本文标题:自定义 elementUI 描述列表组件

          本文链接:https://www.haomeiwen.com/subject/fjuyfltx.html