8
0

components.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <div v-click-outside="onClickOutside" class="hc-table-form-components-box" :class="isClick ? 'cur' : ''" @click="leftTap">{{ name }}</div>
  3. </template>
  4. <script setup>
  5. import { onMounted, ref } from 'vue'
  6. import { getRandom, isNullES } from 'js-fast-way'
  7. import { ClickOutside as vClickOutside } from 'element-plus'
  8. const props = defineProps({
  9. type: [String, Number],
  10. placeholder: [String, Number],
  11. trindex: [String, Number],
  12. tdindex: [String, Number],
  13. x1: [String, Number],
  14. x2: [String, Number],
  15. y1: [String, Number],
  16. y2: [String, Number],
  17. rows: [String, Number],
  18. format: [String, Number],
  19. valueFormat: [String, Number],
  20. keyname: [String, Number],
  21. id: [String, Number],
  22. })
  23. //事件
  24. const emit = defineEmits(['blur', 'focus'])
  25. const uuid = getRandom(8)
  26. //渲染完成
  27. onMounted(()=> {
  28. matchingType()
  29. })
  30. //匹配组件类型
  31. const name = ref('')
  32. const typeObj = {
  33. text: '输入框',
  34. textarea: '多行输入框',
  35. date: '日期框',
  36. }
  37. const matchingType = () => {
  38. if (isNullES(props.type)) return
  39. name.value = typeObj[props.type]
  40. }
  41. const EVENT_KEY = 'hc-table-form-item'
  42. //左键点击了
  43. const isClick = ref(false)
  44. const leftTap = () => {
  45. isClick.value = true
  46. //const keyName = `${EVENT_KEY}-${props.id ? props.id : props.keyname ? props.keyname : uuid}`
  47. //emitter.emit(keyName, { key: 'focus', props: props })
  48. emit('focus', props)
  49. }
  50. //失去焦点
  51. const onClickOutside = () => {
  52. isClick.value = false
  53. //const keyName = `${EVENT_KEY}-${props.id ? props.id : props.keyname ? props.keyname : uuid}`
  54. //emitter.emit(keyName, { key: 'blur', props: props })
  55. emit('blur', props)
  56. }
  57. // 暴露出去
  58. defineExpose({
  59. focus: leftTap,
  60. blur: onClickOutside,
  61. })
  62. </script>
  63. <style scoped lang="scss">
  64. .hc-table-form-components-box {
  65. position: relative;
  66. display: flex;
  67. justify-content: center;
  68. align-items: center;
  69. padding: 5px;
  70. color: #606266;
  71. cursor: pointer;
  72. border: 1px solid #dbdbdb;
  73. border-radius: 3px;
  74. transition: border 0.2s;
  75. &:hover {
  76. border-color: #1682f1;
  77. background: #eddac4;
  78. }
  79. &.cur {
  80. border-color: #1682f1;
  81. background: #eddac4;
  82. }
  83. }
  84. </style>