草庐IT

浅谈组件二封-vue

凉云 2023-03-28 原文

本文仅仅针对vue系列做探讨, 项目倾向于大量增删改查的后台管理项目

组件二封不是换一种写法

大量帖子的组件二封都是用json, 然后将prop/emit/slot通过一种json配置来完成.

不是说这种写法绝对不好, 毕竟还真有这种场景, 比如动态表单.

但是, 一般理性而论, 失去了IDE的代码提示, 失去了eslint的规范检查, 不够灵活且不方便调试.

顺带一提, 还有this指向问题.

封装的意义在于更好的维护, 而不是为了封装而封装

组件二封应当具备哪些条件

  1. 团队人员稳定

    二封组件过多, 相当于每个人都要花时间了解二封的内容, 人员流动大, 二封可能会得不偿失

  2. 团队有一定的样式规范

    通往罗马的路不止一条, 规范的作用是只走一条, 比如说我们有如下要求:

    • 检索按钮应当在检索条件下另起一行, 并置于右侧
    • 所有table应当具有斑马条纹和border
    • select下拉组件应当和input组件等宽
    • 分页默认10, 可选10/20/50, 居右, 变量名: pageSize(大小)/pageNum(页码)

    上述规范仅举例, 未必合理. 拥有类似这样的规范, 才是二封的前提

  3. 团队有一定的编码规范

    如上述样式规范, 如果没有编码规范, 每个规范实现方式都千奇百怪

    那么根据上述, 我们有如下对应的编码规范

    • 检索条件另起一行功能应当用el-row+"text-align: right"实现, 而不是float实现
    • table的斑马条纹应当用ElTable的stripe和border属性实现, 禁止自己写css样式
    • select下拉组件与input等宽, 应当由全局样式处理, 而非每个select组件上添加样式
    • 分页可选参数去某个地方读取配置, 使用float固定居右
  4. 团队技术领导人具有一定能力

    多了不说, vue2的话, mixin, 生命周期, 自定义指令, provide/inject, 这些官方指南上介绍的功能都应该熟悉, 还要熟悉vue的官方风格指南

    vue3的话, 二封最好ts, 熟悉ts, 异步组件, 单文件组件, 自定义指令, 熟悉官方风格指南

    我觉得这些就够了, 差一点也没关系, 二封没那么难. 全都是在调用原有组件的api而已

    PS: 并不是说只会这些就够了

  5. 公司层面的支持

    好的封装, 不论是二封, 工具类, 规范设计, 对于小公司来说都是很大的开销, 如果公司没这个打算, 还是自己捣鼓着玩吧. 就像某boss的言论: "我觉得代码写的太好或太差都不行, 别人看不懂, 还不如没写". 这种情况下就需要审时度势了

我认为的二封应当有哪些作用

  1. 实现团队中90%以上的功能全部使用二封组件
  2. 过滤掉原有组件中不推荐使用的prop/methods(expose)/slot
  3. 样式处理, 如检索条件的布局, 列表的布局, 常规表单的布局等等等等
  4. 自动的格式转换, 如日期格式应当仅使用字符串格式, 以下是几个组件常见日期格式, 几乎每次传给后端都需要自己处理一下, 很是麻烦:
    • element-ui: Date/Date[]
    • element-plus: Date/number/string/any[]
    • antd vue 1.x: moment
    • antd vue 2.x: dayjs
  5. 功能拓展, 列举一下我见到的一些需求, 有些功能是部分场景有的, 有些则是全部场景都要的, 全部场景都要, 就要尽量禁止开发人员关闭此功能
    • table列支持拖拽调整列宽
    • table支持自定义列
    • 日期选择器支持快速选择, 输入时支持中文冒号
    • 数字输入时, 自动提示大写, 如"一万两千三百四十二"
    • 图片/视频/文档预览功能(这种需求就千奇百怪了)
    • 所有弹窗支持可拖拽
  6. 功能屏蔽, 列举一下我见过的客户不要的, 组件默认启用的功能:
    • 数字输入框, 屏蔽+/-号和控制按钮
    • 弹窗干掉右上角的x号
    • 弹窗不允许点击空白处关闭
  7. 灵活性, 业务人员只需要关心"有没有", 而不需要关心样式
    • 如检索表单, 查询/重置按钮位置
    • 如表格支持自定义列
    • 如弹窗的可拖拽, 亦无需业务人员处理
    • 如按钮封装, 业务人员无需关心使用什么按钮图标, 按钮里面应当是什么文字

二封的好处

先来一个列表页demo来看看效果(Vue2)

<template>
  <div>
    <ly-form :loading="loading" search-form @reset="handleReset" @search="handleSearch">
      <ly-input label="客户姓名" v-model="searchForm.title"/>
      <ly-input label="客户手机号" v-model="searchForm.title"/>
      <template #append-buttons>
        <ly-btn-create @click="$refs.edit.init()"/>
      </template>
    </ly-form>
    <ly-table :data="tableData" :loading="loading" :paging="paging" @paging="handleSearch">
      <ly-table-index/>
      <ly-table-column label="客户姓名" prop="name"/>
      <ly-table-column label="客户类别" dict-code="sys_xxx_type" prop="type" width="120"/>
      <ly-table-column label="客户消费额" prop="consumption" sortable width="100"/>
      <ly-table-column label="客户活跃度" prop="loginDays" sortable width="100"/>
      <ly-table-action width="330">
        <template #default="{row}">
          <ly-action-detail @click="$router.push({name: 'CustomerDetail', query: {id: row.id}})"/>
          <ly-action-modify @click="$refs.edit.init(row)"/>
          <ly-action-remove @click="handleRemove(row.id)"/>
        </template>
      </ly-table-action>
    </ly-table>
    <customer-edit ref="edit" @ok="handleSearch"/>
  </div>
</template>

<script>
import LySearchMixin from '@/mixins/ly-search-mixin'
import {customerService} from '@/api/biz/xxx'
import CustomerEdit from '@/views/biz/dataset-manage/component/dataset-edit'

export default {
  name: 'CustomerManage',
  components: {CustomerEdit},
  mixins: [LySearchMixin],
  data: () => ({
    api: {search: customerService.search, remove: customerService.remove}
  })
}
</script>

来让我们梳理一下这段代码的封装内容:

有关浅谈组件二封-vue的更多相关文章

  1. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  2. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  3. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  4. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  5. vue3.0 + vite2.0+如何兼容低版本浏览器 - 2

    这里写自定义目录标题一、问题二、解决三、解决方案四、打包预览一、问题在使用vue3.2和vite2开发一个移动端或者钉钉端H5微服务iosapp内置浏览器打开没问题安卓app内置浏览器打开空白页面vconsole打印出现报错globalthisundefind二、解决内置浏览器版本比较低打印出来是63vue3代码不兼容低版本浏览器三、解决方案步骤一:vite.config.ts里build.target配置项指定构建目标为es2015或者步骤二:安装@vitejs/plugin-legacy安装完报错也还在指定版本可以解决“@vitejs/plugin-legacy”:“1.8.0”,步骤三:

  6. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  7. Vue3的新特性 - 2

    Vue3的新特性包括:CompositionAPI:一种新的API风格,可将有关组件功能的代码逻辑封装在单独的函数中,从而更好地管理和重用代码。Teleport:可以让组件在DOM层次结构中的任何位置渲染。Suspense:一种新的异步渲染模式,可以优化应用程序的性能。更快的渲染速度:Vue3使用了新的虚拟DOM算法,并且对渲染过程进行了优化,因此在渲染大型应用时性能更高。更小的包大小:Vue3的打包大小比Vue2更小,因为它不再需要依赖像vue-template-compiler这样的工具。其他改进:Vue3还具有其他一些改进,例如更好的TypeScript支持、更好的错误提示和更好的调试工

  8. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

  9. ruby - 如何使用( ruby ) Rack 中间件组件设置 cookie? - 2

    我正在为需要有条件地设置cookie的Rails应用编写Rack中间件组件。我目前正在尝试设置cookie。通过谷歌搜索,这似乎应该可行:classRackAppdefinitialize(app)@app=appenddefcall(env)@status,@headers,@response=@app.call(env)@response.set_cookie("foo",{:value=>"bar",:path=>"/",:expires=>Time.now+24*60*60})[@status,@headers,@response]endend它不会给出错误,但也不会设置coo

  10. ruby-on-rails - 哪些组件使 VIM 成为一个好的(伟大的)ruby 编辑器? - 2

    我正在linux机器上学习rubyonrails并磨练我的VIM技能(skillz?)。当我在使用C++的时候开始使用VIM时,我有一个friend有一个很棒的vimfiles文件夹,里面有很多东西可以开始使用。从头开始,vim很棒,但感觉它还可以做得更好。我目前有:vim-rubybufferexplorerxml-edit(虽然我目前没有它可以处理erb文件)我知道这只是一些更有经验的vim/ruby开发人员所拥有的东西的皮毛(包括vim.rc文件中的一次性)。在某个地方是否有一个列表(或者我们可以创建一个)使ruby​​(和rails)编程更有趣所需的一堆标准vim配置?是否有一

随机推荐