form.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <div id="add">
  3. <el-form ref="form" :model="form" :rules="rules" label-width="150px" class="form" size="small" @submit.native.prevent>
  4. <el-form-item v-for="(item, index) in fields" :key="'form-field-' + index" :label="getField('label', item)" :prop="item.model" :required="item.required">
  5. <template v-if="!item.custom">
  6. <!-- <template v-if="item.type === `date` || item.type === `datetime`">
  7. <date-select :value="form[item.model]" :type="item.type" :model="item.model" @handle="fieldChange" :placeholder="item.label"></date-select>
  8. <el-input :readonly="true" v-model="form[item.model]" @click.native="dateShow = true" :placeholder="`请选择时间`"></el-input>
  9. <van-action-sheet v-model="dateShow">
  10. <van-datetime-picker
  11. v-model="form[item.model]"
  12. type="date"
  13. :min-date="new Date(`1920/01/01`)"
  14. :max-date="new Date()"
  15. @cancel="show = false"
  16. @confirm="data => onDateSelect(data, item.model)"
  17. />
  18. </van-action-sheet>
  19. </template> -->
  20. <template v-if="item.type === 'select'">
  21. <el-select v-model="form[item.model]">
  22. <slot name="options"></slot>
  23. </el-select>
  24. </template>
  25. <template v-else>
  26. <el-input v-model="form[item.model]" :type="getField('type', item)" :placeholder="getField('placeholder', item)" v-bind="item.options"></el-input>
  27. </template>
  28. </template>
  29. <template v-else>
  30. <slot name="custom" v-bind="{ item, form, fieldChange }"></slot>
  31. </template>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-row type="flex" align="middle" justify="space-around">
  35. <el-col :span="6">
  36. <el-button type="primary" @click="save">保存</el-button>
  37. </el-col>
  38. <el-col :span="6">
  39. <el-button @click="$emit('cancel')">返回</el-button>
  40. </el-col>
  41. </el-row>
  42. </el-form-item>
  43. </el-form>
  44. </div>
  45. </template>
  46. <script>
  47. import _ from 'lodash';
  48. export default {
  49. name: 'add',
  50. props: {
  51. fields: { type: Array, default: () => [] },
  52. rules: { type: Object, default: () => {} },
  53. isNew: { type: Boolean, default: true },
  54. data: null,
  55. },
  56. components: {},
  57. data: () => ({
  58. form: {},
  59. display: undefined,
  60. show: false,
  61. dateShow: false,
  62. }),
  63. created() {},
  64. computed: {},
  65. mounted() {},
  66. watch: {
  67. data: {
  68. handler(val) {
  69. if (val) this.$set(this, `form`, this.data);
  70. },
  71. immediate: true,
  72. },
  73. },
  74. methods: {
  75. getField(item, data) {
  76. let res = _.get(data, item, null);
  77. if (item === 'type') res = res === null ? `text` : res;
  78. if (item === 'placeholder') res = res === null ? `请输入${data.label}` : res;
  79. if (item === 'required') res = res === null ? false : res;
  80. if (item === `error`) res = res === null ? `${data.label}错误` : res;
  81. return res;
  82. },
  83. save() {
  84. this.$refs['form'].validate(valid => {
  85. if (valid) {
  86. this.$emit(`save`, { isNew: this.isNew, data: this.form });
  87. } else {
  88. console.warn('form validate error!!!');
  89. }
  90. });
  91. },
  92. fieldChange({ model, value }) {
  93. this.$set(this.form, model, value);
  94. },
  95. onSelect(item, model) {
  96. this.$set(this, `display`, item.name);
  97. this.$set(this.form, model, item.value);
  98. this.show = false;
  99. },
  100. onDateSelect(item, model) {
  101. let date = new Date(item);
  102. this.$set(this.form, model, date.toLocaleDateString());
  103. // this.$emit('handle', { model: this.model, value: date.toLocaleDateString() });
  104. this.dateShow = false;
  105. },
  106. getDisplay(val) {
  107. this.$set(this, `display`, val);
  108. this.$set(this, `select`, new Date(val));
  109. },
  110. },
  111. };
  112. </script>
  113. <style lang="less" scoped>
  114. .form {
  115. padding: 2rem;
  116. background: #fff;border-radius: 20px;
  117. }
  118. </style>