mx-login-form-item.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <template>
  2. <uv-form-item :prop="prop">
  3. <template #label>
  4. <uv-text :text="label" :prefix-icon="icon" v-bind="titleBindings"/>
  5. </template>
  6. <uv-input v-model="model[prop]" v-bind="inputBindings" :placeholder="autoPlaceholder"
  7. :type="type" @update:modelValue="$emit('update:modelValue', $event)">
  8. <template v-for="(s, name) in $slots" #[name]>
  9. <slot :name="name"/>
  10. </template>
  11. </uv-input>
  12. </uv-form-item>
  13. </template>
  14. <script setup>
  15. /*NOTE: 必须设置父级uv-form.labelPosition=`top`来确保该组件的布局*/
  16. import {computed, ref} from 'vue'
  17. import {createPropDefine} from "@/utils";
  18. import {useInjectFormData} from "@/pages/login/components/hooks/useFormDataInjection";
  19. const props = defineProps({
  20. prop: createPropDefine(''),
  21. modelValue: createPropDefine(''),
  22. label: createPropDefine(''),
  23. placeholder: createPropDefine(''),
  24. icon: createPropDefine(''),
  25. type: createPropDefine(undefined)
  26. })
  27. defineEmits(['update:modelValue'])
  28. const [model] = useInjectFormData()
  29. const autoPlaceholder = computed(() => props.placeholder || '请输入' + props.label)
  30. const titleBindings = ref({
  31. color: 'var(--primary-color)',
  32. size: 20,
  33. iconStyle: {
  34. fontSize: '24px',
  35. color: 'var(--primary-color)'
  36. }
  37. })
  38. const inputBindings = ref({
  39. fontSize: 18,
  40. clearable: true,
  41. border: 'bottom',
  42. customStyle: {padding: '10px 0'}
  43. })
  44. </script>
  45. <style scoped>
  46. </style>