index.vue 4.6 KB

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