先看下面我的el-table二次封装相关代码。
index.vue
<el-table ref="table" v-loading="searching" :data="pagedData" :border="border" stripe highlight-current-row v-bind="$attrs" v-on="$listeners" @selection-change="handleSelectionChange"> <template v-for="(item, index) in columnList"> <el-table-column v-if="item.slotScope" :key="item.prop + index" v-bind="item" :label="$t(item.label)" > <template slot-scope="scope"> <slot :name="item.prop" v-bind="scope" > {{ "-" }} </slot> </template> </el-table-column> <el-table-column v-else-if="item.selection" :key="`selection${index}`" type="selection" :width="item.width || 50" :align="item.align || 'center'" /> <column v-else :key="item.prop + index" :column="item" /> </template></el-table>
column.vue
<template> <el-table-column center v-bind="column" v-on="$listeners" :label="$t(column.label)" > <!-- <template slot="header" slot-scope="scope" > <render v-if="column.renderHeader" :scope="scope" :render="column.renderHeader" /> <span v-else>{{ scope.column.label }}</span> </template> --> <template slot-scope="scope"> <render v-if="column.render" :scope="scope" :render="column.render" /> <!-- 嵌套表格 --> <template v-else-if="column.children"> <column v-for="col in column.children" :key="col.prop" :column="col" /> </template> </template> </el-table-column></template>
然后在页面中使用:
<EleTable id="eleTable" ref="eleTable" :row-key="getRowKeys" :column-list="columnList" :remote-method="getTableData" @page-change="handlePageChange" @sort-change="handleSortChange" @selection-change="handleSelectionChange"> <template v-slot:vip_state="{ row }"> <span>{{ filterVal('vip_state', row.vip_state) }}</span> </template> <template v-slot:appeal_type="{ row }"> <span>{{ filterCasVal('appeal_type',row.appeal_type) }}</span> </template> <template v-slot:priority="{ row }"> <span>{{ filterVal('priority',row.priority) }}</span> </template> <template v-slot:appeal_stage="{ row }"> <span>{{ filterVal('appeal_stage',row.appeal_stage) }}</span> </template> <template v-slot:maintain_mode="{ row }"> <span>{{ filterVal('maintain_mode',row.maintain_mode) }}</span> </template> <template v-slot:language="{ row }"> <span>{{ filterVal('lang',row.language) }}</span> </template> <template v-slot:comment_counter="{ row }"> <span>{{ filterComment(row.comment_counter) }}</span> </template> <template v-slot:task_id="{ row }"> <span>{{ row.task_id }}</span> <el-badge class="task-badge" :value="row.over_process ? $t('text_overtime') : ''"> </el-badge> </template></EleTable>
但是这样使用中间会有很多插槽,而且插槽内还有一些过滤方法,感觉封装还是没有减少代码量,一时不知道该如何解决这种情况,希望大家帮我出出主意。
既然这样的情况你封装 table
组件的目的是什么呢呢。
不应该传入一个 columns
属性,让你封装的 table
组件按照你传入的表头生成列和自定义 render
方法吗。可以借鉴 AntD Vue
的 Table
组件的实现 Table - Ant Design Vue
<el-table :data="data" :height="height" :stripe="stripe" :row-key="rowKey" :tree-props="{children: 'child', hasChildren: 'hasChildren'}" @selection-change="handleSelectionChange"> <!--自定义空行--> <empty-view slot="empty-text" text="暂无数据" /> <!--判断是否开启多选--> <el-table-column v-if="isSelection" type="selection" align="right" width="60px" :selectable='selectEnable' /> <el-table-column v-if="isExpend" type="expand" align="left" width="60px"> <template v-slot:default="scope"> <slot name="expend" :$index="scope.$index" :row="scope.row"></slot> </template> </el-table-column> <template v-for="column in columns"> <!--序号列--> <el-table-column v-if="column.type === 'index'" type="index" :label="column.title || '序号'" :align="column.align || 'left'" :width="column.width || '65px'" :index="column.tableIndex || tableIndex" /> <!--操作列--> <el-table-column v-else-if="column.type === 'action'" :label="column.title" :align="column.align || 'left'" :width="column.width || 180" :fixed="column.fixed || 'right'"> <template slot-scope="scope"> <template v-for="(action, actIdx) in column.actions"> <template v-if="actIdx < (column.maxNum || 2)"> <a :class="`action-btn ${action.class || ''}`" v-if="scope.row['btnShow'] || true" v-has="action.permission" @click="actionClick(scope.row, action.fun)">{{ action.title }}</a> </template> </template> <template v-if="column.actions.length >= (column.maxNum || 2)"> <el-dropdown trigger="click" class="action-more-line" @command="(command) =>{actionClick(scope.row,command)}"> <span class="el-dropdown-link"> 更多<i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <template v-for="(action, actIdx) in column.actions"> <template v-if="actIdx >= (column.maxNum || 2)"> <el-dropdown-item :command="action.fun">{{ action.title }}</el-dropdown-item> </template> </template> </el-dropdown-menu> </el-dropdown> </template> </template> </el-table-column> <!--多表头--> <el-table-column v-else-if="column.child && column.child.length > 0" :label="column.title" :align="column.align || 'left'"> <template v-for="col in column.child"> <el-table-column :label="col.title" :align="col.align || 'left'" :resizable="col.resize || false" :min-width="col.width" :fixed="col.fixed || false"> <template slot-scope="scope"> <slot v-if="col.slot" :name="col.prop" :row="scope.row" /> <span v-else :style="{color: ''}">{{ (scope.row[col.prop] || scope.row[col.prop] == 0) ? scope.row[col.prop] : '-' }}</span> </template> </el-table-column> </template> </el-table-column> <!--自定义列、常规列--> <el-table-column v-else :label="column.title" :align="column.align || 'left'" :resizable="column.resize || false" :min-width="column.width" :fixed="column.fixed || false"> <template slot-scope="scope"> <slot v-if="column.slot" :name="column.prop" :row="scope.row" :$index="scope.$index" /> <span v-else-if="column.filter">{{scope.row[column.prop]|filterVal(column.arr)}}</span> <span v-else :style="{color: ''}">{{ (scope.row[column.prop] || scope.row[column.prop] == 0) ? scope.row[column.prop] : '-' }}</span> </template> </el-table-column> </template> </el-table>
你看看,我这个封装
上面是element组件的的基本用法 我想根据上面的用法自己写一个表格组件,也包含table组件和table-column组件两个组件, 请问我怎么在table组件的默认插槽里,把row传给插槽中的el-table-column组件 table组件部分: table-column组件部分:
#[item]="data"的item会有如下报错,大佬指点一下这里该怎么写? Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Readonly<{ notFoundContent: any; suffixIcon: any; itemIcon
现在需要修改el-table-column slot="header" 中的 el-checkbox控制状态,选择表头的el-checkbox其他行checkbox都选中/取消这个已实现,但是当取消选择所有selected时,表头selectAll取消/选中失败,代码如下。js能打印出selectAll状态已发生改变,那么就是视图没有更新。思考了很久,没有找到合适的解决办法,请大佬们看看问题出现在
各位大佬,请伸出援手帮小弟看个问题。 问题描述:我在el-tab-pane里使用table组件时,表格数据滚动效果和页脚的工具栏样式都出现了bug,在其他页面使用table组件不会出现这种情况,通过调试工具调了好久调不到理想情况。 index.vue、infoTable.vue table.vue 其他页面显示:正常效果,并且不会被开发者工具遮挡 滚动样式和工具栏样式丢失,调了之后还是没有调到正常
本文向大家介绍Android基于OkHttpUtils网络请求的二次封装,包括了Android基于OkHttpUtils网络请求的二次封装的使用技巧和注意事项,需要的朋友参考一下 OkHttpUtils网络请求为什么进行二次封装? 1、减少代码量 2、后期换网络处理框架方便 二次封装的实现原理 1、将网络请求提取在一个方法中 2、对里面的可变参数,可以通过参数传递过去,也可以提供一个set方法传递
本文向大家介绍详解vue slot插槽的使用方法,包括了详解vue slot插槽的使用方法的使用技巧和注意事项,需要的朋友参考一下 官方文档其实已经讲得很详细,我根据文档,把官方的小案例实现了一下,这样更直观 单个slot使用最简单,也是最常用的,当我们定义了一个子组件,父组件在使用的这个组件的时候,想在内部自定义一些初始化数据,这时候就可以用slot实现。 具名slot只是给slot加了name