123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- <template>
- <div class="TableView">
- <el-table
- class="elTable"
- ref="dataTable"
- :data="tableData"
- border
- size="mini"
- highlight-current-row
- @selection-change="selectLine"
- @current-change="handleCurrentChange"
- @sort-change="changeSort"
- @row-dblclick="rowdblclick"
- :header-row-style="{ height: +this.GLOBAL.MAX_HEADER_H + 'px' }"
- :header-cell-style="{
- padding: '0px',
- background: '#f6f6f6',
- color: '#6c6c6c'
- }"
- :row-style="{ height: +this.GLOBAL.MAX_ROW_H + 'px' }"
- :cell-style="{ padding: '0px' }"
- row-key="id"
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- >
- <!-- :height="height" 多选框 -->
- <el-table-column
- v-if="showSelect"
- type="selection"
- width="50"
- align="center"
- :selectable="checkboxT"
- ></el-table-column>
- <el-table-column type="expand" v-if="isExpand">
- <template slot-scope="scope">
- <slot name="expand" :data="scope" />
- </template>
- </el-table-column>
- <el-table-column
- label="序号"
- type="index"
- width="70px"
- align="center"
- v-if="isSerial"
- >
- <template slot-scope="scope">
- <span>{{ (currentPage - 1) * pageSize + scope.$index + 1 }}</span>
- </template>
- </el-table-column>
- <!-- 文本数据渲染 -->
- <template v-for="item in tableHead">
- <!--自定义列 操作模块 fixed="right" -->
- <el-table-column
- v-if="item.columnType == 'operation' && item.isShow"
- :prop="item.prop"
- :label="item.label"
- :key="item.prop"
- :min-width="item.minWidth"
- :width="item.width"
- :align="item.align || 'center'"
- fixed="right"
- >
- <template slot-scope="scope">
- <slot :name="item.slotName" :data="scope" />
- </template>
- </el-table-column>
- <!--自定义列 :sortable="sortable ? sortable :'custom' "-->
- <el-table-column
- :show-overflow-tooltip="item.tooltip == null ? true : item.tooltip"
- v-else-if="item.columnType == 'slot' && item.isShow"
- :prop="item.prop"
- :label="item.label"
- :key="item.prop"
- :min-width="item.minWidth"
- :width="item.width"
- :align="item.align ? item.align : 'center'"
- :sortable="item.sortable == null ? false : item.sortable"
- >
- <template slot-scope="scope">
- <slot :name="item.slotName" :data="scope" />
- </template>
- </el-table-column>
- <!--普通文本 :sort-orders="['ascending', 'descending']" -->
- <el-table-column
- :show-overflow-tooltip="item.tooltip == null ? true : item.tooltip"
- v-else-if="item.isShow && !item.type && !item.columnType"
- :prop="item.prop"
- :label="item.label"
- :key="item.prop"
- :min-width="item.minWidth"
- :width="item.width"
- :align="item.align ? item.align : 'center'"
- :sortable="item.sortable == null ? false : item.sortable"
- ></el-table-column>
- <!--根据不同类型显示不同的输入框 可以是下拉选择 /按钮 /输入框 还可以自己定义更多 -->
- <el-table-column
- v-else-if="item.type && item.isShow && !item.columnType"
- :label="item.label"
- :key="item.prop"
- :min-width="item.minWidth"
- :width="item.width"
- :align="item.align ? item.align : 'center'"
- :sortable="item.sortable == null ? false : item.sortable"
- >
- <template slot-scope="scope">
- <el-select
- v-if="item.type == 'select'"
- size="mini"
- v-model="scope.row[item.prop]"
- @change="handleEdit(scope.$index, scope.row)"
- placeholder="请选择"
- value
- >
- <el-option
- v-for="option in item.data"
- :disabled="disabled"
- :value="option.name"
- :key="option.name"
- :label="option.name"
- />
- </el-select>
- <el-button
- v-else-if="item.type == 'btn'"
- :disabled="disabled"
- @click="onSelected(scope.$index, scope.row)"
- type="primary"
- size="mini"
- >{{ item.text }}</el-button
- >
- <el-input
- v-else-if="item.type == 'text'"
- size="mini"
- :disabled="item.disabled || disabled"
- v-model="scope.row[item.prop]"
- placeholder="请输入"
- @change="handleEdit(scope.$index, scope.row)"
- />
- <el-input
- v-only-number="{ min: 0, max: GLOBAL.MAX_PRICE, precision: 2 }"
- v-else-if="item.type == 'money'"
- size="mini"
- :disabled="item.disabled || disabled"
- v-model="scope.row[item.prop]"
- placeholder="请输入"
- @change="handleEdit(scope.$index, scope.row)"
- />
- <el-input-number
- v-onlyInt
- size="mini"
- v-else-if="item.type === 'number'"
- v-model="scope.row[item.prop]"
- :min="0"
- label="排序编号"
- @change="handleEdit(scope.$index, scope.row)"
- ></el-input-number>
- <!-- <span>{{scope.row[item.prop]}}</span> -->
- </template>
- </el-table-column>
- </template>
- </el-table>
- <div class="paginationInfo" v-show="pageShow">
- <pagination
- ref="p"
- :page-size="pageRequest.pageSize"
- :total="total"
- :current-page="pageRequest.pageIndex"
- @changePage="changePage"
- @changePageSize="changePageSize"
- ></pagination>
- <div class="pool">{{ totalizeStr }}</div>
- </div>
- </div>
- </template>
- <script>
- import pagination from '@/components/pagination'
- export default {
- name: 'e-table',
- components: { pagination },
- /**
- * @name:
- * @test: test font
- * @msg:
- * @param {
- * 接收参数:
- * tableHeadConfig 列的名称、接收值 | Array
- * label 列的名称 | String
- * prop 列的对应值 | String
- * columnType 定义当前列为插槽 | slot | String
- * slotName 定义当前列插槽的名字 | String
- * width 定义当前列的宽度 | String
- * sortable 列的排序
- * isTime 列是否是时间
- * tooltip :false
- *
- * 示例:配置
- * tableHeadConfig:[
- * {
- * label : "缩略图",
- * prop : "skuName",
- * columnType : "slot",
- * slotName : "thumbnail",
- * width : 240
- * }
- * ]
- *
- * tableLoadData 异步获取的table文本数据信息
- * align 表格单元格内容排列顺序 left|center|right
- * showSelect 表格是否可多选
- * height 表格默认撑开高度(未用)
- * heightOffset 表格最大高度偏移量
- * pageShow 显示分页(默认显示)
- * pageSize 分页》 页条
- * total 分页》 总数
- * currentPage 分页 》当前页码
- * totalizeStr 合计说明处理
- * 事件:
- * 获取当前选中行
- * 调用页面用 @selectLine="xxx" 进行监听处理
- * 从后台获取数据,重新排序 changeSort
- * 双击行事件rowdblclick
- * 分页获取更改的页码 changePage
- * 分页获取更改条数/页 changePageSize
- * }
- * @return:
- */
- props: {
- tableHeadConfig: {
- type: Array,
- default: () => {
- return [
- {
- label: 'skuId',
- prop: 'skuId'
- },
- {
- label: '操作',
- columnType: 'slot',
- slotName: 'operation'
- }
- ]
- }
- },
- tableLoadData: {
- type: Array,
- default: () => {
- return []
- }
- },
- align: {
- type: String,
- default: 'center'
- },
- isSerial: {
- type: Boolean,
- default: true
- },
- isExpand: {
- type: Boolean,
- default: false
- },
- sortable: {
- type: Boolean,
- default: false
- },
- showSelect: {
- type: Boolean,
- default: false
- },
- height: {
- type: [Number, String],
- default: 50
- },
- heightOffset: {
- type: [Number, String],
- default: 150
- },
- isTime: {
- type: Boolean,
- default: false
- },
- pageShow: {
- type: Boolean,
- default: true
- },
- isDisabled: {
- type: Boolean,
- default: true
- },
- pageSize: {
- type: [Number, String],
- default: 10
- },
- total: {
- type: [Number, String],
- default: 0
- },
- currentPage: {
- type: Number,
- default: 1
- },
- totalizeStr: {
- type: String,
- default: ''
- },
- selectQuantity: {
- type: [String, Number],
- default: 0
- }
- },
- data() {
- return {
- selectList: [],
- disabled: false,
- // 分页信息
- pageRequest: {
- pageIndex: 1,
- pageSize: 10,
- sort: null,
- order: null
- }
- }
- },
- computed: {
- tableData() {
- return this.tableLoadData
- },
- tableHead() {
- return this.tableHeadConfig
- }
- },
- created() {},
- mounted() {},
- methods: {
- checkboxT(row, index) {
- return this.isDisabled
- },
- // 分页查询
- getPageList() {
- this.$emit('getPageList', this.pageRequest)
- },
- // 从后台获取数据,重新排序
- changeSort(val) {
- if (val) {
- this.pageRequest.pageIndex = 1
- this.pageRequest.sort = val.prop
- this.pageRequest.order = val.order
- this.getPageList()
- // console.log("排序的参数")
- this.$emit('changeSort', { sort: val.prop, order: val.order })
- }
- },
- // 分页获取更改的页码
- changePage(val) {
- this.pageRequest.pageIndex = val
- this.getPageList()
- this.$emit('changePage', val)
- },
- // 分页获取更改条数/页
- changePageSize(val) {
- this.pageRequest.pageSize = val
- this.pageRequest.pageIndex = 1
- this.getPageList()
- this.$emit('changePageSize', val)
- },
- //双击行事件
- rowdblclick(row, column) {
- if (row) {
- // this.$emit("rowdblclick", row);
- }
- },
- // 选择切换
- handleCurrentChange(val) {
- this.$emit('handleCurrentChange', val)
- },
- //选择
- selectLine(val) {
- this.selectList = val
- if (this.selectQuantity > 0) {
- if (this.selectList.length > this.selectQuantity) {
- // this.$refs.dataTable.clearSelection();
- // this.$refs.dataTable.toggleRowSelection(val[val.length-1]) ;
- // 截取前20位
- this.selectList = val.slice(0, this.selectQuantity)
- // 截取20位之后的数组 禁止选中
- let tempArr = val.slice(this.selectQuantity)
- if (tempArr.length !== 0) {
- tempArr.forEach(ele => {
- this.$refs.dataTable.toggleRowSelection(ele, false)
- })
- }
- this.$message.closeAll()
- this.$message.warning('只能请选择' + this.selectQuantity + '个')
- }
- }
- this.$emit('selectLine', this.selectList)
- // if (
- // this.$refs.dataTable.selection &&
- // this.$refs.dataTable.selection.length > 0
- // ) {
- // this.$emit('selectLine', this.$refs.dataTable.selection);
- // }
- },
- handleEdit(index, row) {
- this.$emit('handleEdit', { index: index, row: row })
- },
- onSelected: function (index, row) {
- this.$emit('onTableBtn', { index: index, row: row })
- }
- // this.$refs.dataTable.doLayout();
- }
- }
- </script>
- <style lang="less" scoped>
- .TableView .elTable {
- border: 1px solid #4bd198 !important;
- }
- .TableView .el-link {
- font-size: 12px !important;
- margin: 0 2px;
- }
- .TableView .el-table::before {
- height: 0 !important;
- }
- .TableView .elTable th {
- background: #f2f2f2 !important;
- }
- .TableView .elTable .cell {
- line-height: 40px !important;
- }
- .TableView .el-table__fixed-right::before,
- .TableView .el-table__fixed::before {
- height: 0 !important;
- }
- .paginationInfo {
- display: flex;
- justify-content: flex-end;
- border-top: 1px solid #e6e6e6;
- padding: 7px 0;
- margin-top: 10px;
- .pool {
- padding: 10px 10px;
- color: #6c6c6c;
- text-align: right;
- }
- }
- /*当表格选中的时候 会自动添加 .current-row 这些代码很好理解了*/
- .tb-edit .el-input,
- .tb-edit .el-input-number,
- .tb-edit .el-select {
- display: none;
- }
- .tb-edit .current-row .el-input.el-input-number,
- .tb-edit .current-row .el-select {
- display: block;
- }
- .tb-edit .current-row .el-input .el-input-number + span,
- .tb-edit .current-row .el-select + span {
- display: none;
- }
- </style>
|