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>