这里是一段我们公司过往项目的代码(增删改查项目中的查询/重置按钮)

<el-button @click="query()" type="primary" size="mini">
<i class="el-icon-search">查询</i>
</el-button>
<el-button @click="resetQueryForm" type="default" size="mini">
<i class="el-icon-refresh-left">重置</i>
</el-button>

看一下这么写的几个弊端(当然代码时没问题的)

  1. type=primary/type=default 按钮的样式全局调整时非常不便
  2. size=mini每次都要写, 如果不是复制粘贴的话容易忘
  3. 查询重置按钮文字, 如查询的平替"检索/搜索", 每个项目要求不同, 全局调整也不方便
  4. 图标, el-button上有icon属性, 两者写法稍有差异(icon prop中间会有个默认空格, 例如上方没有手动空格的话, 图标和文字是在一起的)
  5. 图标更换不易, 全局替换可行性也不高(项目大了图标满处都在用)
  6. type=primary, size=mini这种字符串格式参数, 出了拼写错误很难静态排查

基于上述问题, 有以下几个组件(其实基本上都一样)

效果

用法

文字/图标/样式统一

特殊功能:

  1. 批量删除click事件触发前会自动二次确认
  2. import的click事件会带文件(示例代码全局仅支持Excel导入)
  3. 驳回会自动带审批意见(没封)
<ly-btn-search @click="todo"/>
<ly-btn-reset @click="todo"/>
<ly-btn-create @click="todo"/>
<ly-btn-remove @click="todo"/>
<ly-btn-export @click="todo"/>
<ly-btn-import @click="todo"/>

代码

mixin

所有按钮支持禁用和loading状态(虽然大部分按钮用不到)

export const FormButtonMixin = {
props: {
/**
* 禁用状态
*/
disabled: {
type: [Boolean, Object, String, Number]
},
/**
* 加载状态
*/
loading: Boolean
}
}

LyBtnSearch 检索

<template>
<el-button
:disabled="disabled"
:loading="loading"
icon="el-icon-search"
size="small"
type="primary"
@click="$emit('click')"
>
<slot>检索</slot>
</el-button>
</template> <script>
import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnSearch',
mixins: [FormButtonMixin]
}
</script>

LyBtnReset 重置

<template>
<el-button
icon="el-icon-refresh-left"
size="small"
type="default"
@click="$emit('click')"
>
<slot>重置</slot>
</el-button>
</template> <script>
import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnReset',
mixins: [FormButtonMixin]
}
</script>

LyBtnCreate 新增

<template>
<el-button
class="ly-form-button"
:loading="loading"
:disabled="disabled"
icon="el-icon-plus"
type="primary"
size="small"
@click="$emit('click')"
>
<slot>添加</slot>
</el-button>
</template> <script> import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnCreate',
mixins: [FormButtonMixin]
}
</script>

LyBtnRemove (批量)删除

<template>
<el-button
class="ly-form-button"
:loading="loading"
:disabled="disabled"
icon="el-icon-delete"
type="danger"
size="small"
@click="handleClick"
>
<slot>批量删除</slot>
</el-button>
</template> <script> import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnRemove',
mixins: [FormButtonMixin],
props: {
/**
* 为true时, 删除操作不需要二次确认
*/
unimportant: Boolean,
/**
* 提示内容示例:
* ())=>`确认要删除${xxx}吗`
*/
tip: {
type: [String, Function],
default: '确认删除选中内容吗?'
}
},
methods: {
handleClick() {
if (this.unimportant) {
return this.$emit('click')
}
let tip = this.tip
if (typeof tip === 'function') {
tip = tip()
}
this.$confirm(tip, '提示', { type: 'warning' }).then(_ => this.$emit('click'))
}
}
}
</script>

LyBtnImport 导入

<template>
<el-button
:disabled="disabled"
:loading="loading"
icon="el-icon-upload2"
size="small"
type="primary"
@click="handleClick"
>
<input
ref="fileRef"
style="display: none"
type="file"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
@change="handleFileChange"
>
<slot>导入</slot>
</el-button>
</template> <script>
import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnImport',
mixins: [FormButtonMixin],
methods: {
/**
* 文件变更
* @param {Event} e
*/
handleFileChange(e) {
/**
* @type {HTMLInputElement}
*/
const target = e.target
const file = target.files[target.files.length - 1]
this.$emit('change', file)
},
handleClick() {
this.$refs.fileRef.dispatchEvent(new MouseEvent('click'))
}
}
}
</script>

LyBtnExport 导出

<template>
<el-button
:disabled="disabled"
:loading="loading"
icon="el-icon-download"
size="small"
type="primary"
@click="$emit('click')"
>
<slot>导出</slot>
</el-button>
</template> <script>
import { FormButtonMixin } from './mixins/form-button-mixin' export default {
name: 'LyBtnExport',
mixins: [FormButtonMixin]
}
</script>

vue2 element-ui组件二封-表单组件-按钮封装的更多相关文章

  1. vue v-model 与 组件化的表单组件如何沟通

    参考mint-ui的代码: https://github.com/ElemeFE/mint-ui/blob/master/packages/radio/src/radio.vue https://gi ...

  2. (Element UI 组件 Table)去除单元格底部的横线

    Element UI 组件 Table 有一个属性 border,添加它可以增加纵向边框,但是无法控制横线边框,因此即使是最简单的 el-table,也会包含一个底部横线. 这个底部横线其实是一个 b ...

  3. Element Ui使用技巧——Form表单的校验规则rules详细说明

    Element UI中对Form表单验证的使用介绍: Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item的 prop 属性设置为需校验的字段名 ...

  4. element ui组件的开始时间-结束时间验证

    <el-date-picker v-model="seach.before" type="date" placeholder="开始时间&quo ...

  5. 使用iview 的表单组件验证 Upload 组件

    使用iview 的表单组件验证 Upload 组件 结果: 点击提交按钮, 没有填的form 项, 提示错误, 当填入数据后提示验证成功 代码: <template> <div id ...

  6. 文档驱动 —— 表单组件(五):基于Ant Design Vue 的表单控件的demo,再也不需要写代码了。

    源码 https://github.com/naturefwvue/nf-vue3-ant 特点 只需要更改meta,既可以切换表单 可以统一修改样式,统一升级,以最小的代价,应对UI的升级.切换,应 ...

  7. 通过html()的方法获取文本内容, form表单组件显示的值与获取到的值不一致的问题

    我在通过 html()获取对应节点的内容,发现一个问题,获取到的 form表单组件的内容值是初始加载的值,而不是经过用户修改后的值.例如页面加载时组件<input type="text ...

  8. reactjs入门到实战(八)----表单组件的使用

    表单组件支持几个受用户交互影响的属性: value,用于 <input>.<textarea> 组件. checked,用于类型为 checkbox 或者 radio 的 &l ...

  9. 第31讲 UI组件之 Gallery画廊控件

    第31讲 UI组件之 Gallery画廊控件 1.Gallery的简介 Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息.Gallery只 ...

  10. ReactJS实用技巧(2):从新人大坑——表单组件来看State

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

随机推荐

  1. vue开发大屏项目屏幕适配问题解决方案

    1.新建自定义指令文件如下: 2.文件中插入一下代码: import { App, Directive, DirectiveBinding, nextTick } from 'vue' import ...

  2. 爬取精美壁纸5w张,爱了爱了

    近日接到一个需求--爬取某应用商店所有在线销售壁纸,这个任务起初让我惊呆了.因为上级没有给我解决风控问题,若爬取在售资源被人家厂商追责怎么办?若造成人家服务器出问题怎么办?问的时候上级含糊其辞,唉!其 ...

  3. PostgresSql更改字段位置后,数据库异常

    SQL server的studio有一个功能,可以随意拖拽表字段,更改其位置并使之重新排序,有同事问起,Postgres是否也可以.Postgres每个字段的顺序是在系统表pg_attribute里面 ...

  4. 一次k8s docker下.net程序的异常行为dump诊断

    背景 昨天,一位朋友找到我寻求帮助.他的项目需要调用一个第三方项目的webAPI.这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从 ...

  5. SAP SMARTFORMS World格式白屏

    解决方法: SE38 RSCPSETEDITOR 不勾选SAP script 和智能表

  6. 问题记录——nginx加载lua 模块,启动报错找不到 libluajit-5.1.so.2

    环境:SUSE 12 SP3 问题说明:根据工作需求,重新编译nginx加载 lua 模块后启动报错如下: 首先是尝试在 /etc/profile 配置文件中添加环境变量并 source /etc/p ...

  7. loj2839

    除了 L 神 txdy 我还能说啥呢.(L 神把这题搬模拟赛了...) 即把每个 x 换成 ( 或 ),问是否能通过不多于一次区间反转(( 与 ) 交换)后合法. 考虑怎样的括号串是合法的. 假设左括 ...

  8. Linux常用命令 转于WoW_Boom

    一.常用命令 1.进入到用户根目录cd ~ 或 cd 2.查看当前所在目录pwd 3.进入到itcast用户根目录cd ~itcast 4.返回到原来目录cd - 5.返回到上一级目录cd .. 6. ...

  9. user-agent反反爬

    title: user-agent反反爬 author: 杨晓东 permalink: user-agent反反爬 date: 2021-10-02 11:27:04 categories: - 投篮 ...

  10. AWK nr nf

    https://blog.csdn.net/sh13661847134/article/details/118018456 awk中NF,NR的含义awk中NF和NR的意义,其实你已经知道NF和NR的 ...