123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <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>
|