x-form.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <!-- 表单 -->
  3. <view style="margin: 0rpx 20rpx 0rpx 30rpx;">
  4. <u--form :model="model" :rules="rules" labelPosition="left" ref="uForm" labelWidth="70">
  5. <view v-for="(item,index) in list" :key="index">
  6. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  7. v-if="item.type == 'input'">
  8. <view class="card_form_item">
  9. <u--input v-model="model[`${item.field}`]" :disabled="item.disabled ? true : false"
  10. :placeholder="item.placeholder"></u--input>
  11. </view>
  12. </u-form-item>
  13. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  14. v-else-if="item.type == 'select'">
  15. <view class="card_form_item">
  16. <u--input :placeholder="item.placeholder" suffixIcon="arrow-down"
  17. v-model="model[`${item.field}`]" @focus="change(item)"></u--input>
  18. </view>
  19. </u-form-item>
  20. <u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
  21. v-else-if="item.type == 'textarea'">
  22. <view class="card_form_item">
  23. <u--textarea v-model="model[`${item.field}`]" autoHeight
  24. :placeholder="item.placeholder"></u--textarea>
  25. </view>
  26. </u-form-item>
  27. </view>
  28. </u--form>
  29. <u-picker :defaultIndex="findIndex(model[fieldType], columns[0])" :show="show" :columns="columns"
  30. keyName="label" @confirm="confirm($event, fieldType)" @cancel="cancel"></u-picker>
  31. </view>
  32. </template>
  33. <script>
  34. export default {
  35. name: 'x-form',
  36. props: {
  37. list: {
  38. type: Array,
  39. default () {
  40. return []
  41. }
  42. },
  43. model: {
  44. type: Object,
  45. default () {
  46. return {}
  47. }
  48. },
  49. rules: {
  50. type: Object,
  51. default () {
  52. return {}
  53. }
  54. },
  55. },
  56. data() {
  57. return {
  58. show: false,
  59. columns: [],
  60. fieldType: '',
  61. }
  62. },
  63. // 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
  64. onReady() {
  65. this.$refs.uForm.setRules(this.rules);
  66. },
  67. methods: {
  68. change(e) {
  69. this.columns = []
  70. this.fieldType = e.field
  71. this.show = true
  72. this.$nextTick(() => {
  73. this.columns.push(e.options)
  74. })
  75. },
  76. // 选择确定
  77. confirm(value, type) {
  78. this.show = false
  79. this.model[type] = value.value[0].label
  80. },
  81. // 点击确定
  82. cancel() {
  83. this.show = false
  84. },
  85. findIndex(code, list) {
  86. if (!code || !list) {
  87. return [0]
  88. }
  89. return [list.findIndex((item) => (item.label === code || item.label === code))]
  90. },
  91. //子组件校验,传递到父组件
  92. async validateForm() {
  93. let flag = null
  94. await this.$refs.uForm.validate(valid => {}).then(res => {
  95. flag = true
  96. }).catch(err => {
  97. flag = false
  98. })
  99. return flag
  100. }
  101. },
  102. }
  103. </script>
  104. <style lang="scss">
  105. .card_form_item {
  106. width: 100%;
  107. }
  108. </style>