WidgetFormItem.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <div>
  3. <div v-if="item.type == 'title'" :style="item.styles" style="margin-left: 5px">
  4. {{ item.value }}
  5. </div>
  6. <component
  7. v-else
  8. :is="getComponent(item.type, item.component)"
  9. v-bind="vBind"
  10. :multiple="false"
  11. :placeholder="item.placeholder || getPlaceholder(item)"
  12. :dic="item.dicData"
  13. :value="['time', 'timerange', 'checkbox'].includes(item.type) ? item.dicData : undefined"
  14. >
  15. <span v-if="params.html" v-html="params.html"></span>
  16. </component>
  17. </div>
  18. </template>
  19. <script>
  20. export default {
  21. name: 'widget-form-item',
  22. props: {
  23. item: {
  24. type: Object,
  25. default: () => {
  26. return {}
  27. },
  28. },
  29. params: {
  30. type: Object,
  31. default: () => {
  32. return {}
  33. },
  34. },
  35. },
  36. computed: {
  37. vBind() {
  38. const vBind = Object.assign(this.deepClone(this.item), this.params, { size: this.item.size || 'small' })
  39. let event = ['change', 'blur', 'click', 'focus']
  40. event.forEach((e) => delete vBind[e])
  41. if (vBind.event) delete vBind.event
  42. return vBind
  43. },
  44. },
  45. data() {
  46. return {
  47. form: {},
  48. }
  49. },
  50. methods: {
  51. getComponent(type, component) {
  52. let KEY_COMPONENT_NAME = 'avue-'
  53. let result = 'input'
  54. if (component) return component
  55. else if (['array', 'img', 'url'].includes(type)) result = 'array'
  56. else if (type === 'select') result = 'select'
  57. else if (type === 'radio') result = 'radio'
  58. else if (type === 'checkbox') result = 'checkbox'
  59. else if (['time', 'timerange'].includes(type)) result = 'time'
  60. else if (['dates', 'date', 'datetime', 'datetimerange', 'daterange', 'week', 'month', 'year'].includes(type)) result = 'date'
  61. else if (type === 'cascader') result = 'cascader'
  62. else if (type === 'number') result = 'input-number'
  63. else if (type === 'password') result = 'input'
  64. else if (type === 'switch') result = 'switch'
  65. else if (type === 'rate') result = 'rate'
  66. else if (type === 'upload') result = 'upload'
  67. else if (type === 'slider') result = 'slider'
  68. else if (type === 'dynamic') result = 'dynamic'
  69. else if (type === 'icon') result = 'input-icon'
  70. else if (type === 'color') result = 'input-color'
  71. else if (type === 'map') result = 'input-map'
  72. return KEY_COMPONENT_NAME + result
  73. },
  74. getPlaceholder(item) {
  75. const label = item.label
  76. if (
  77. [
  78. 'select',
  79. 'checkbox',
  80. 'radio',
  81. 'tree',
  82. 'color',
  83. 'dates',
  84. 'date',
  85. 'datetime',
  86. 'datetimerange',
  87. 'daterange',
  88. 'week',
  89. 'month',
  90. 'year',
  91. 'map',
  92. 'icon',
  93. ].includes(item.type)
  94. )
  95. return `请选择 ${label}`
  96. else return `请输入 ${label}`
  97. },
  98. },
  99. }
  100. </script>