308 lines
6.9 KiB
Vue
308 lines
6.9 KiB
Vue
<template>
|
||
<view class="tn-td-class tn-td" :class="[tdClass]" :style="[tdStyle]" @tap.stop="handleClick">
|
||
<slot></slot>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import componentsColorMixin from '../../libs/mixin/components_color.js'
|
||
export default {
|
||
name: 'tn-td',
|
||
options: {
|
||
// 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现(不会出现shadow节点下再去创建元素)
|
||
virtualHost: true
|
||
},
|
||
mixins: [componentsColorMixin],
|
||
props: {
|
||
// 占整个表格的宽度跨度
|
||
// [1-24]
|
||
span: {
|
||
type: Number,
|
||
default: 24
|
||
},
|
||
// 宽度
|
||
// 优先级比span高
|
||
width: {
|
||
type: [String, Number],
|
||
default: ''
|
||
},
|
||
// 高度
|
||
height: {
|
||
type: [String, Number],
|
||
default: ''
|
||
},
|
||
// 字体加粗
|
||
bold: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 格内边距
|
||
padding: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
// 边框颜色
|
||
borderColor: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
// 边框宽度
|
||
borderWidth: {
|
||
type: [String, Number],
|
||
default: ''
|
||
},
|
||
// 左边框
|
||
borderLeft: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 下边框
|
||
borderBottom: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 右边框
|
||
borderRight: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
// 文字超出隐藏
|
||
ellipsis: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 文本对齐方式
|
||
// left center right
|
||
textAlign: {
|
||
type: String,
|
||
default: 'left'
|
||
},
|
||
// 排列方式
|
||
// left center right
|
||
alignItems: {
|
||
type: String,
|
||
default: 'left'
|
||
},
|
||
// 收缩表格
|
||
shrink: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
// 铺满剩余空间
|
||
grow: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 隐藏
|
||
hidden: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 固定列数据
|
||
fixed: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// zIndex
|
||
zIndex: {
|
||
type: Number,
|
||
default: 0
|
||
},
|
||
// 列数
|
||
index: {
|
||
type: [String, Number],
|
||
default: 0
|
||
},
|
||
// keys
|
||
keys: {
|
||
type: [String, Number],
|
||
default: ''
|
||
}
|
||
},
|
||
computed: {
|
||
tdClass() {
|
||
let clazz = ''
|
||
clazz += `${this.ellipsis ? 'tn-td--ellipsis' : 'tn-td--normal'}`
|
||
if (this.backgroundColorClass) {
|
||
clazz += ` ${this.backgroundColorClass}`
|
||
}
|
||
if (this.fontColorClass) {
|
||
clazz += ` ${this.fontColorClass}`
|
||
}
|
||
if (this.alignItems) {
|
||
clazz += ` tn-td--${this.alignItems}`
|
||
}
|
||
if (this.textAlign) {
|
||
clazz += ` tn-td__text--${this.textAlign}`
|
||
}
|
||
if (!this.shrink) {
|
||
clazz += ' tn-td--shrink'
|
||
}
|
||
if (this.grow) {
|
||
clazz += ' tn-td--grow'
|
||
}
|
||
if (this.hidden) {
|
||
clazz += ' tn-td--hidden'
|
||
}
|
||
return clazz
|
||
},
|
||
tdStyle() {
|
||
let style = {}
|
||
if (this.backgroundColorStyle) {
|
||
style.backgroundColor = this.backgroundColorStyle
|
||
}
|
||
if (this.fontColorStyle) {
|
||
style.color = this.fontColorStyle
|
||
}
|
||
if (this.fontSizeStyle) {
|
||
style.fontSize = this.fontSizeStyle
|
||
}
|
||
style.width = this.getWidth()
|
||
if (this.height) {
|
||
style.height = this.$tn.string.getLengthUnitValue(this.height)
|
||
}
|
||
style.fontWeight = this.bold ? 'bold' : 'normal'
|
||
if (this.padding) {
|
||
style.padding = this.padding
|
||
}
|
||
if (this.borderWidth !== '' || this.parentData.borderWidthValue !== '') {
|
||
style.borderWidth = this.borderWidth !== '' ? this.$tn.string.getLengthUnitValue(this.borderWidth) : this.$tn.string.getLengthUnitValue(this.parentData.borderWidthValue)
|
||
}
|
||
if (this.borderColor || this.parentData.borderColorValue) {
|
||
style.borderColor = this.borderColor || this.parentData.borderColorValue
|
||
}
|
||
if (this.borderLeft) {
|
||
style.borderLeftStyle = 'solid'
|
||
}
|
||
if (this.borderRight) {
|
||
style.borderRightStyle = 'solid'
|
||
}
|
||
if (this.borderBottom) {
|
||
style.borderBottomStyle = 'solid'
|
||
}
|
||
if (this.fixed) {
|
||
style.zIndex = this.zIndex ? this.zIndex : this.$tn.zIndex.tableTd
|
||
}
|
||
return style
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
parentData: {
|
||
borderColorValue: null,
|
||
borderWidthValue: null
|
||
}
|
||
}
|
||
},
|
||
created() {
|
||
this.parent = false
|
||
this.updateParentData()
|
||
this.parent && this.parent.children.push(this)
|
||
},
|
||
methods: {
|
||
// 获取表格宽度
|
||
getWidth() {
|
||
if (this.width) {
|
||
return this.$tn.string.getLengthUnitValue(this.width)
|
||
}
|
||
return [
|
||
'4.16666667%',
|
||
'8.33333333%',
|
||
'12.5%',
|
||
'16.66666667%',
|
||
'20.83333333%',
|
||
'25%',
|
||
'29.16666667%',
|
||
'33.33333333%',
|
||
'37.5%',
|
||
'41.66666667%',
|
||
'45.83333333%',
|
||
'50%',
|
||
'54.16666667%',
|
||
'58.33333333%',
|
||
'62.5%',
|
||
'66.66666667%',
|
||
'70.83333333%',
|
||
'75%',
|
||
'79.16666667%',
|
||
'83.33333333%',
|
||
'87.5%',
|
||
'91.66666667%',
|
||
'95.83333333%',
|
||
'100%'
|
||
][this.span - 1]
|
||
},
|
||
// 点击事件
|
||
handleClick() {
|
||
this.$emit('click', {
|
||
index: this.index,
|
||
key: this.keys
|
||
})
|
||
},
|
||
// 更新父组件信息
|
||
updateParentData() {
|
||
this.getParentData('tn-tr')
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.tn-td {
|
||
box-sizing: border-box;
|
||
position: relative;
|
||
word-break: break-all;
|
||
background-color: transparent;
|
||
height: auto;
|
||
padding: 12rpx;
|
||
|
||
border-width: 1rpx;
|
||
border-style: none;
|
||
border-color: #AAAAAA;
|
||
|
||
&--normal {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
}
|
||
&--ellipsis {
|
||
display: inline-block;
|
||
overflow: hidden;
|
||
white-space: nowrap !important;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
&--shrink {
|
||
flex-shrink: 0;
|
||
}
|
||
&--grow {
|
||
flex-grow: 1;
|
||
}
|
||
|
||
&--left {
|
||
justify-content: flex-start;
|
||
}
|
||
&--center {
|
||
justify-content: center;
|
||
}
|
||
&--right {
|
||
justify-content: flex-end;
|
||
}
|
||
|
||
&__text {
|
||
&--left {
|
||
text-align: left;
|
||
}
|
||
&--center {
|
||
text-align: center;
|
||
}
|
||
&--right {
|
||
text-align: right;
|
||
}
|
||
}
|
||
|
||
&--hidden {
|
||
visibility: hidden;
|
||
}
|
||
}
|
||
</style>
|