vue动态属性不更新和You may have an infinite update loop in a component的解决方案

该博客主要介绍了在Vue组件中遇到的数据更新与视图渲染问题,以及可能出现的无限更新循环错误。作者通过示例代码展示了如何使用`$set`解决数据更新但视图未渲染的问题,并提供了处理无限更新循环的解决方案,即在数据处理完毕后再进行渲染,并添加了一个数据处理完成的标识`isFinished`。同时,博客还包含了具体的组件代码片段,用于展示如何在组件中正确管理和渲染数据。
摘要由CSDN通过智能技术生成

1、实现效果
在这里插入图片描述
需求:显示每种类型的每种错误类型的失败数据
问题1:数据更新了,但是视图不渲染
解决方案:使用$set

 this.$set(this.dataObj, prop, {});
        this.$set(this.dataObj[prop], "activeData", []);
        this.$set(this.dataObj[prop], "activeName", "");

        // this.dataObj[prop] = {};
        // this.dataObj[prop].activeData = [];
        // this.dataObj[prop].activeName = "";

问题2:
在这里插入图片描述
原因: 因为我在渲染的时候,又在改变值,所有就导致render - show改变 - render
You may have an infinite update loop in a component
译文:您可能在一个组件中有一个无限更新循环

报错解析 [Vue warn]: You may have an infinite update loop in a component render function.

解决方案:
先处理完数据结构,在渲染数据,添加数据处理完的标识isFinished
整个组件的代码

<template>
  <div class="mt30 exec-task-result-content" v-if="isFinished">
    <el-collapse v-model="collapseActiveNames">
      <el-collapse-item
        v-for="(item, i) in iotTaskResultList"
        :key="item.meterTypeName"
        :name="item.meterTypeName"
        :disabled="item.txFailNum == 0"
      >
        <template slot="title">
          <div class="align_items_center f15">
            <div class="align_items_center">
              <span>{{ item.meterTypeName }}:</span
              ><span class="bold danger-color f16">{{ item.txTotalNum }}</span>
            </div>
            <div class="ml10 align_items_center">
              <span class="">加入任务:</span
              ><span class="bold primary-color f16">{{
                item.txSuccessNum
              }}</span>
            </div>
            <div class="ml10 align_items_center">
              <span>加入失败:</span
              ><span class="bold warn-color f16">{{ item.txFailNum }}</span>
            </div>
          </div>
        </template>
        <div v-if="item.failReasonList.length">
          <el-tabs
            v-model="dataObj[i + ''].activeName"
            type="card"
            @tab-click="
              (tab) => {
                handleClick(tab.name, i);
              }
            "
          >
            <el-tab-pane
              :label="failTypeList[key] + '(' + value.length + ')'"
              :name="key"
              v-for="(value, key, index) in item.failFormateData"
              :key="index"
            >
            </el-tab-pane>
          </el-tabs>
          <!-- 表格 -->
          <div>
            <avue-crud
              :option="option"
              :data="dataObj[i + ''].activeData"
              ref="crud"
            >
            </avue-crud>
          </div>
          <!-- 表格 -->
        </div>
      </el-collapse-item>
    </el-collapse>
  </div>
</template>
<script>
//failType  失败类型 0 = 系统类 1 = 网络类 2 = 其他原
export default {
  props: {
    // iotTaskResultList: {
    //   type: Array,
    //   default: () => {
    //     return []
    //   },
    // },
  },
  data() {
    return {
      list: [],
      collapseActiveNames: [],
      dataObj: {},
      isFinished:false,
      failTypeList: {
        0: "系统类",
        1: "网络类",
        2: "其他",
      },
      tabActiveName: "",
      option: {
        menu: false,
        maxHeight: 200,
        // calcHeight: 120,
        tip: false,
        searchShow: true,
        searchMenuSpan: 6,
        border: true,
        index: true,
        addBtn: false,
        viewBtn: true,
        selection: false,
        dialogClickModal: false,
        column: [
          {
            label: "姓名",
            prop: "userName",
          },
          {
            label: "地址",
            prop: "addrDes",
          },
          {
            label: "表类型",
            prop: "meterTypeName",
          },
          {
            label: "表号",
            prop: "meterGyh",
          },
          {
            label: "失败原因",
            prop: "failReason",
          },
        ],
      },
      iotTaskResultList: [
        {
          failReasonList: [
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "11111",
              meterGyh: "ee",
              meterTypeName: "33",
              userName: "ee",
              failType: 1,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "2222",
              meterGyh: "ee",
              meterTypeName: "33",
              userName: "ee",
              failType: 2,
            },
          ],
          isIot: 1,
          meterTypeName: "物联网表",
          txFailNum: 3,
          txSuccessNum: 0,
          txTotalNum: 0,
          txWaitNum: 0,
        },
        {
          failReasonList: [
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 1,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 1,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 1,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "000",
              meterGyh: "ee",
              meterTypeName: "0",
              userName: "ee",
              failType: 0,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "11111",
              meterGyh: "ee",
              meterTypeName: "33",
              userName: "ee",
              failType: 1,
            },
            {
              addrDes: "ee",
              addrName: "ee",
              failReason: "2222",
              meterGyh: "ee",
              meterTypeName: "33",
              userName: "ee",
              failType: 2,
            },
          ],
          isIot: 1,
          meterTypeName: "物联网dd表",
          txFailNum: 10,
          txSuccessNum: 0,
          txTotalNum: 0,
          txWaitNum: 0,
        },
      ],
    };
  },
  mounted() {
    this.getCollapseActiveNames();
    this.filterFailReasonList();
  },
  methods: {
    //展开所有
    getCollapseActiveNames() {
      let names = [];
      this.iotTaskResultList.forEach((item) => {
        if (item.txFailNum != 0) {
          names.push(item.meterTypeName);
        }
      });
      this.collapseActiveNames = names;
    },
    //获取每一个表格的第一个tab的表格数据值
    handleClick(name, index) {
      this.$set(
        this.dataObj[index + ""],
        "activeData",
        this.iotTaskResultList[index].failFormateData[name]
      );
      this.$set(this.dataObj[index + ""], "activeName", name);
   
    },
    filterFailReasonList() {
      this.iotTaskResultList.forEach((item, index) => {
        let prop = index + "";

        this.$set(this.dataObj, prop, {});
        this.$set(this.dataObj[prop], "activeData", []);
        this.$set(this.dataObj[prop], "activeName", "");

        if (item.failReasonList.length) {
          let failObj = {};
          let failReasonList = item.failReasonList;
          failReasonList.forEach((failItem) => {
            if (failObj.hasOwnProperty(failItem.failType)) {
              failObj[failItem.failType].push(failItem);
            } else {
              failObj[failItem.failType] = [failItem];
            }
          });
          item.failFormateData = failObj;
          //初始选择第一个参数\
         
          this.$set(this.dataObj[prop], "activeData", failObj[firstName]);
          this.$set(this.dataObj[prop], "activeName", firstName);
         
        }
      });
      this.isFinished = true;
      return this.iotTaskResultList;
    },
  },
};
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值