<template> <!-- #ifdef H5 --> <tr class="uni-table-tr"> <th v-if="selection === 'selection' && ishead" class="checkbox" :class="{ 'tr-table--border': border }"> <table-checkbox :checked="checked" :indeterminate="indeterminate" :disabled="disabled" @checkboxSelected="checkboxSelected"></table-checkbox> </th> <slot></slot> <!-- <uni-th class="th-fixed">123</uni-th> --> </tr> <!-- #endif --> <!-- #ifndef H5 --> <view class="uni-table-tr"> <view v-if="selection === 'selection' " class="checkbox" :class="{ 'tr-table--border': border }"> <table-checkbox :checked="checked" :indeterminate="indeterminate" :disabled="disabled" @checkboxSelected="checkboxSelected"></table-checkbox> </view> <slot></slot> </view> <!-- #endif --> </template> <script> import tableCheckbox from './table-checkbox.vue' /** * Tr 表格行组件 * @description 表格行组件 仅包含 th,td 组件 * @tutorial https://ext.dcloud.net.cn/plugin?id= */ export default { name: 'uniTr', components: { tableCheckbox }, props: { disabled: { type: Boolean, default: false }, keyValue: { type: [String, Number], default: '' } }, options: { // #ifdef MP-TOUTIAO virtualHost: false, // #endif // #ifndef MP-TOUTIAO virtualHost: true // #endif }, data() { return { value: false, border: false, selection: false, widthThArr: [], ishead: true, checked: false, indeterminate: false } }, created() { this.root = this.getTable() this.head = this.getTable('uniThead') if (this.head) { this.ishead = false this.head.init(this) } this.border = this.root.border this.selection = this.root.type this.root.trChildren.push(this) const rowData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue) if (rowData) { this.rowData = rowData } this.root.isNodata() }, mounted() { if (this.widthThArr.length > 0) { const selectionWidth = this.selection === 'selection' ? 50 : 0 this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth; } }, // #ifndef VUE3 destroyed() { const index = this.root.trChildren.findIndex(i => i === this) this.root.trChildren.splice(index, 1) this.root.isNodata() }, // #endif // #ifdef VUE3 unmounted() { const index = this.root.trChildren.findIndex(i => i === this) this.root.trChildren.splice(index, 1) this.root.isNodata() }, // #endif methods: { minWidthUpdate(width) { this.widthThArr.push(width) if (this.widthThArr.length > 0) { const selectionWidth = this.selection === 'selection' ? 50 : 0; this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth; } }, // 选中 checkboxSelected(e) { let rootData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue) this.checked = e.checked this.root.check(rootData || this, e.checked, rootData ? this.keyValue : null) }, change(e) { this.root.trChildren.forEach(item => { if (item === this) { this.root.check(this, e.detail.value.length > 0 ? true : false) } }) }, /** * 获取父元素实例 */ getTable(name = 'uniTable') { let parent = this.$parent let parentName = parent.$options.name while (parentName !== name) { parent = parent.$parent if (!parent) return false parentName = parent.$options.name } return parent } } } </script> <style lang="scss"> $border-color: #ebeef5; .uni-table-tr { /* #ifndef APP-NVUE */ display: table-row; transition: all 0.3s; box-sizing: border-box; /* #endif */ } .checkbox { padding: 0 8px; width: 26px; padding-left: 12px; /* #ifndef APP-NVUE */ display: table-cell; vertical-align: middle; /* #endif */ color: #333; font-weight: 500; border-bottom: 1px $border-color solid; font-size: 14px; // text-align: center; } .tr-table--border { border-right: 1px $border-color solid; } /* #ifndef APP-NVUE */ .uni-table-tr { ::v-deep .uni-table-th { &.table--border:last-child { // border-right: none; } } ::v-deep .uni-table-td { &.table--border:last-child { // border-right: none; } } } /* #endif */ </style>