从0到1封装一个好看的panel组件

302 阅读3分钟

hello,大家好,我是Golf,前端一枚,喜欢探究一些代码原理。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

前言

在项目开发过程中,页面上经常会有各种各样的内容块需要容器包裹展示,这些容器由标题和内容组成,俗称面板,好看统一的面板会给人一种整齐标准的感觉,会让一个系统看起来更专业,本文将从前端小白的视角,带你从0到1封装一个好看的 panel 组件。

组件开发

项目需求

前端小白正在电脑前愉快的摸鱼,突然产品经理丢过来几个项目页面截图,对小白说:为什么你们开发的页面里的面板长得都不一样,间距不统一,圆角不统一,颜色也不一样,看起来都不像一个专业的项目。小白答曰:这些页面都不是一个人画的,当然不一样了。那有什么办法能统一呢?产品经理追问道。小白回答:那只能封装一个组件了。

基础版本

于是小白快速的敲击着键盘,很快就写好了一个panel组件,只有两个最基本的功能。

  • 标题文字通过属性传递
  • 内容通过插槽分发
组件代码
<template>
  <div class="gf-panel">
    <div class="gf-panel__header">
        <div class="gf-panel__title">{{ title }}</div>
      </div>
    </div>
    <div class="gf-panel__body">
      <!-- slot -->
      <slot></slot>
    </div>
  </div>
</template>
<script>
export default {
  name: "gf-panel",
  props: {
    title: {
      type: String,
      default: "",
    },
  },
};
</script>
<style lang="scss">
.gf-panel {
  border: 1px solid #ddd;
  border-radius: 4px;
  background-color: #fff;
  margin-bottom: 15px;
  position: relative;
  box-sizing: border-box;
  .gf-panel__header {
    color: #333;
    height: 40px;
    padding: 0 15px;
    border-top-left-radius: 4px;
    border-top-right-radius: 4px;
    background-color: #f5f5f5;
    border-bottom: 1px solid #ddd;
    .gf-panel__title {
      font-size: 15px;
      font-weight: 600;
    }
  }
  .gf-panel__body {
    padding: 10px 15px;
    min-height: 40px;
    border-bottom-left-radius: 4px;
    border-bottom-right-radius: 4px;
  }
}
</style>

组件使用
<template>
  <gf-panel title="这是标题">
      <div>这是一段信息</div>
    </gf-panel>
</template>

效果图如下 p01.jpg

小白把项目里的面板都替换成了这个组件,整个页面看起来都很统一,整洁。于是小白得意的把效果图发给了产品经理。

需求变化

不一会儿,产品经理就对小白说:你这个组件目前能满足使用,但是我后续考虑对面板加一些功能,你这个组件能实现吗?

  • 标题区域想放置一些图标或是说明文字
  • 内容区域内容比较多,希望有一个展开收起按钮
  • 你这个面板怎么只有灰色,有没有其他颜色
  • 标题和内容之间的分割线可以去掉吗
  • 这个边框看着好多余,能不要边框吗

进阶版本

针对产品经理提出的需求,小白不禁陷入了沉思,于是重新设计,指尖对着键盘一顿狂飙,加入了一些新的功能。

  • 增加了标题插槽 p02.jpg
  • 增加了属性 - 是否可展开收起 p05.jpg
  • 增加了属性 - 默认是否收起 p06.jpg
  • 增加了属性 - 类型 p03.jpg
  • 增加了属性 - 是否显示分割线 p04.jpg
  • 增加了属性 - 是否无边框 p07.jpg

做完这些,小白发现这个组件已经能满足大多数业务场景了,通过参数的传递可以变化出各种不同效果的面板,产品经理看完也给小白竖起了大拇指,小白开心极了,心里想着又可以愉快的摸鱼了。

思考

当前这个panel组件对于常见的业务场景是可以满足使用的,但是如果产品经理有一些新奇的需求,可能就需要扩展功能或是重新设计了。下面是我列出的一些可以扩展的功能,有兴趣的同学可以自行封装实现。

  • 标题外置
  • 无标题
  • 边框直角
  • 自定义颜色
  • 自定义内边距
  • 更多按钮插槽
  • 展开收起事件

完整代码

完整代码请参考这个仓库,欢迎大家star。

我是Golf,前端一枚,喜欢探究一些代码原理,希望大家点赞支持。