| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- <template>
- <div class="standard-table">
- <div class="alert">
- <a-alert type="info" :show-icon="true" v-if="selectedRows">
- <div class="message" slot="message">
- 已选择 <a>{{ selectedRows.length }}</a
- > 项 <a class="clear" @click="onClear">清空</a>
- <template v-for="(item, index) in needTotalList">
- <div v-if="item.needTotal" :key="index">
- {{ item.title }}总计
- <a>{{
- item.customRender ? item.customRender(item.total) : item.total
- }}</a>
- </div>
- </template>
- </div>
- </a-alert>
- </div>
- <a-table
- :bordered="bordered"
- :loading="loading"
- :columns="columns"
- :dataSource="dataSource"
- :rowKey="rowKey"
- :pagination="pagination"
- :expandedRowKeys="expandedRowKeys"
- :expandedRowRender="expandedRowRender"
- @change="onChange"
- :rowSelection="
- selectedRows
- ? { selectedRowKeys: selectedRowKeys, onChange: updateSelect }
- : undefined
- "
- :rowClassName="rowClassName"
- :custom-row="onClickRow"
- >
- <template
- slot-scope="text, record, index"
- :slot="slot"
- v-for="slot in Object.keys($scopedSlots).filter(
- (key) => key !== 'expandedRowRender'
- )"
- >
- <slot :name="slot" v-bind="{ text, record, index }"></slot>
- </template>
- <template :slot="slot" v-for="slot in Object.keys($slots)">
- <slot :name="slot"></slot>
- </template>
- <template
- slot-scope="record, index, indent, expanded"
- :slot="$scopedSlots.expandedRowRender ? 'expandedRowRender' : ''"
- >
- <slot
- v-bind="{ record, index, indent, expanded }"
- :name="$scopedSlots.expandedRowRender ? 'expandedRowRender' : ''"
- ></slot>
- </template>
- </a-table>
- </div>
- </template>
- <script>
- export default {
- name: "StandardTable",
- props: {
- bordered: Boolean,
- loading: [Boolean, Object],
- columns: Array,
- dataSource: Array,
- rowKey: {
- type: [String, Function],
- default: "key",
- },
- pagination: {
- type: [Object, Boolean],
- default: () => {
- return {
- current: 1,
- defaultPageSize: 10,
- total: 0,
- pagesize0ptions: ["10", "20", "30"],
- hideOnSinglePage: false,
- showQuickJumper: true, //
- showsizeChanger: true, //是否可以改变pagesize
- };
- },
- },
- selectedRows: Array,
- expandedRowKeys: Array,
- expandedRowRender: Function,
- },
- data() {
- return {
- needTotalList: [],
- selectRow: -1,
- };
- },
- methods: {
- onClickRow(record, index) {
- return {
- on: {
- click: () => {
- this.$emit("onClickRow", record);
- this.selectRow = index;
- },
- },
- };
- },
- rowClassName(record, index) {
- // 根据是否是选中行来设置不同的class
- // console.log(this.selectRow, index);
- return this.selectRow === index ? "highlight-row" : "";
- },
- updateSelect(selectedRowKeys, selectedRows) {
- console.log(selectedRowKeys, selectedRows);
- this.$emit("update:selectedRows", selectedRows);
- this.$emit("selectedRowChange", selectedRowKeys, selectedRows);
- },
- initTotalList(columns) {
- const totalList = columns
- .filter((item) => item.needTotal)
- .map((item) => {
- return {
- ...item,
- total: 0,
- };
- });
- return totalList;
- },
- onClear() {
- this.updateSelect([], []);
- this.$emit("clear");
- },
- onChange(pagination, filters, sorter, { currentDataSource }) {
- this.$emit("change", pagination, filters, sorter, { currentDataSource });
- },
- },
- created() {
- this.needTotalList = this.initTotalList(this.columns);
- },
- watch: {
- selectedRows(selectedRows) {
- this.needTotalList = this.needTotalList.map((item) => {
- return {
- ...item,
- total: selectedRows.reduce((sum, val) => {
- let v;
- try {
- v = val[item.dataIndex]
- ? val[item.dataIndex]
- : eval(`val.${item.dataIndex}`);
- } catch (_) {
- v = val[item.dataIndex];
- }
- v = !isNaN(parseFloat(v)) ? parseFloat(v) : 0;
- return sum + v;
- }, 0),
- };
- });
- },
- },
- computed: {
- selectedRowKeys() {
- return this.selectedRows.map((record) => {
- return typeof this.rowKey === "function"
- ? this.rowKey(record)
- : record[this.rowKey];
- });
- },
- },
- };
- </script>
- <style scoped lang="less">
- .standard-table {
- background: #fff;
- padding: 0 15px;
- box-sizing: border-box;
- .alert {
- margin-bottom: 16px;
- .message {
- a {
- font-weight: 600;
- }
- }
- .clear {
- float: right;
- }
- }
- /deep/ .ant-table-thead > tr > th {
- background: #fff;
- }
- /deep/ .ant-table-tbody > tr.highlight-row {
- background: linear-gradient(
- 90deg,
- rgba(52, 93, 230, 0.1) 0%,
- rgba(113, 229, 236, 0.1) 100%
- );
- // opacity: ;
- }
- }
- </style>
|