index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <div class="form mb-4 last:mb-0" :style="options.style">
  3. <div class="mb-4">
  4. <component :is="getComponent(item)" :key="index" :options="item" :value.sync="formData[item.field]" v-for="(item, index) in options.children"></component>
  5. </div>
  6. <v-button :disable="success" :options="buttonOptions" @click="submit"></v-button>
  7. </div>
  8. </template>
  9. <script>
  10. import Base from '../base';
  11. import Dialog from 'vant/lib/dialog';
  12. import 'vant/lib/dialog/style';
  13. import { fetch } from '@/api/page.js'
  14. export default {
  15. name: 'v-form',
  16. extends: Base,
  17. data(){
  18. return {
  19. formData: {},
  20. loading: false,
  21. success: false,
  22. }
  23. },
  24. computed: {
  25. buttonOptions() {
  26. const { submit = {} } = this.options || {};
  27. return {
  28. text: '提交',
  29. ...submit,
  30. }
  31. }
  32. },
  33. created(){
  34. let {uuid} = this.$route.params;
  35. let param = localStorage.getItem(uuid);
  36. let jsonObj = {};
  37. if( param ){
  38. jsonObj= JSON.parse(param);
  39. }
  40. var data = {};
  41. this.options.children.forEach(item => {
  42. item.value = jsonObj[item.field]||'';
  43. data[item.field] = jsonObj[item.field]||undefined;
  44. });
  45. this.formData = data||{};
  46. },
  47. methods: {
  48. submit(){
  49. let errmsg;
  50. this.options.children.find(item => {
  51. if(!errmsg && item.required && !this.formData[item.field]) {
  52. errmsg = item.label;
  53. }
  54. })
  55. if(errmsg) {
  56. return Dialog.alert({
  57. message: `请填写${errmsg}`,
  58. })
  59. }
  60. let {uuid} = this.$route.params;
  61. if(this.loading) return;
  62. this.loading = true;
  63. const { formId, formName, formAction} = this.options;
  64. let param = Object.assign({formId, formName, formAction, uuid}, this.formData );
  65. localStorage.setItem( uuid, JSON.stringify(param) );
  66. fetch(formAction || '', param ).then(() => {
  67. this.loading = false;
  68. this.success = true;
  69. Dialog.alert({
  70. message: '提交成功',
  71. })
  72. }).catch((err) => {
  73. console.log("err", err)
  74. this.loading = false;
  75. Dialog.alert({
  76. message: err.message,
  77. })
  78. })
  79. },
  80. getComponent(node){
  81. return node.type ? `v-${node.type}` : 'div';
  82. },
  83. handleValue(key, value){
  84. this.formData[key] = value;
  85. }
  86. }
  87. }
  88. </script>
  89. <style lang="less" scoped>
  90. .form {
  91. background: rgba(255, 255, 255, 0.25);
  92. padding: 0.75rem 1rem;
  93. border: 1px solid rgba(255, 255, 255, 0.55);
  94. border-radius: 0.5rem;
  95. /deep/ .form-label {
  96. width: 5rem;
  97. padding: 0.5rem 0;
  98. font-size: 1rem;
  99. line-height: 1;
  100. }
  101. }
  102. </style>