index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <div class="basic-component-input">
  3. <span
  4. v-if="config.customize.showTitle"
  5. class="title-left"
  6. :style="{ marginRight: config.customize.titleStyle.marginRight + 'px', fontSize: config.customize.titleStyle.fontSize + 'px', color: config.customize.titleStyle.color }"
  7. >
  8. {{ config.customize.title }}
  9. </span>
  10. <el-input
  11. :id="`el-input-${config.code}`"
  12. v-model="config.customize.value"
  13. type="text"
  14. resize="both"
  15. class="input"
  16. :placeholder="config.customize.placeholderStyle.placeholder"
  17. :style="{ backgroundColor: config.customize.backgroundStyle.backgroundColor }"
  18. @input="handleInput"
  19. >
  20. <i
  21. v-if="config.customize.icon.position === 'left' && config.customize.icon.name"
  22. slot="prefix"
  23. class="el-input__icon"
  24. :class="config.customize.icon.position === 'left' ? config.customize.icon.name : ''"
  25. />
  26. <i
  27. v-if="config.customize.icon.position === 'right' && config.customize.icon.name"
  28. slot="suffix"
  29. class="el-input__icon"
  30. :class="config.customize.icon.position === 'right' ? config.customize.icon.name : ''"
  31. />
  32. </el-input>
  33. </div>
  34. </template>
  35. <script>
  36. import commonMixins from 'data-room-ui/js/mixins/commonMixins'
  37. import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
  38. import { settingToTheme } from 'data-room-ui/js/utils/themeFormatting'
  39. import _ from 'lodash'
  40. export default {
  41. name: 'BasicComponentInput',
  42. mixins: [commonMixins, linkageMixins],
  43. props: {
  44. // 卡片的属性
  45. config: {
  46. type: Object,
  47. default: () => ({})
  48. }
  49. },
  50. data () {
  51. return {
  52. timer: null
  53. }
  54. },
  55. watch: {
  56. 'config.customize': {
  57. handler () {
  58. this.changeStyle(this.config, true)
  59. },
  60. deep: true
  61. }
  62. },
  63. mounted () {
  64. this.chartInit()
  65. },
  66. beforeDestroy () {
  67. // 销毁时清除定时器
  68. clearTimeout(this.timer)
  69. },
  70. methods: {
  71. changeStyle (config, isUpdateTheme) {
  72. config = { ...this.config, ...config }
  73. const input = document.querySelector(`#el-input-${config.code}`)
  74. // const inputIcon = input.querySelector(`.${this.config.customize.icon.name}`)
  75. input.style.backgroundColor = config.customize.backgroundStyle.backgroundColor
  76. input.style.fontSize = config.customize.inputStyle.fontSize + 'px'
  77. input.style.color = config.customize.inputStyle.color
  78. input.style.borderColor = config.customize.borderStyle.borderColor
  79. input.style.borderWidth = config.customize.borderStyle.borderWidth + 'px'
  80. input.style.borderStyle = config.customize.borderStyle.borderStyle
  81. input.style.borderRadius = config.customize.borderStyle.borderRadius + 'px'
  82. // inputIcon.style.fontSize = this.config.customize.inputStyle.fontSize + 'px'
  83. if (config.customize.icon.name) {
  84. const inputIcon = document.querySelector(`.${config.customize.icon.name}`)
  85. inputIcon.style.fontSize = config.customize.inputStyle.fontSize + 'px'
  86. }
  87. // 只有样式改变时更新主题配置,切换主题时不需要保存
  88. if (!isUpdateTheme) {
  89. config.theme = settingToTheme(_.cloneDeep(config), this.customTheme)
  90. this.changeChartConfig(config)
  91. if (config.code === this.activeCode) {
  92. this.changeActiveItemConfig(config)
  93. }
  94. }
  95. },
  96. handleInput (val) {
  97. // 提供一个防抖的方法
  98. this.debounce(() => {
  99. this.linkage({ [this.config.code]: val })
  100. })
  101. },
  102. debounce (fn, delay = 500) {
  103. clearTimeout(this.timer)
  104. this.timer = setTimeout(() => {
  105. fn()
  106. }, delay)
  107. }
  108. }
  109. }
  110. </script>
  111. <style lang="scss" scoped>
  112. .basic-component-input {
  113. width: 100%;
  114. display: flex;
  115. .title-left {
  116. display: block;
  117. white-space: nowrap;
  118. align-self: center;
  119. }
  120. // .title-top{
  121. // display: block;
  122. // text-align: center;
  123. // white-space: nowrap;
  124. // }
  125. .el-input {
  126. height: 100%;
  127. width: 100%;
  128. ::v-deep .el-input__inner {
  129. height: 100%;
  130. width: 100%;
  131. background-color:#151a26;
  132. border: 1px solid #DCDFE6;
  133. }
  134. }
  135. }
  136. </style>