Element+Vue实现动态表单(多个下拉框组件)

这篇具有很好参考价值的文章主要介绍了Element+Vue实现动态表单(多个下拉框组件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

表单的内容为巡检计划,巡检计划可以选择多个巡检点位,每个巡检点位可以选择多个设备和对应操作。

最终效果图

  • 点击加号图标增加一个下拉框
  • 减号图标删除对应下拉框
  • 下拉框备选项目相同
  • 点击设置动作按钮,弹出可编辑表格,可以为该巡检点位设置多个动作
    element表格下拉框,Vue学习,vue.js,javascript,前端
  • 表格每行内容可编
  • 设别名称下拉框和设备动作下拉框联动
  • 操作按钮可对选项进行上下排序element表格下拉框,Vue学习,vue.js,javascript,前端

代码实现

  1. 定义表单结构
<el-dialog :title="dialogTitle" :visible.sync="addDialogOpen" width="650px">
   <div class="dialogForm">
     <el-form :rules="rules" :model="addForm" ref="addForm" label-width="80px">	
		精简了无关代码
       <el-form-item label="巡检内容" prop="patrolContent">
         <div class="patrol-content">
           <div class="point">
           patrolContent元素个数控制下拉框的个数
           循环渲染
           每个div中包含一个下拉框、三个按钮
             <div class="point-item"
                  v-for="(item,index) in addForm.patrolContent"
                  :key="index">
               <div class="point-select">
                 <el-select v-model="item.point" class="selectItem" placeholder="请选择巡检点位(先选择地图)">
                   <el-option v-for="(item,index) in pointOptions"
                              :key="index"
                              :label="item.point_name"
                              :value="item.point_name">
                   </el-option>
                 </el-select>
                 <el-button size="mini" icon="el-icon-circle-plus" type="primary"
                            @click="addPointSelectItem(index)"/>
                 <el-button size="mini" icon="el-icon-remove" type="info"
                            @click="removePointSelectItem(index)"/>
                 <el-button size="mini" type="success"
                            @click="addDeviceAction(index)">设置动作
                 </el-button>
               </div>
             </div>
           </div>
         </div>
       </el-form-item>
     </el-form>
   </div>
</el-dialog>
  1. 在data()中定义需要绑定的模板变量
addForm: {
  patrolContent: [ //有多少个元素就渲染多少个下拉框
    {
      point: '', //点位
      children: [], //对应每个点位的具体动作
    }
  ]
}
  1. 定义增减下拉框的方法,实现动态增减
// 增加一个巡检点下拉框
addPointSelectItem(index) {
  this.addForm.patrolContent.splice(index + 1, 0,
      {
        point: '',
        children: [] //为空表示该点还未设置动作
      }
  )
},
// 删除一个巡检点下拉框
removePointSelectItem(index) {
  if (this.addForm.patrolContent.length > 1) {
    this.addForm.patrolContent.splice(index, 1)
  }
},

至此,已经实现了下拉框的动态增减,且下拉框的选项之间互不影响。
接下来继续实现每个点位可以配置不同的动作。

  1. 定义打开动作弹窗的函数

这里在打开弹窗时,首先获取到所点击的下拉框索引值index,index代表了该元素在patrolContent中的位置,通过index获取表格要绑定的变量(该元素中的children)。

// 在该点位添加动作:打开弹窗
addDeviceAction(index) {
  this.dialogTableData = this.addForm.patrolContent[index].children
  this.deviceDialogOpen = true
}
  1. 定义动作弹窗

在弹窗打开时,表格会根据children中的元素进行渲染。
表格借助v-if实现了编辑和确认编辑逻辑。
实现表格项的增删较为简单,增删children列表中的元素即可。文章来源地址https://www.toymoban.com/news/detail-608952.html

<el-dialog title="选择动作" :visible.sync="deviceDialogOpen" width="800px">
  <div class="device-dialog">
    <el-table :data="dialogTableData" border>
      <el-table-column align="center" label="序号" type="index" width="50"/>
      <el-table-column align="center" label="设备名称" prop="device">
        <template v-slot="scope">
          <el-select v-show="scope.row.edit" v-model="scope.row.device"
                     class="selectItem"
                     placeholder="选择设备"
                     @change="deviceSelectChange">
            <el-option value="机械臂" label="机械臂"/>
            <el-option value="升降台" label="升降台"/>
            <el-option value="摄像头" label="摄像头"/>
          </el-select>
          <span v-show="!scope.row.edit">
            {{ scope.row.device }}
          </span>
        </template>
      </el-table-column>
      <el-table-column align="center" label="设备动作" prop="action">
        <template v-slot="scope">
          <el-select v-show="scope.row.edit"
                     value-key="id"
                     v-model="scope.row.action"
                     class="selectItem"
                     placeholder="选择动作">
            <el-option v-for="item in actionOptions"
                       :key="item.label"
                       :value="item.value"
                       :label="item.label">
            </el-option>
          </el-select>
          <span v-show="!scope.row.edit">
            {{ scope.row.action['action_name'] }}
          </span>
        </template>
      </el-table-column>
      <el-table-column align="center" label="操作" width="300">
        <template v-slot="scope">
          <el-button size="mini" type="primary" v-show="!scope.row.edit" @click="editAction(scope.row)">编辑
          </el-button>
          <el-button size="mini" type="success" v-show="scope.row.edit" @click="scope.row.edit=!scope.row.edit">
            确定
          </el-button>
          <el-button size="mini" type="danger" @click="delAction(scope.$index)">删除</el-button>
          <el-button size="mini" type="primary" plain @click="upMoveItem(scope.$index)"
                     icon="el-icon-caret-top"></el-button>
          <el-button size="mini" type="warning" plain @click="downMoveItem(scope.$index)"
                     icon="el-icon-caret-bottom"></el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="footer">
      <el-button type="warning" @click="addAction">添加</el-button>
      <el-button type="primary" @click="deviceDialogOpen=false">确定</el-button>
    </div>
  </div>

</el-dialog>
  1. 实现表格项增减方法以及排序方法
// 弹窗-表格中增加一条数据
addAction() {
  this.dialogTableData.push({
    device: '', //绑定设备选项
    action: '', //绑定设备动作选项
    edit: true, // 默认可编辑
  })
},
// 弹窗-删除表格中的一条数据
delAction(index) {
  this.dialogTableData.splice(index, 1)
},
// 上移元素
upMoveItem(index) {
  let table = this.dialogTableData
  if (index !== 0) {
    table[index] = table.splice(index - 1, 1, table[index])[0]
  } else {
    table.push(table.shift())
  }
},
// 下移元素
downMoveItem(index) {
  let table = this.dialogTableData
  if (index !== table.length - 1) {
    table[index] = table.splice(index + 1, 1, table[index])[0];
  } else {
    table.unshift(table.splice(index, 1)[0]);
  }
},

总结

  • 需要明确嵌套层级,vue组件要绑定到正确的变量上
  • 为某个选项增加具体动作时,要获取到索引,这样才能根据索引获取该选项下的数据
  • 选项的增删和排序都利用了splice()函数

到了这里,关于Element+Vue实现动态表单(多个下拉框组件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用ElEment组件实现vue表单校验空值

    1.绑定表单组件数组rules 2.在data域中设定组件rules 3.设定调用方法函数 提交校验 取消: 测试页面 提交空值 失去焦点 取消重置 提交后重置

    2024年01月24日
    浏览(43)
  • 【vue组件】使用element-ui 实现三级联动下拉选择

    实现的思路是第一个下拉选择在选择了选项后将该选项的信息传递到接口请求下一个选项的内容,依次类推 然后在清除了上一级选择的选项后要将其次级和子孙级的选项都清除(包括选择里的列表内容) 下面看具体代码: 效果图:

    2024年02月11日
    浏览(62)
  • Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

    原创/朱季谦 最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。 简化的页面效果图如下: 最开始,我是用了纯粹的表格形

    2024年02月04日
    浏览(49)
  • Vue3 element-plus表单嵌套表格实现动态表单验证

    部分效果图如下: 另表格有添加和删除按钮,点击提交进行表单验证。 首先data格式必须是对象包裹数组 给表单绑定form数据 表格绑定tableData数据 给表单项增加验证规则 rules对应data rules对象,prop对应表单字段(注意是表格里每一行对应的字段 forms.tableData[下标].key) prop的关

    2024年02月14日
    浏览(44)
  • Vue element UI多个表单同时校验

    情况1:如下情景的多表单,两个表单之间没有任何关系。 假设两个表单绑定的ref分别是form1,form2;  也可以这样写:  情况2:如下情景的多表单,两个表单是通过for循环出来,所用的验证规则相同。

    2024年02月06日
    浏览(47)
  • element ui 下拉菜单组件 结合springboot 实现省市区简易三级联动 动态查询 并修改地点的省市区

    目录 前言: 一.数据库表结构:  二.下拉菜单组件 2.1 效果展示 2.2下拉菜单的组件代码: 本篇博客,通过官网的学习,实现下拉菜单动态数据的传递与点击事件,如果只是按部就班的按照官网来,官网下拉菜单模板所提供的事件只能传死数据,很多博主都是照虎画猫,传递

    2024年02月12日
    浏览(76)
  • vue+Element UI 实现动态表单(点击按钮增删表格及嵌套输入框的增删)(1)

    el-button size=“small” @click=“addTable”新增 el-button size=“small” @click=“delTable”删除 el-table ref=“table” :data=“tableDataBind.taAssessltems” tooltip-effect=“dark” border @selection-change=“selectRow” 规格: 重量: 数量: 加工费: el-button size=“mini” type=“primary” icon=“el-icon-circle-plus-ou

    2024年04月13日
    浏览(47)
  • vue element 动态生成表单

    场景:表单中的项是由后端返回的,不是前端提前定义好的。 需要注意的点: 1、因为表单上需要绑定v-model来获取此表单项的值,但是要绑的值名称是根据后端数据来的,所以请求回来后端的数据后再渲染整个表单,否则会报错【v-if=\\\"configLabelData\\\"】,根据请求到的后端数据

    2024年02月16日
    浏览(87)
  • Vue组件库Element-常见组件-Form表单

    Form表单 Form 表单:由输入框、选择器、单选框、多选框等控件组成,用以收集、检验、提交数据 具体关键代码如下: 运行效果如下:  点击最后一个按钮,并输入表格信息  点击提交   组件的使用最关键的就是仔细看官网文档,并且自己学会修改

    2024年02月12日
    浏览(29)
  • Vue3+Element-Plus 实现用户列表页面的UI结构及动态加载表单功能 三一

    1.1 头部是一个面包屑 (Breadcrumb)导航区域 1.2 白色区域是一个卡片(Card)视图 1.3 卡片 (Card)视图中嵌套了   输入框(Input )、 按钮(Button)、 表单(Form)、分页(Pagination ) Breadcrumb 面包屑 | Element Plus (gitee.io) https://element-plus.gitee.io/zh-CN/component/breadcrumb.html  2.1.1 复制

    2023年04月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包