index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <template lang="pug">
  2. div.comp
  3. el-drawer(:title="title" :visible.sync="isShow" direction="rtl" :size="sizeDrawer" @open="resetForm")
  4. el-form(size="small" :inline="true" :model="formData" :rules="formRules" ref="domForm" :label-width="wLabel")
  5. //- 表单录入组件规则, 动态 [字段, 占位符, ....]
  6. el-form-item(v-for="origin of originForm" :key="origin.prop" :label="origin.label" :prop="origin.prop")
  7. slot(v-if="origin.slot" :name="origin.slot")
  8. el-date-picker(v-else-if="origin.date" v-model="formData[origin.prop]" :disabled="origin.disabled" :type="origin.date.type" :value-format="origin.date.format" :placeholder="origin | formatPlaceholder('请选择')")
  9. el-select(v-else-if="origin.options" v-model="formData[origin.prop]" :disabled="origin.disabled" :placeholder="origin | formatPlaceholder('请选择')")
  10. el-option(v-for="option in origin.options" :key="option.value" :label="option.label" :value="option.value")
  11. el-input(v-else v-model="formData[origin.prop]" :type="origin.type" :disabled="origin.disabled" :placeholder="origin | formatPlaceholder('请输入')")
  12. template(slot="append" v-if="origin.unit")
  13. span {{ origin.unit }}
  14. div.comp-form-oper
  15. el-button(type="primary" size="small" @click="submitForm") {{ editData ? "修改" : "新增" }}
  16. el-button(type="plain" size="small" @click="resetForm") 重置
  17. </template>
  18. <script>
  19. export default {
  20. name: "drawer-form",
  21. props: {
  22. showForm: Boolean,
  23. title: String,
  24. // drawer 宽度
  25. sizeDrawer: {
  26. type: String,
  27. default: "50%"
  28. },
  29. // form 录入组件标题
  30. wLabel: {
  31. type: String,
  32. default: "140px"
  33. },
  34. // form 原始数据
  35. originForm: Array,
  36. // form 编辑对象
  37. editData: {
  38. type: Object,
  39. default: undefined
  40. }
  41. },
  42. data() {
  43. return {
  44. formData: {}, // 表单数据
  45. formRules: {}, // 验证规则
  46. resetData: {} // 重置对象
  47. };
  48. },
  49. computed: {
  50. isShow: {
  51. set(val) {
  52. this.$emit("update:showForm", val); // 只抛出不记录
  53. },
  54. get() {
  55. return this.showForm;
  56. }
  57. }
  58. },
  59. watch: {},
  60. filters: {
  61. formatPlaceholder(origin, preDef) {
  62. return origin.place ? origin.place : preDef + origin.label;
  63. }
  64. },
  65. created() {
  66. // 格式化数据源
  67. const formRules = {};
  68. const formReset = this.originForm.reduce((acc, cur) => {
  69. formRules[cur.prop] = cur.rule;
  70. acc[cur.prop] = cur.value;
  71. return acc;
  72. }, {});
  73. this.resetData = formReset;
  74. this.formRules = formRules;
  75. },
  76. mounted() {},
  77. methods: {
  78. submitForm() {
  79. this.$refs["domForm"].validate(valid => {
  80. if (!valid) return;
  81. this.isShow = false;
  82. this.$emit("handleSubmit", this.formData);
  83. });
  84. },
  85. resetForm() {
  86. if (this.$refs["domForm"]) {
  87. this.$refs["domForm"].resetFields();
  88. }
  89. this.formData = Object.assign({}, this.resetData, this.editData);
  90. }
  91. }
  92. };
  93. </script>
  94. <style scoped lang="stylus">
  95. .comp
  96. .el-input
  97. width 200px
  98. &-form-oper
  99. margin-top 70px
  100. text-align center
  101. .el-button
  102. margin 0 15px
  103. width: 40%
  104. </style>