当前位置:   article > 正文

Vue + Element 实现动态表单_element 表单动态添加

element 表单动态添加

1. 需求:点击发送按钮新增一个表单并校验,校验通过调用后端接口,发送按钮禁用

优化:因为需求规定一个页面只需要出现三个question和answer表单就可以,所以可以设置重置按钮优化只能发送三条question的问题

应该存在更简单的写法,但我cai,嘿嘿嘿

表单初始状态

点击发送按钮,新增一条表单

2. 踩的坑

(1)去年用表格做过相似需求,但表格会有一些特有的奇怪东西,所以选择使用form表单

(2)关于表单校验问题,在data里写表单校验的规则时,会出现无法校验的情况,所以直接绑给了标签

(3)最开始使用普通数组计数循环实现表单的动态新增,el-form-item的值绑定的是question[index]类似的值,但效果不对,会出现很多奇怪的bug,所以选择循环form.formArr,问题表单绑定值为item.question

3. 页面布局

  1. <div class="container" v-loading="loading">
  2. <div class="content" v-for="(item, index) in form.formArr" :key="item.key">
  3. <div class="top-content" >
  4. <div class="question">
  5. <el-form :model="form" :rules="rules" ref="queryForm" label-width="70px">
  6. <el-form-item label="问题:"
  7. :prop="'formArr.' + index + '.question'"
  8. :rules="{ required: true, message: '问题不能为空', trigger: 'blur' }">
  9. <el-input
  10. type="textarea"
  11. clearable
  12. size="medium"
  13. :rows="2"
  14. :autosize="{ minRows: 2}"
  15. placeholder="请输入问题..."
  16. v-model="item.question">
  17. </el-input>
  18. </el-form-item>
  19. </el-form>
  20. <div class="button">
  21. <el-button :disabled="item.disabled" @click="sendHandle('queryForm', index)">发送</el-button>
  22. </div>
  23. </div>
  24. <div class="answer">
  25. <div class="label">回答:</div>
  26. <el-input
  27. v-model="item.answer"
  28. type="textarea"
  29. size="medium"
  30. :rows="2"
  31. :autosize="{ minRows: 2}"
  32. readonly>
  33. </el-input>
  34. </div>
  35. </div>
  36. </div>
  37. </div>

4. data部分

  1. data() {
  2. return {
  3. form: {
  4. formArr: [
  5. {
  6. question: "",
  7. answer: "",
  8. disabled: false
  9. }
  10. ]
  11. },
  12. answer: [],
  13. loading: false,
  14. }
  15. },

5. 函数部分

  1. sendHandle(formName, index) {
  2. this.$refs[formName][index].validate((valid) => {
  3. if (valid) {
  4. this.loading = true;
  5. let form = {
  6. question: this.form.formArr[index].question
  7. }
  8. getAnswer(form)
  9. .then(res => {
  10. if(res.code == 200) {
  11. for(var i = 0; i < res.result.length; i++) {
  12. if(res.result[i].role == 'assistant'){
  13. this.form.formArr[index].answer = res.result[i].content;
  14. }
  15. }
  16. // 需求规定:最多三条表单(可以添加重置按钮进行需求优化)
  17. if(this.form.formArr.length < 3) {
  18. this.form.formArr.push({
  19. question: '',
  20. answer: '',
  21. disabled: false
  22. });
  23. }
  24. this.loading = false;
  25. this.form.formArr[index].disabled = true;
  26. this.$message({
  27. type: 'success',
  28. message: '发送成功'
  29. })
  30. }
  31. })
  32. .catch(err => {
  33. console.log(err);
  34. })
  35. } else {
  36. return false;
  37. }
  38. });
  39. },

总结一下吧,希望不要再踩这个坑了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/91397
推荐阅读