170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
| <template>
 | ||
|   <el-row>
 | ||
|     <el-col class="m-b-10" :span="24">
 | ||
|       <el-table
 | ||
|         v-adaptive="{bottomOffset}"
 | ||
|         :data="list"
 | ||
|         :height="tableHeight"
 | ||
|         v-bind="$attrs"
 | ||
|         stripe
 | ||
|         :highlight-current-row="highlightCurrentRow"
 | ||
|         @selection-change="handleSelectionChange"
 | ||
|         @sort-change="sortByColumn"
 | ||
|         @select="handleSelect"
 | ||
|         @cell-dblclick="celldblclick"
 | ||
|       >
 | ||
|         <template v-for="(column, index) in columns">
 | ||
|           <slot name="front-slot" />
 | ||
|           <!-- 序号 -->
 | ||
|           <el-table-column v-if="column.type === 'selection'" :key="index" type="selection" width="55" />
 | ||
|           <!-- 复选框 -->
 | ||
|           <el-table-column v-else-if="column.type === 'index'" :key="index" type="index" width="50" />
 | ||
|           <!-- 具体内容 -->
 | ||
|           <el-table-column v-else :key="index" align="left" :label="column.label" :width="column.width" :min-width="column.minWidth" :show-overflow-tooltip="column.showOverflowTooltip || false" :sortable="column.sortable || false" :prop="column.prop">
 | ||
|             <template slot-scope="scope">
 | ||
|               <!-- 仅仅显示文字 -->
 | ||
|               <span v-if="!column.hidden"> <!-- 如果hidden为true的时候 那么当前格可以不显示,可以选择显示自定义的slot-->
 | ||
|                 <!-- 操作按钮 -->
 | ||
|                 <span v-if="column.type === 'operate'">
 | ||
|                   <!-- <a v-for="(operate, i) in column.operates" :key="i" href="javascript:void(0)" class="operate-button" @click="handleClick(operate, scope.row)">
 | ||
|                     {{ operate.name }}
 | ||
|                       
 | ||
|                   </a> -->
 | ||
|                   <span v-for="(operate, i) in column.operates" :key="i">
 | ||
|                     <el-button :size="operate.size || 'mini'" :type="operate.type || 'primary'" style="margin-right:5px;" @click="handleClick(operate, scope.row)">{{ operate.name }}</el-button>
 | ||
|                   </span>
 | ||
|                 </span>
 | ||
|                 <span v-else>
 | ||
|                   {{ scope.row[column.prop] }}
 | ||
|                 </span>
 | ||
|               </span>
 | ||
|               <!-- 使用slot的情况下 -->
 | ||
|               <span v-if="column.slot">
 | ||
|                 <!-- 具名slot -->
 | ||
|                 <slot v-if="column.slot" :name="column.slot" :scope="scope" />
 | ||
|               </span>
 | ||
|             </template>
 | ||
|           </el-table-column>
 | ||
|           <!-- 匿名slot -->
 | ||
|         </template>
 | ||
|         <slot />
 | ||
|       </el-table>
 | ||
|     </el-col>
 | ||
|     <!-- 分页部分 -->
 | ||
|     <el-col v-if="!hiddenPage" :span="24" class="page">
 | ||
|       <pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="pagination" />
 | ||
|     </el-col>
 | ||
|   </el-row>
 | ||
| </template>
 | ||
| <script>
 | ||
| /**
 | ||
|  * @author
 | ||
|  * @todo 项目中基本使用表格
 | ||
|  * @slot 1: defaultSlot:插入表格一行 2: front-slot:默认在表格开始处加一行 3:column内slot
 | ||
|  * @property
 | ||
|  * list => 表格数据
 | ||
|  * columns: [ ==> 配置表格头
 | ||
|  *  key: => 渲染字段名称
 | ||
|  *  title: => 表头名称
 | ||
|  *  operates: => 操作数组 [
 | ||
|  *      name: 名称
 | ||
|  *      emitKey: 要emit出去的事件
 | ||
|  *  ]
 | ||
|  * ]
 | ||
|  * demo columns
 | ||
|  * headers: [
 | ||
|         { type: 'selection'},
 | ||
|         { type: 'index'},
 | ||
|         { key: 'loginName', title: 'XXX' },
 | ||
|         { key: 'userName', title: 'XXX' },
 | ||
|         { key: 'roleName', title: 'XXX', hidden: true, slot: 'roleSlot' },
 | ||
|         { key: 'createDate', title: 'XXX' },
 | ||
|         // operate 这一行可以选择直接使用slot或者是使用配置项
 | ||
|         { type: 'operate', title: 'XXX',
 | ||
|           operates: [
 | ||
|             { name: 'XXX', emitKey: 'reset' },
 | ||
|             { name: 'XXX', emitKey: 'edit' },
 | ||
|             { name: 'XXX', emitKey: 'delete' }
 | ||
|         ] }
 | ||
|       ]
 | ||
|  */
 | ||
| import Pagination from '@/components/Pagination'
 | ||
| export default {
 | ||
|   name: 'BaseTable',
 | ||
|   components: { Pagination },
 | ||
|   props: {
 | ||
|     // 核心数据
 | ||
|     list: {
 | ||
|       type: Array,
 | ||
|       default: () => []
 | ||
|     },
 | ||
| 
 | ||
|     // columns
 | ||
|     columns: {
 | ||
|       type: Array,
 | ||
|       required: true,
 | ||
|       default: () => []
 | ||
|     },
 | ||
|     // is hidden page for table
 | ||
|     hiddenPage: {
 | ||
|       type: Boolean,
 | ||
|       default: false
 | ||
|     },
 | ||
|     bottomOffset: {
 | ||
|       type: Number,
 | ||
|       default: 45
 | ||
|     },
 | ||
|     searchData: {
 | ||
|       type: Object,
 | ||
|       default: () => {}
 | ||
|     },
 | ||
|     total: {
 | ||
|       type: Number,
 | ||
|       default: 0
 | ||
|     },
 | ||
|     highlightCurrentRow: {
 | ||
|       type: Boolean,
 | ||
|       default: false
 | ||
|     }
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|     }
 | ||
|   },
 | ||
|   computed: {
 | ||
|     tableHeight() {
 | ||
|       return 100
 | ||
|     }
 | ||
|   },
 | ||
|   methods: {
 | ||
|     // 处理点击事件
 | ||
|     handleClick(action, data) {
 | ||
|       // emit事件
 | ||
|       this.$emit(`${action.emitKey}`, data)
 | ||
|     },
 | ||
|     // 选中变化
 | ||
|     handleSelectionChange(val) {
 | ||
|       this.$emit('handleSelectionChange', val)
 | ||
|     },
 | ||
|     handleSelect(rows, row) {
 | ||
|       this.$emit('handleSelect', rows, row)
 | ||
|     },
 | ||
|     celldblclick(row, column) {
 | ||
|       this.$emit('celldblclick', row, column)
 | ||
|     },
 | ||
|     sortByColumn(column) {
 | ||
|       this.$emit('sortByColumn', column)
 | ||
|     },
 | ||
|     pagination() {
 | ||
|       this.$emit('getList')
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| <style lang="scss" scoped>
 | ||
| .page{
 | ||
|   padding-top: 3px;
 | ||
|   text-align: right;
 | ||
| }
 | ||
| </style>
 |