• vue2+element 通用表格组件封装


    vue3的通用表格我也封装了,是下面链接喔~ 

    TS + vue3.2 + vite2 + element-plus 通用表格组件封装

    1、父组件调用方式:

    1. show-index
    2. show-check-box
    3. :loading="loading"
    4. :table-label="tableHeaderData"
    5. :data="tableData"
    6. :option="tableOptionsData"
    7. @operation="operationHandler"
    8. @handle-selection-change="handleSelectionChange"
    9. >
    10. <template slot="expand" slot-scope="{ row }">
    11. <making-status v-if="row.status === 1" :list="row.processList || []" />
    12. <div v-else class="making-status-none">
    13. <span>未制作span>
    14. div>
    15. template>

    2、参数详解: 

    其实我定义的参数还蛮多的,基本能够把常用的功能包含进去了,我着重讲几个:

    1、tableLabel:表格头部标题

    有以下四个参数,最重要的是render,他的参数是从slot-scope抛出,可以进行判断显示

    1. {
    2. label: '制作格式',
    3. prop: 'handleType',
    4. width: 150,
    5. render(row) {
    6. return `${row.handleType === 1 ? '查题格式' : (row.handleType === 2 ? '拍题格式' : '未设置')}`
    7. }
    8. }

    2、showCheckBox: 显示复选框

    与之对应的回调函数是 @handle-selection-change,我们可以从中取得当前选中的复选框数组

    3、showExpand: 拓展插槽

    在 slot="expand" 即可以使用

    4、showIndex: 是否展示序号

    这里序号不是你自己的自定义id喔~是当前数组索引值 + 1

    5、option: 配置需要显示的操作菜单

    1. {
    2. label: '操作',
    3. width: '300',
    4. fixed: 'right',
    5. children: [
    6. {
    7. label: '查看制作详情',
    8. icon: 'el-icon-view',
    9. methods: 'view',
    10. permission: 'xxx',
    11. render(row) {
    12. return row.status !== 0
    13. }
    14. },
    15. {
    16. type: 'drop',
    17. icon: 'el-icon-paperclip',
    18. permission: 'xxx',
    19. children: [
    20. {
    21. label: '切题查看模式',
    22. methods: '1'
    23. },
    24. {
    25. label: '编题查看模式',
    26. methods: '2'
    27. }
    28. ]
    29. }
    30. ]
    31. }

    我们主要看children里的,主要参数有4个

    label: 显示名字

    icon: 显示图标

    permission: 即v-permission,根据按钮是否有权限再进行展示,可为字符也可为数组,这种自定义指令我就不单独写出来了,可以参考我博客,链接如下

    vue学习(6)自定义指令详解及常见自定义指令,里面有个checkPermission函数,所有判断你皆可自行定义

    type: 为drop 则相当于 el-dropdown,把很多按钮收缩在一起

    1. render: 这个和上面tableLabel不一样的是,这里render返回值为truefalse来决定v-show的值(只在type不为drop生效)
    2. methods: 点击后回调触发的方法,由 @operation={row, type} 抛出,type即为methods对应值(只在type不为drop生效)
    3. children: drop展示子数组(label和methods与上面一致)(在type为drop生效)

    3、组件源码 :

    1. <script>
    2. export default {
    3. props: {
    4. /**
    5. * 表格最高高度
    6. */
    7. maxHeight: {
    8. type: [String, Number],
    9. default: 'auto'
    10. },
    11. /**
    12. * 表格自定义属性展示
    13. */
    14. tableLabel: {
    15. type: Array,
    16. default: () => {
    17. return []
    18. }
    19. },
    20. /**
    21. * 表格数据源
    22. */
    23. data: {
    24. type: Array,
    25. default: () => {
    26. return []
    27. }
    28. },
    29. /**
    30. * 配置需要显示的操作菜单
    31. */
    32. option: {
    33. type: Object,
    34. default: () => {}
    35. },
    36. showCheckBox: {
    37. // 配置是否显示全选(复选框)
    38. type: Boolean,
    39. default: false
    40. },
    41. /**
    42. * 是否显示索引
    43. */
    44. showIndex: {
    45. type: Boolean,
    46. default: false
    47. },
    48. turnRadio: {
    49. type: Boolean,
    50. default: false
    51. },
    52. selectedIdArr: {
    53. type: Array,
    54. default: () => []
    55. },
    56. /**
    57. * 是否 隐藏文字过长
    58. */
    59. overflowText: {
    60. type: Boolean,
    61. default: false
    62. },
    63. /**
    64. * 加载提示
    65. */
    66. loading: {
    67. type: Boolean,
    68. default: false
    69. },
    70. /**
    71. * 是否保持之前复选框的数据
    72. */
    73. keep: {
    74. type: Boolean,
    75. default: false
    76. },
    77. /**
    78. * 动态绑定 key 值
    79. */
    80. keyId: {
    81. type: String,
    82. default: 'id'
    83. },
    84. /**
    85. * 行内自定义样式配置
    86. */
    87. rowStyle: {
    88. type: Object,
    89. default: () => {
    90. return {
    91. height: '40px'
    92. }
    93. }
    94. },
    95. /**
    96. * 是否展示展开按钮
    97. */
    98. showExpand: {
    99. type: Boolean,
    100. default: false
    101. }
    102. },
    103. data() {
    104. return {
    105. curPageCheck: [],
    106. radioId: '',
    107. showVertical: false
    108. }
    109. },
    110. watch: {
    111. data: {
    112. handler() {
    113. if (this.showCheckBox || this.turnRadio) {
    114. this.$nextTick(() => {
    115. this.$refs.commonTable.clearSelection()
    116. this.curPageCheck = []
    117. if (this.showCheckBox && this.turnRadio) {
    118. this.data.filter((item) => {
    119. if (item.id === this.selectedIdArr[0]) {
    120. this.$refs.commonTable.toggleRowSelection(item, true)
    121. }
    122. })
    123. } else if (this.showCheckBox) {
    124. this.data.filter((item) => {
    125. if (this.selectedIdArr.includes(item.id)) {
    126. this.$refs.commonTable.toggleRowSelection(item, true)
    127. this.curPageCheck.push(item.id)
    128. }
    129. })
    130. }
    131. })
    132. }
    133. },
    134. deep: true,
    135. immediate: true
    136. },
    137. selectedIdArr: {
    138. handler(val) {
    139. if (this.showCheckBox || this.turnRadio) {
    140. this.$nextTick(() => {
    141. this.$refs.commonTable.clearSelection()
    142. this.curPageCheck = []
    143. if (this.showCheckBox && this.turnRadio) {
    144. this.data.filter((item) => {
    145. if (item.id === val[0]) {
    146. this.$refs.commonTable.toggleRowSelection(item, true)
    147. }
    148. })
    149. } else if (this.showCheckBox) {
    150. this.data.filter((item) => {
    151. if (val.includes(item.id)) {
    152. this.$refs.commonTable.toggleRowSelection(item, true)
    153. this.curPageCheck.push(item.id)
    154. }
    155. })
    156. }
    157. })
    158. }
    159. },
    160. deep: true,
    161. immediate: true
    162. }
    163. },
    164. methods: {
    165. /**
    166. * prop 单值 或者 数组过滤(此处为针对时间组,不作为通用处理)
    167. */
    168. propFilter(prop, row) {
    169. const res = prop.reduce((total, cur) => {
    170. if (row[cur]) {
    171. return (total += row[cur] + '~')
    172. } else {
    173. return ''
    174. }
    175. }, '')
    176. return res ? res.replace(/~$/, '') : ''
    177. },
    178. handleTableButton(row, type) {
    179. this.$emit('operation', row, type);
    180. },
    181. /**
    182. * 后续扩展位
    183. * @param {*} methods
    184. * @param {*} row
    185. */
    186. handleClickon(methods, row) {
    187. this.$emit(methods, { methods, row })
    188. },
    189. handleSelectionChange(val) {
    190. if (this.showCheckBox && this.turnRadio) {
    191. // 选择项大于1时
    192. if (val.length > 1) {
    193. const del_row = val.shift()
    194. this.$refs.commonTable.toggleRowSelection(del_row, false)
    195. }
    196. }
    197. // 全选
    198. if (this.showCheckBox && this.selectedIdArr) {
    199. if (this.turnRadio) {
    200. this.$emit('handle-selection-change', val)
    201. } else {
    202. // 一般复选框都是走到这一步
    203. this.$emit('handle-selection-change', val)
    204. }
    205. } else {
    206. this.$emit('handle-selection-change', val)
    207. }
    208. },
    209. getRowKeys(row) {
    210. return row.id
    211. },
    212. selectAll(val) {
    213. if (this.showCheckBox && this.turnRadio) {
    214. // 选择项大于1时
    215. if (val.length > 1) {
    216. val.length = 1
    217. }
    218. }
    219. this.$emit('handle-selection-change', val)
    220. },
    221. // 斑马纹表格背景色
    222. tabRowClassName({ row, rowIndex }) {
    223. const index = rowIndex + 1
    224. if (index % 2 === 0) {
    225. return 'even-row'
    226. } else {
    227. return 'odd-row'
    228. }
    229. },
    230. cellClassName({ row, column, rowIndex, columnIndex }) {
    231. if (row.confirmTag === 2 && columnIndex < this.tableLabel.length) {
    232. return 'height_light_cell'
    233. } else {
    234. return ''
    235. }
    236. },
    237. buttonDisabled(item, row) {
    238. if (typeof item.disabled === 'function') return item.disabled(row) || false
    239. if (!item.disabled) return item.disabled
    240. },
    241. /**
    242. * 单选框选中事件
    243. */
    244. rowClick(row) {
    245. this.$emit('rowClick', row)
    246. }
    247. }
    248. }
    249. script>
    250. <style lang="scss" scoped>
    251. ::v-deep .el-table__header,
    252. ::v-deep .el-table__body {
    253. margin: 0;
    254. }
    255. ::v-deep .el-table::before {
    256. height: 0;
    257. }
    258. ::v-deep .el-button {
    259. padding: 0;
    260. border: none;
    261. margin: 0 4px;
    262. padding: 0 4px 0 8px;
    263. border-left: 1px solid #e2e2e2;
    264. font-size: 14px;
    265. min-height: 14px;
    266. &:first-child {
    267. border-left: none;
    268. }
    269. }
    270. ::v-deep .el-button + .el-button {
    271. margin-left: 0;
    272. }
    273. ::v-deep .btn-right div {
    274. margin-right: 5px;
    275. }
    276. .btn-right div:empty {
    277. margin-right: 0px;
    278. }
    279. //斑马纹表格背景色
    280. ::v-deep .el-table .even-row {
    281. --el-table-tr-background-color: #f5fafb;
    282. }
    283. ::v-deep .el-table .odd-row {
    284. --el-table-tr-background-color: #ffffff;
    285. }
    286. .el-table--border::after,
    287. .el-table--group::after {
    288. width: 0;
    289. }
    290. ::v-deep .el-table__fixed-right::before,
    291. .el-table__fixed::before {
    292. background-color: transparent;
    293. }
    294. ::v-deep .custom-table-header {
    295. th {
    296. background-color: #fff4d9 !important;
    297. }
    298. }
    299. .progress-line {
    300. .el-progress-bar__outer {
    301. height: 16px !important;
    302. }
    303. .el-progress-bar__outer,
    304. .el-progress-bar__inner {
    305. border-radius: 0 !important;
    306. }
    307. }
    308. .text-no-wrap {
    309. cursor: pointer;
    310. display: inline;
    311. }
    312. ::v-deep .el-table {
    313. td.el-table__cell div,
    314. th.el-table__cell > .cell {
    315. font-size: 14px;
    316. }
    317. th.el-table__cell > .cell {
    318. font-weight: normal;
    319. }
    320. .cell {
    321. padding: 0 10px;
    322. line-height: 39px;
    323. }
    324. .el-table__header-wrapper .checkBoxRadio .el-checkbox {
    325. display: none;
    326. }
    327. .el-checkbox {
    328. display: flex;
    329. align-items: center;
    330. justify-content: center;
    331. }
    332. .table-img {
    333. width: 60px;
    334. height: 60px;
    335. object-fit: cover;
    336. padding: 6px 0;
    337. display: flex;
    338. align-items: center;
    339. margin: 0 auto;
    340. justify-content: center;
    341. }
    342. }
    343. ::v-deep .el-table--small .el-table__cell {
    344. padding: 0;
    345. }
    346. ::v-deep .el-dropdown-menu__item {
    347. padding: 5px 10px !important;
    348. .el-button {
    349. width: 100%;
    350. text-align: center;
    351. padding: 0 8px;
    352. margin: 0;
    353. }
    354. }
    355. .flex-box{
    356. display: flex;
    357. flex-flow: row nowrap;
    358. justify-content: flex-start;
    359. .item{
    360. margin: 0 10px;
    361. }
    362. }
    363. style>

  • 相关阅读:
    编程笔记 Golang基础 045 math包
    golang入门笔记——pprof性能分析
    整合Druid数据源
    IDEA中启动类是灰色,重启idea启动类自动消失解决方法
    手机浏览器哪家强,这3款口碑极佳的浏览器值得一用
    常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序
    windows系统服务管理命令sc
    7 张图解 CrashLoopBackOff,如何发现问题并解决它?
    Web API—移动端端网页特效
    齐次坐标(Homogeneous Coordinate)介绍
  • 原文地址:https://blog.csdn.net/qq_39404437/article/details/126927917