根据多选的选择,动态匹配/生成接口里面的数据

news2024/11/24 20:41:20

最近遇到一个需求,一开始以为接口里面只会返回三个数据,就直接调取接口,页面写三个html结构接口数据放在那里了,后来接口又加了两条,因为前端这边没写结构,就没出来…
所以直接给他改为动态匹配的,不管后续后台这边添加多少条,都能保证数据出来
我的路径:之后看src\views\partner\partner\index.vue

页面为这样的:
在这里插入图片描述
根据选中的,去匹配下面的内容显示; 后台分了两个接口去区分: 一个接口显示上面的name部分
一个是下面的期数,期数接口传递当前id,上面有多少个name,就把他的相应id传递给第二个接口
第一个接口:
在这里插入图片描述
第二个接口:
在这里插入图片描述
根据他上面list里面有多少个id就会匹配当前id的全部期数

接下来直接上代码:

        <el-form-item required label="配置">
          <el-checkbox-group
            v-model="checkList"
            class="checkbox-group"
            @change="updatePartnerProducts"
          >
            <template v-for="(item, index) in labelsList">
              <el-checkbox
                v-if="item.code !== 'INTEGRAL_ENJOY_FIRST'"
                :key="index"
                :label="item.id"
                >{{ item.name }}</el-checkbox
              >
            </template>
          </el-checkbox-group>
          <div
            v-for="(item, index) in checkListOrder"
            :key="index + 'check'"
            class="settings-container"
          >
            <div v-if="item == 3">
              <el-form-item label="使用条件:" required class="settings-container">
                <el-radio-group
                  v-model="cashRadio"
                  class="vert-radio-group"
                  @change="handleCashRadioChange"
                >
                  <el-radio label="LIMIT">
                    积分等级限制
                    <span style="margin-left: 30px">等级达到:</span>
                    <el-select
                      v-model="level"
                      style="width: 170px"
                      clearable
                      placeholder="请选择"
                    >
                      <el-option
                        v-for="item in levels"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value"
                      />
                    </el-select>
                  </el-radio>
                  <el-radio label="DEDUCT">
                    抵扣积分
                    <span style="margin-left: 30px">需要抵扣积分:</span>
                    <el-input
                      v-model="integralNum"
                      placeholder="请输入积分"
                      style="width: 170px"
                      autocomplete="off"
                    />
                  </el-radio>
                  <el-radio label="NON"></el-radio>
                </el-radio-group>
              </el-form-item>
            </div>
            <div>
              <el-form-item
                label-width="170px"
                :label="labelNames[`checkListSetting${item}`] + '设置:'"
                required
                class="settings-container"
              >
                <el-checkbox-group
                  v-model="getDynamicCheckListSettings()[`checkListSetting${item}`]"
                  @change="updatePartnerProducts"
                  class="checkbox-grid"
                >
                  <el-checkbox
                    v-for="n in dynamicAllTerms[`allTerms${item}`]"
                    @change="handleCheckboxChange(item, n, $event)"
                    :key="n"
                    :label="n"
                    >{{ n }}</el-checkbox
                  >
                </el-checkbox-group>
              </el-form-item>
            </div>
          </div>
        </el-form-item>
data(){
return{
  checkList: [],//当前选中的id
  dynamicData: {},
 }
}
  created() {
    listProduct({ pageNum: 1, pageSize: 10, type: "CASH_LOAN" })
      .then((res) => {
        this.labelsList = res.rows;
        console.log("类型期数返回的res---", res);
        return Promise.all(this.labelsList.map((label) => listProductParams(label.id)));  //promise.all()等所有的请求执行完毕之后才会执行下面的
      })
      .then((products) => {
        console.log("products的值===", products);
        this.originProducts = cloneDeep(products);
        products.forEach((res, i) => {
          const termList = res.data.map((item) => item.term); //拿到他们的期数
          let list = res.data || [];
          if (list.length > 0) {
            let flist = this.labelsList.filter((item1) => item1.id == list[0].productId);
            this.$set(this.dynamicData, `checkListSetting${flist[0].id}`, termList); //选中
            this.$set(
              this.dynamicData,
              `allTerms${flist[0].id}`,
              Array.from(new Set(termList))
            ); //循环期数
          }
        });
      });
  },
  computed: {
  后续一个排序问题,用这段解决
    checkListOrder() {
      let ids = this.labelsList.map((item) => item.id);
      return this.sortByOrder(this.checkList, ids);
    },
    // 根据id匹配name
    labelNames() {
      let obj = this.labelsList.reduce((acc, item) => {
        acc[`checkListSetting${item.id}`] = item.name; // 初始化每个动态数组
        return acc;
      }, {});
      return obj;
    },
    //动态期数
    dynamicAllTerms() {
      let obj = this.checkList.reduce((acc, item) => {
        acc[`allTerms${item}`] = this.dynamicData[`allTerms${item}`]; 
        return acc;
      }, {});
      return obj;
    },
  },
    getDynamicCheckListSettings() {
      let obj = this.checkList.reduce((acc, item) => {
        acc[`checkListSetting${item}`] = this.dynamicData[`checkListSetting${item}`];
        return acc;
      }, {});
      return obj;
    },
    handleCheckboxChange(item, n, event) {
      this.updateDynamicData(item, n, event);
    },
    updateDynamicData(item, n, value) {
      // 强制双向绑定
      if (value) {
        let list = cloneDeep(
          this.getDynamicCheckListSettings()[`checkListSetting${item}`]
        );
        list.push(n);
        this.$set(this.dynamicData, `checkListSetting${item}`, list);
      } else {
        let list = cloneDeep(
          this.getDynamicCheckListSettings()[`checkListSetting${item}`]
        );
        list = list.filter((item1) => item1 != n);
        this.$set(this.dynamicData, `checkListSetting${item}`, list);
      }
    },
//watch也要监听他的值,当选择发生变化时,获取最近的数据
  watch: {
    level: {
      handler() {
        this.updatePartnerProducts();
      },
      deep: true,
    },
    integralNum: {
      handler() {
        this.updatePartnerProducts();
      },
      deep: true,
    },
    checkList: {
      handler() {
        this.updatePartnerProducts();
      },
      deep: true,
    },
    cashRadio: {
      handler() {
        this.updatePartnerProducts();
      },
      deep: true,
    },
  },
    updatePartnerProducts() {
      // 清空partnerProducts
      this.form.partnerProducts = [];
      this.checkList.forEach((item) => {
        const product = this.labelsList.find((item1) => item1.id == item);
        if (product) {
          let newObj = {
            productCode: product.code,
            // useCondition: this.cashRadio,
            productType: product.type,
            productId: product.id,
            conditionPeriods: this.getDynamicCheckListSettings()[
              `checkListSetting${item}`
            ].join(","),
          };
          if (item == 3) {
            newObj = {
              ...newObj,
              useCondition: this.cashRadio,
            };
            if (this.cashRadio === "LIMIT") {
              newObj = {
                ...newObj,
                conditionVal: this.level,
              };
            } else if (this.cashRadio === "DEDUCT") {
              newObj = {
                ...newObj,
                conditionVal: this.integralNum,
              };
            }
          }
          this.form.partnerProducts.push(newObj);
        }
      });
    },

编辑回显方法:

    initFormValues(partnerProducts) {
      this.checkList = partnerProducts
        .map((item) => item.productId || "")
        .filter((e) => e);
      partnerProducts.forEach((item) => {
        this.$set(
          this.dynamicData,
          `checkListSetting${item.productId}`,
          item.conditionPeriods.split(",").map(Number)
        );
        if (item.productId == 3) {
          this.cashRadio = item.useCondition;
          if (this.cashRadio === "LIMIT") this.level = item.conditionVal;
          if (this.cashRadio === "DEDUCT") {
            this.integralNum = item.conditionVal;
          }
        }
      });
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1834321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷代码随想录有感(107):动态规划——01背包/最后一块石头的重量||

题干&#xff1a; 代码&#xff1a; class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int>dp(15001, 0);int sum 0;for(int i : stones){sum i;}int target sum / 2;for(int i 0; i < stones.size(); i){for(int j targ…

如何正确操作工业高温烤箱

高温烤箱广泛应用于陶瓷、丝印、汽车配件、电子、机电、通讯、化工、器材、印刷、制药、工业、橡胶、油漆、食品之烘烤、水份干燥、预热等用途。那么要想工业高温烤箱在使用的过程中能够正常运行&#xff0c;那么正确的操作是必不可少的&#xff0c; 1、防止触电&#xff1a;高…

文章MSM_metagenomics(九):偏差图、UpSet图、棒棒糖图

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程旨在通过不同的图表来可视化微生物组的生物标志物。 数据 大家通过以下链接下载数据…

05眼动识别软件详情2波形优化-滤波

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 05眼动识别软件详情2 对应视频链接点击直达期望的数据展示数据波形对比如何实现几种常用滤波介绍维纳滤波巴特沃斯滤波器中值滤波排序滤波 推荐 结语其他以下是废话 原始数据的波…

大型工业烤箱工作原理及结构特点有哪些

在工业领域&#xff0c;大型工业烤箱以其高效的干燥能力和稳定的性能得到了广泛的应用。无论是电子产品的生产&#xff0c;还是化工材料的制备&#xff0c;甚至是食品加工&#xff0c;大型工业烤箱都发挥着不可或缺的作用。那么&#xff0c;大型工业烤箱是如何工作的?它的结构…

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…

SpringSecurity6从入门到实战之自定义登录页面

SpringSecurity6从入门到实战之自定义登录页面 在使用SpringSecurity进行认证操作的时候,可以发现默认提供的登录页面比较简陋.那么我们能否对登录页面进行自定义配置呢?接下来开始讲解应该如何进行配置 自定义登录页面流程 引入模板依赖 由于自定义登录页面会使用到前端相关…

树与图的深度优先遍历——AcWing.846树的重心

树与图的深度优先遍历 定义 从图的某个顶点出发&#xff0c;沿着一条路径尽可能深地访问图中顶点。 运用情况 图的连通性判断。寻找特定路径或回路。 注意事项 要标记已访问的节点&#xff0c;以避免重复访问导致死循环。对于有向图和无向图可能需要不同的处理。 解题思…

mysql数据库中触发器的使用

一、修改分隔符号 delimiter $$或者是//或者~~都行 二、创建触发器函数名称 create trigger 函数名 三、什么样的操作出发&#xff0c;操作那个表 after&#xff1a;.....之后触发 befor&#xff1a;.....之前触发 insert&#xff1a; 插入触发 update&#xff1a;修改被触发 d…

鸿蒙APP开发的技术难点

鸿蒙APP开发的技术难点主要体现在以下几个方面&#xff0c;鸿蒙APP开发是一项技术难度较高的工作&#xff0c;需要开发者具备扎实的编程基础、分布式开发能力和学习新技术的意愿。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 多…

充电宝什么牌子好?买多少毫安充电宝合适?这几个误区别踩!

在选择充电宝时&#xff0c;很多消费者常常被各种品牌和容量规格搞得眼花缭乱。不少人认为&#xff0c;容量越大越好&#xff0c;但事实并非如此。其实&#xff0c;根据日常使用需求&#xff0c;选择10000毫安的充电宝已经足够应对大多数情况。10000毫安的充电宝不仅能够满足手…

css-padding

文章目录 paddingpadding与元素的尺寸对于block块状水平元素复杂关系影响元素尺寸不影响元素尺寸最小宽度显示 关系总结 对于inline内联水平元素复杂关系水平padding影响尺寸垂直padding影响背景色区域 padding负值和百分比值负值百分比值inline水平元素的padding的百分比值空i…

WPF 深入理解三、控件结构

控件结构 演示&#xff1a; 思考疑问 为什么有一些元素是Content显示内容,而一些元素是Text显示内容? 凡是继承于Contentcontrol的控件,他们的定义内容用Content&#xff0c;除了TextBlock使用的是Text,大部分都是Content设置其显示内容。 为什么有一些元素有Padding,而一些元…

铁砧帝国延迟高?铁砧帝国延迟严重这样解决

铁砧帝国是一款少见的多人在线游戏&#xff0c;游戏能支持上千名玩家建立帝国并互相作战。而且这款游戏在细节方面也做足准备&#xff0c;设计了攻城梯和攻城锤等设备&#xff0c;以攻破坚固的城墙和要塞&#xff0c;不过具体获取方法就需要玩家自己摸索。因为最近开放了测试申…

Vue3基础介绍

文章目录 一、简介1、简介2、性能提升3、源码升级4、拥抱TypeScript5、新特性 二、创建Vue3.0工程1、使用vue-cli创建2、使用vite创建 三、分析工程结构1、main.js2、组件中 一、简介 1、简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号(One Piece)海贼王 …

K8sGPT+Ollama:免费的 Kubernetes 自动化诊断方案

周末检查博客草稿&#xff0c;发现了这篇。记得当时是与 Kubernetes 自动化诊断工具&#xff1a;k8sgpt-operator 一起写的&#xff0c;算算过去了一年之久&#xff0c;这拖延症也算是病入膏肓了。原本想使用 K8sGPT LocalAI 的方案&#xff0c;由于之前试过 Ollama&#xff0…

OpenMMlab AI实战营第五、六期培训

OpenMMlab AI实战营第五、六期培训 OpenMMlab实战营第五、六次课2023.2.7-9学习参考第五次课笔记第六次课笔记一、什么是语义分割二、语义分割 v.s. 实例分割 v.s. 全景分割三、语义分割经典模型1.语义分割的基本思路2.**复用卷积计算**3.全连接层的卷积化4.预测图的升采样5.双…

Stable Diffusion 3 Medium 正式开源,用户对此产品评价如何?

前两天 Stability.AI 终于开源了 Stable Diffusion 3&#xff0c;虽然只是中杯的 Medium 版本&#xff0c;没有放出当初宣布的 8B 版本[1]&#xff0c;但也在很多方面取得了进步。本想第一时间尝鲜测试&#xff0c;但这几天出差在外&#xff0c;使用颇不方便。 正好老朋友揽睿…

HTTP/3 协议学习

前一篇&#xff1a; HTTP/2 协议学习-CSDN博客 HTTP/3 协议介绍 HTTP/3 是互联网上用于传输超文本的协议 HTTP 的第三个主要版本。它是 HTTP/2 的后继者&#xff0c;旨在进一步提高网络性能和安全性。HTTP/3 与前两个版本的主要区别在于它使用了一个完全不同的底层传输协议—…

安泰电压放大器的选型原则是什么

电压放大器是电子电路中常用的一种器件&#xff0c;主要用于放大输入电压信号。在选型电压放大器时&#xff0c;需要考虑以下几个原则。 根据应用需求确定放大倍数。放大倍数是指输出电压与输入电压之间的倍数关系&#xff0c;也称为增益。不同的应用场景对放大倍数的要求不同&…