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>
效果图如下
小白把项目里的面板都替换成了这个组件,整个页面看起来都很统一,整洁。于是小白得意的把效果图发给了产品经理。
需求变化
不一会儿,产品经理就对小白说:你这个组件目前能满足使用,但是我后续考虑对面板加一些功能,你这个组件能实现吗?
- 标题区域想放置一些图标或是说明文字
- 内容区域内容比较多,希望有一个展开收起按钮
- 你这个面板怎么只有灰色,有没有其他颜色
- 标题和内容之间的分割线可以去掉吗
- 这个边框看着好多余,能不要边框吗
进阶版本
针对产品经理提出的需求,小白不禁陷入了沉思,于是重新设计,指尖对着键盘一顿狂飙,加入了一些新的功能。
- 增加了标题插槽
- 增加了属性 - 是否可展开收起
- 增加了属性 - 默认是否收起
- 增加了属性 - 类型
- 增加了属性 - 是否显示分割线
- 增加了属性 - 是否无边框
做完这些,小白发现这个组件已经能满足大多数业务场景了,通过参数的传递可以变化出各种不同效果的面板,产品经理看完也给小白竖起了大拇指,小白开心极了,心里想着又可以愉快的摸鱼了。
思考
当前这个panel组件对于常见的业务场景是可以满足使用的,但是如果产品经理有一些新奇的需求,可能就需要扩展功能或是重新设计了。下面是我列出的一些可以扩展的功能,有兴趣的同学可以自行封装实现。
- 标题外置
- 无标题
- 边框直角
- 自定义颜色
- 自定义内边距
- 更多按钮插槽
- 展开收起事件
完整代码
完整代码请参考这个仓库,欢迎大家star。
我是Golf,前端一枚,喜欢探究一些代码原理,希望大家点赞支持。