tn-td.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <template>
  2. <view class="tn-td-class tn-td" :class="[tdClass]" :style="[tdStyle]" @tap.stop="handleClick">
  3. <slot></slot>
  4. </view>
  5. </template>
  6. <script>
  7. import componentsColorMixin from '../../libs/mixin/components_color.js'
  8. export default {
  9. name: 'tn-td',
  10. options: {
  11. // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现(不会出现shadow节点下再去创建元素)
  12. virtualHost: true
  13. },
  14. mixins: [componentsColorMixin],
  15. props: {
  16. // 占整个表格的宽度跨度
  17. // [1-24]
  18. span: {
  19. type: Number,
  20. default: 24
  21. },
  22. // 宽度
  23. // 优先级比span高
  24. width: {
  25. type: [String, Number],
  26. default: ''
  27. },
  28. // 高度
  29. height: {
  30. type: [String, Number],
  31. default: ''
  32. },
  33. // 字体加粗
  34. bold: {
  35. type: Boolean,
  36. default: false
  37. },
  38. // 格内边距
  39. padding: {
  40. type: String,
  41. default: ''
  42. },
  43. // 边框颜色
  44. borderColor: {
  45. type: String,
  46. default: ''
  47. },
  48. // 边框宽度
  49. borderWidth: {
  50. type: [String, Number],
  51. default: ''
  52. },
  53. // 左边框
  54. borderLeft: {
  55. type: Boolean,
  56. default: false
  57. },
  58. // 下边框
  59. borderBottom: {
  60. type: Boolean,
  61. default: false
  62. },
  63. // 右边框
  64. borderRight: {
  65. type: Boolean,
  66. default: true
  67. },
  68. // 文字超出隐藏
  69. ellipsis: {
  70. type: Boolean,
  71. default: false
  72. },
  73. // 文本对齐方式
  74. // left center right
  75. textAlign: {
  76. type: String,
  77. default: 'left'
  78. },
  79. // 排列方式
  80. // left center right
  81. alignItems: {
  82. type: String,
  83. default: 'left'
  84. },
  85. // 收缩表格
  86. shrink: {
  87. type: Boolean,
  88. default: true
  89. },
  90. // 铺满剩余空间
  91. grow: {
  92. type: Boolean,
  93. default: false
  94. },
  95. // 隐藏
  96. hidden: {
  97. type: Boolean,
  98. default: false
  99. },
  100. // 固定列数据
  101. fixed: {
  102. type: Boolean,
  103. default: false
  104. },
  105. // zIndex
  106. zIndex: {
  107. type: Number,
  108. default: 0
  109. },
  110. // 列数
  111. index: {
  112. type: [String, Number],
  113. default: 0
  114. },
  115. // keys
  116. keys: {
  117. type: [String, Number],
  118. default: ''
  119. }
  120. },
  121. computed: {
  122. tdClass() {
  123. let clazz = ''
  124. clazz += `${this.ellipsis ? 'tn-td--ellipsis' : 'tn-td--normal'}`
  125. if (this.backgroundColorClass) {
  126. clazz += ` ${this.backgroundColorClass}`
  127. }
  128. if (this.fontColorClass) {
  129. clazz += ` ${this.fontColorClass}`
  130. }
  131. if (this.alignItems) {
  132. clazz += ` tn-td--${this.alignItems}`
  133. }
  134. if (this.textAlign) {
  135. clazz += ` tn-td__text--${this.textAlign}`
  136. }
  137. if (!this.shrink) {
  138. clazz += ' tn-td--shrink'
  139. }
  140. if (this.grow) {
  141. clazz += ' tn-td--grow'
  142. }
  143. if (this.hidden) {
  144. clazz += ' tn-td--hidden'
  145. }
  146. return clazz
  147. },
  148. tdStyle() {
  149. let style = {}
  150. if (this.backgroundColorStyle) {
  151. style.backgroundColor = this.backgroundColorStyle
  152. }
  153. if (this.fontColorStyle) {
  154. style.color = this.fontColorStyle
  155. }
  156. if (this.fontSizeStyle) {
  157. style.fontSize = this.fontSizeStyle
  158. }
  159. style.width = this.getWidth()
  160. if (this.height) {
  161. style.height = this.$t.string.getLengthUnitValue(this.height)
  162. }
  163. style.fontWeight = this.bold ? 'bold' : 'normal'
  164. if (this.padding) {
  165. style.padding = this.padding
  166. }
  167. if (this.borderWidth !== '' || this.parentData.borderWidthValue !== '') {
  168. style.borderWidth = this.borderWidth !== '' ? this.$t.string.getLengthUnitValue(this.borderWidth) : this.$t.string.getLengthUnitValue(this.parentData.borderWidthValue)
  169. }
  170. if (this.borderColor || this.parentData.borderColorValue) {
  171. style.borderColor = this.borderColor || this.parentData.borderColorValue
  172. }
  173. if (this.borderLeft) {
  174. style.borderLeftStyle = 'solid'
  175. }
  176. if (this.borderRight) {
  177. style.borderRightStyle = 'solid'
  178. }
  179. if (this.borderBottom) {
  180. style.borderBottomStyle = 'solid'
  181. }
  182. if (this.fixed) {
  183. style.zIndex = this.zIndex ? this.zIndex : this.$t.zIndex.tableTd
  184. }
  185. return style
  186. }
  187. },
  188. data() {
  189. return {
  190. parentData: {
  191. borderColorValue: null,
  192. borderWidthValue: null
  193. }
  194. }
  195. },
  196. created() {
  197. this.parent = false
  198. this.updateParentData()
  199. this.parent && this.parent.children.push(this)
  200. },
  201. methods: {
  202. // 获取表格宽度
  203. getWidth() {
  204. if (this.width) {
  205. return this.$t.string.getLengthUnitValue(this.width)
  206. }
  207. return [
  208. '4.16666667%',
  209. '8.33333333%',
  210. '12.5%',
  211. '16.66666667%',
  212. '20.83333333%',
  213. '25%',
  214. '29.16666667%',
  215. '33.33333333%',
  216. '37.5%',
  217. '41.66666667%',
  218. '45.83333333%',
  219. '50%',
  220. '54.16666667%',
  221. '58.33333333%',
  222. '62.5%',
  223. '66.66666667%',
  224. '70.83333333%',
  225. '75%',
  226. '79.16666667%',
  227. '83.33333333%',
  228. '87.5%',
  229. '91.66666667%',
  230. '95.83333333%',
  231. '100%'
  232. ][this.span - 1]
  233. },
  234. // 点击事件
  235. handleClick() {
  236. this.$emit('click', {
  237. index: this.index,
  238. key: this.keys
  239. })
  240. },
  241. // 更新父组件信息
  242. updateParentData() {
  243. this.getParentData('tn-tr')
  244. }
  245. }
  246. }
  247. </script>
  248. <style lang="scss" scoped>
  249. .tn-td {
  250. box-sizing: border-box;
  251. position: relative;
  252. word-break: break-all;
  253. background-color: transparent;
  254. height: auto;
  255. padding: 12rpx;
  256. border-width: 1rpx;
  257. border-style: none;
  258. border-color: #AAAAAA;
  259. &--normal {
  260. display: inline-flex;
  261. align-items: center;
  262. }
  263. &--ellipsis {
  264. display: inline-block;
  265. overflow: hidden;
  266. white-space: nowrap !important;
  267. text-overflow: ellipsis;
  268. }
  269. &--shrink {
  270. flex-shrink: 0;
  271. }
  272. &--grow {
  273. flex-grow: 1;
  274. }
  275. &--left {
  276. justify-content: flex-start;
  277. }
  278. &--center {
  279. justify-content: center;
  280. }
  281. &--right {
  282. justify-content: flex-end;
  283. }
  284. &__text {
  285. &--left {
  286. text-align: left;
  287. }
  288. &--center {
  289. text-align: center;
  290. }
  291. &--right {
  292. text-align: right;
  293. }
  294. }
  295. &--hidden {
  296. visibility: hidden;
  297. }
  298. }
  299. </style>