x-form.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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' && customerName(item)">
  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. customerName(value) {
  69. var userInfo = this.$cache.getCache('userInfo')
  70. if (userInfo.userType == 'customer') {
  71. if (value.field != 'customerName') {
  72. if (value.type == 'input') {
  73. return true
  74. }
  75. }
  76. } else {
  77. if (value.type == 'input') {
  78. return true
  79. }
  80. }
  81. },
  82. change(e) {
  83. this.columns = []
  84. this.fieldType = e.field
  85. this.show = true
  86. this.$nextTick(() => {
  87. this.columns.push(e.options)
  88. })
  89. },
  90. // 选择确定
  91. confirm(value, type) {
  92. this.show = false
  93. this.model[type] = value.value[0].label
  94. },
  95. // 点击确定
  96. cancel() {
  97. this.show = false
  98. },
  99. findIndex(code, list) {
  100. if (!code || !list) {
  101. return [0]
  102. }
  103. return [list.findIndex((item) => (item.label === code || item.label === code))]
  104. },
  105. //子组件校验,传递到父组件
  106. async validateForm() {
  107. let flag = null
  108. await this.$refs.uForm.validate(valid => {}).then(res => {
  109. flag = true
  110. }).catch(err => {
  111. flag = false
  112. })
  113. return flag
  114. }
  115. },
  116. }
  117. </script>
  118. <style lang="scss">
  119. .card_form_item {
  120. width: 100%;
  121. }
  122. </style>