首页 > 其他分享 >Vue动态增添表单并赋予增删上下移动等操作

Vue动态增添表单并赋予增删上下移动等操作

时间:2022-12-08 16:01:23浏览次数:40  
标签:index arr Vue dynamicItem 表单 addNewOptionForm splice 增删 message

Vue动态增添表单并赋予增删上下移动等操作

开发需求:前端设计一个表单,依据题目类型,判断是否需要添加内容,若需添加,则可以动态增删、上下移动调整顺序等

开发难点:需根据实际逻辑(如:第一项内容不可删除、上移等),注意按钮的禁用

开发效果:

image.png image.png image.png image.png

具体实现:

<!--弹窗:修改问卷题目-->
    <el-dialog
      title="修改问卷题目"
      :visible.sync="dialogModifyQuestionnaire"
      center
    >
      <el-form
        ref="modifyForm"
        :model="modifyForm"
        label-width="80px"
        :label-position="modifyForm.labelPosition"
      >
        <el-form-item label="题目名称">
          <el-input v-model="modifyForm.name"></el-input>
        </el-form-item>
        <el-form-item label="题目类型">
          <el-select v-model="modifyForm.value" placeholder="请选择题目类型">
            <el-option
              v-for="item in modifyForm.options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="分数">
          <el-input v-model="modifyForm.score"></el-input>
        </el-form-item>
        <el-form-item label="描述">
          <el-input type="textarea" v-model="modifyForm.description"></el-input>
        </el-form-item>
        <el-divider></el-divider>
        <!--若是单选或多选添加新选项功能-->
        <el-form
          v-show="modifyForm.value != '问答'"
          :inline="true"
          ref="addNewOptionForm"
          :model="addNewOptionForm"
          :label-position="addNewOptionForm.labelPosition"
        >
          <div v-for="(item, index) in addNewOptionForm.dynamicItem" :key="index">
            <el-form-item :label="('选项内容' + (index+1))">
              <el-input
                v-model="item.content"
                placeholder="请输入选项内容"
              ></el-input>
            </el-form-item>
            <el-form-item>
              <el-input
                v-model="item.weight"
                placeholder="得分权重"
              ></el-input>
            </el-form-item>
            <el-button type="danger" :disabled="(index==0)" @click="deleteItem(item, index)">删除</el-button>
            <el-button icon="el-icon-top" :disabled="(index==0)" @click="upItem(index)" circle></el-button>
            <el-button icon="el-icon-bottom" :disabled="(index==addNewOptionForm.dynamicItem.length-1)" @click="downItem(index)" circle></el-button>
            <br />
            <el-button icon="el-icon-plus" v-if="((index+1) == addNewOptionForm.dynamicItem.length)" @click="addItem"></el-button>
          </div>
        </el-form>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button
          style="position: absolute; right: 100px; bottom: 10px"
          @click="dialogModifyQuestionnaire = false"
          >关闭</el-button
        >
        <el-button
          type="primary"
          style="position: absolute; right: 10px; bottom: 10px"
          @click="submitModifyQuestionnaire"
          >保存</el-button
        >
      </div>
    </el-dialog>
export default {
  name: "index",
  data() {
      dialogModifyQuestionnaire: false,
      // 修改问卷表格
      modifyForm: {
        labelPosition: "left",
        name: "",
        // 默认
        value: "问答",
        options: [
          { value: "单选", label: "单选" },
          { value: "多选", label: "多选" },
          { value: "问答", label: "问答" },
        ],
        score: "",
        description: "",
      },
      // 新增选项表格
      addNewOptionForm: {
        labelPosition: "left",
        dynamicItem: [
          {
            content: "",
            weight: ""
          }
        ]
      },
    };
  },
  methods: {
    // 提交修改操作
    submitModifyQuestionnaire() {
      this.$message({
        message: "恭喜你,修改问卷成功~",
        type: "success",
      });
      this.dialogModifyQuestionnaire = false;
    },
    // 添加选项内容
    addItem() {
      this.addNewOptionForm.dynamicItem.push({
        content: "",
        weight: ""
      })
    },
    // 删除选项内容
    deleteItem(item, index) {
      this.addNewOptionForm.dynamicItem.splice(index, 1)
      this.$message({
        message: "删除成功哟~",
        type: "success",
      })
    },
    // 上移动选项操作
    upItem(index) {
      let arr = this.addNewOptionForm.dynamicItem
      arr.splice(index-1, 1, ...arr.splice(index, 1, arr[index-1]))
    },
    // 下移选项操作
    downItem(index) {
      let arr = this.addNewOptionForm.dynamicItem
      arr.splice(index, 1, ...arr.splice(index+1, 1, arr[index]))
    }
  },
};

标签:index,arr,Vue,dynamicItem,表单,addNewOptionForm,splice,增删,message
From: https://www.cnblogs.com/wangzheming35/p/16966345.html

相关文章

  • vue3 el-pagination 将 英文 修改 为 中文
    当前视图:我要做的是将Total类似的英文改为中文 1. 在组件里引入 ElConfigProvider组件和中文包//ElConfigProvider组件import{ElConfigProvider}f......
  • vue table表格实现无缝滚动 鼠标进入可悬停
    <el-tableref="table":data="tableData":header-cell-style="{background:'#F0F2F7',colo......
  • Vue3中 v-model 语法糖运用
    一、介绍在Vue2.0发布后,开发者使用v-model指令时必须使用名为value的prop。如果开发者出于不同的目的需要使用其他的prop,就不得不使用v-bind.sync。此外,由于v-mo......
  • 在线直播系统源码,vue+audio 有新消息时加提示音
    在线直播系统源码,vue+audio有新消息时加提示音<audiocontrols="controls"hiddensrc="./static/tip.mp3"ref="audio"></audio>​有新消息时,用以下代码即可播放指定......
  • 快速生成Vue2模板
    1.点击文件,再点击首选项,然后选择用户片段; 2.在弹出来的输入框中,选择第一行vue.json或者第二行新建全局代码片段文件都可,都是为了打开vue.json文件;  3.显示这种情......
  • 通过迭代器对list集合中的元素进行增删改操作
    packagecom.liftsail.qiniurefererdemo.test;importjava.util.ArrayList;importjava.util.List;importjava.util.ListIterator;/***@Author:liftsail*@Da......
  • # vue element-ui日期选择器限制90天范围
    #vueelement-ui日期选择器限制90天范围<el-form-itemlabel="开票时间"><el-date-pickerv-model="listQuery.test"t......
  • vue+iview 表格行选中修改背景色
    <Table:columns="columns":no-data-text="L('NoDatas')"border:data="list":row-class-name="rowName"@on-row-click="selectChange......
  • Vue组件
    什么是组件组件是可复用的Vue实例,说白了就是一组可以重复使用的模板,跟JSTL的自定义标签,Thymeleaf的th:fragment等框架有着异曲同工之妙。通常一个应用会以一颗嵌套的......
  • vue上传formdata格式数据(axioes)
    vue.js上传formData数据到后台(其他js类似) 调用方式还是通过post方式请求类型要设置一下config.headers["content-type"]="multipart/form-data"; 然后上传......