别写死表单了!el-form 动态化 + 智能全选 + 数据联动,这才是高端操作

在这里插入图片描述
关注公众号可免费查看vip文章
在这里插入图片描述

如图所示,
需求如下:

  1. 用户选择了设备(不确定数量),需要根据当前设备的路数动态生成表单,且各表单独立。
  2. 每个表单可独立查看参数,且每组要整体计算总容量。
  3. 每个表单可单选,和全选(所有设备都选中),可通过右上角按钮统一更改所有表单数据。

直接上代码:

一、先生成数据结构

// 通过已有的设备数,动态生成form及选择项等数据结构
middleList = [
	{
   
   isno: '23133', pvLen: '3'},
	{
   
   isno: '23334', pvLen: '6'}
]
// map可生成一个新数组,且预制了数据结构,方便后续数据双向绑定。
this.step2List = middleList.map(item => {
   
   
          return {
   
   
            ...item,
            totalCap: 0,
            vForList: Array.from({
   
    length: Number(item.pvLen)}, (_, i) => {
   
   
              return {
   
   
                check: false,
                showFlag: false,
                index: i,
                modelTypeList: [],
                formList: {
   
   
                  index: i,
                  company: '',
                  model: '',
                  cAmount: undefined,
                  cap: '',
                },
                descList,
              }
            }),
          }
        })

二、表单结构一览

<div class="flex justify-between items-center w-full">
   <div class="all-select">
     // 是否全选,主要依赖indeterminate 和 v-model,indeterminate可控制半选效果,isAllSelected用于全选和未选效果。
     <el-checkbox :indeterminate="isIndeterminate" v-model="isAllSelected" @change="handleSelectAll">
       全选
     </el-checkbox>
   </div>
   <div>
     <el-button 
       type="primary" 
       size="small" 
       :disabled="!canBatchSet"
       @click="visible = true"
     >
       批量组件设置
     </el-button>
   </div>
</div>
<div class="flex flex-col">
// 表单结构,所见即所得,通过v-for嵌入v-for,可以实现多组,且多子项的渲染。
 <div v-for="item in step2List" :key="item.isno" class="inv-item">
   <div class="flex justify-between items-center inv-head">
     <div>{
   
   {
   
   $t('diagnosis.inverterSerialNumber')}}{
   
   {
   
    item.isno }}</div>
     <div>{
   
   {
   
   $t('diagnosis.totalCapacity')}}{
   
   {
   
    item.totalCap ? item.totalCap : '-'}}</div>
   </div>
   <div class="flex flex-col pv-item">
     <div v-for="(it, index) in item.vForList" :key=
### 实现 Element UI 表格分页后的当前页全选Element UI 的 `el-table` 组件中实现仅根据分页后显示的数据进行全选操作,可以通过监听表格的选择变化事件并控制选择状态来完成。具体方法如下: #### 1. 创建基础表格结构 首先构建带有分页功能的基础表格结构,并设置表头的选择框。 ```html <template> <div> <el-table ref="multipleTable" :data="currentPageData" @selection-change="handleSelectionChange"> <el-table-column type="selection"></el-table-column> <!-- 其他列定义 --> </el-table> <el-pagination layout="prev, pager, next" :total="tableData.length" :page-size="pageSize" @current-change="handlePageChange"> </el-pagination> </div> </template> ``` 此部分代码展示了如何初始化一个具有分页能力的表格以及关联的选择框列[^2]。 #### 2. 控制器逻辑编 接着,在 Vue.js 中添加控制器逻辑用于处理页面切换和全选行为。 ```javascript export default { data() { return { tableData: [], // 所有数据源 currentPageData: [], // 当前页码对应的数据集合 pageSize: 10, selectedRows: [] }; }, methods: { handlePageChange(pageNumber) { const start = (pageNumber - 1) * this.pageSize; const end = pageNumber * this.pageSize; this.currentPageData = this.tableData.slice(start, end); // 清除之前的选择项 this.$refs.multipleTable.clearSelection(); // 如果存在已保存的选择,则恢复这些选项的状态 if(this.selectedRows && this.selectedRows.length){ setTimeout(() => { this.restoreSelectedItems(); }, 0); } }, restoreSelectedItems(){ let currentIds = new Set(this.currentPageData.map(item=>item.id)); this.selectedRows.forEach(row=>{ if(currentIds.has(row.id)){ this.$nextTick(()=>{ this.$refs.multipleTable.toggleRowSelection(row,true); }); } }) }, handleSelectionChange(selections) { this.selectedRows = selections; // 记录下被选中的行 // 判断是否应该触发全选按钮的变化 if (this.currentPageData.length === selections.length) { console.log('All items on the page are selected'); } else { console.log('Not all items on the page are selected'); } } } } ``` 上述 JavaScript 方法实现了当用户改变页数时更新显示的数据列表,并通过清除旧的选择记录再重新应用新的选择状态来保持一致性。 #### 3. 添加全选按钮及其交互逻辑 最后一步是在界面上增加一个全选/取消全选的功能按钮,并绑定相应的点击事件处理器。 ```html <button @click="toggleSelectAll">Toggle Select All</button> ``` ```javascript methods:{ ..., toggleSelectAll() { if (!this.allChecked()) { this.selectAll(true); } else { this.deselectAll(); } }, selectAll(isCheck=true){ this.$refs.multipleTable.clearSelection(); this.currentPageData.forEach((row)=>{ this.$nextTick(()=>{this.$refs.multipleTable.toggleRowSelection(row,isCheck)}); }); }, deselectAll(){ this.$refs.multipleTable.clearSelection(); }, allChecked(){ return this.currentPageData.every((row)=> this.selectedRows.some(selectedRow=>selectedRow.id===row.id) ); } } ``` 这段代码片段提供了两个辅助函数分别用来执行全选(`selectAll`)和反向操作即取消所有选择(`deselectAll`);还有一个判断当前页内项目是否已经被完全勾选的方法(`allChecked`)。而`toggleSelectAll()`则负责响应用户的点击动作去调用这两个主要的操作之一[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值