VantField.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <template>
  2. <van-cell-group inset>
  3. <van-field
  4. v-model="dataModel"
  5. v-bind="props"
  6. :formatter="fieldFormatter"
  7. />
  8. </van-cell-group>
  9. </template>
  10. <script setup>
  11. import { ref, watch } from 'vue'
  12. const props = defineProps({
  13. modelValue: {
  14. type: [String, Number],
  15. default: ''
  16. },
  17. label: String,
  18. name: String,
  19. id: String,
  20. type: {
  21. default: 'text'
  22. },
  23. size: String,
  24. maxlength: [String, Number],
  25. placeholder: String,
  26. border: {
  27. type: Boolean,
  28. default: true
  29. },
  30. disabled: {
  31. type: Boolean,
  32. default: false
  33. },
  34. readonly: {
  35. type: Boolean,
  36. default: false
  37. },
  38. colon: {
  39. type: Boolean,
  40. default: false
  41. },
  42. required: {
  43. type: Boolean,
  44. default: false
  45. },
  46. center: {
  47. type: Boolean,
  48. default: false
  49. },
  50. clearable: {
  51. type: Boolean,
  52. default: false
  53. },
  54. clearIcon: {
  55. type: String,
  56. default: 'clear'
  57. },
  58. clearTrigger: {
  59. default: 'focus'
  60. },
  61. clickable: {
  62. type: Boolean,
  63. default: false
  64. },
  65. isLink: {
  66. type: Boolean,
  67. default: false
  68. },
  69. autofocus: {
  70. type: Boolean,
  71. default: false
  72. },
  73. showWordLimit: {
  74. type: Boolean,
  75. default: false
  76. },
  77. error: {
  78. type: Boolean,
  79. default: false
  80. },
  81. errorMessage: String,
  82. errorMessageAlign: {
  83. default: 'left'
  84. },
  85. formatter: String,
  86. formatTrigger: {
  87. default: 'onChange'
  88. },
  89. arrowDirection: {
  90. type: String,
  91. default: 'right'
  92. },
  93. labelClass: [String, Array, Object],
  94. labelWidth: [String, Number],
  95. labelAlign: {
  96. default: 'left'
  97. },
  98. inputAlign: {
  99. default: 'left'
  100. },
  101. autosize: {
  102. type: Boolean,
  103. default: false
  104. },
  105. leftIcon: String,
  106. rightIcon: String,
  107. iconPrefix: {
  108. type: String,
  109. default: 'van-icon'
  110. },
  111. rules: Array,
  112. autocomplete: String,
  113. enterkeyhint: String
  114. })
  115. const emit = defineEmits(['update:modelValue'])
  116. const dataModel = ref(props.modelValue)
  117. // 配置示例:"formatter": "return val.replace(/\\d/g, '')"
  118. const fieldFormatter = (val) => {
  119. return val && props.formatter ? new Function('val', props.formatter)(val) : val
  120. }
  121. watch(dataModel, (val) => {
  122. emit('update:modelValue', val)
  123. })
  124. </script>