1、 描述:无法设置未定义的属性“类型”

uncaught (in promise) typeerror: cannot set proerty 'type' of undefined
未捕获(承诺)类型错误:无法设置未定义的属性“类型”

原因:没有对接口返回值,做非空判断,导致接口还没有获取到值,就已经赋值了

this.$httpExt().post(url+'?parentId='+id, undefined, 'gateway').then(response => {
				let data =response.obj
				this.initAnalysisData(data)
            })

解决方案:对接口返回值 做非空判断

let url = apiData.investigationReport.relInvestigationAnalysis;
            this.$httpExt().post(url+'?parentId='+id, undefined, 'gateway').then(response => {
				let data =response.obj
				if (data) {
					this.initAnalysisData(data)
				}
            })

2、 描述: 类型 检查失败 ,预期接收的数据类型 和实际传入 数据类型不一致
例子1:

[Vue warn]: Invalid prop: type check failed for prop "multipleLimit". Expected Number with value 0, got String with value "0".
无效的属性:属性“multipleLimit”的类型检查失败。 预期值为 0 的数字,得到值为“0”的字符串。

原因:预期是数字类型,实际是字符串类型
解决方案:把字符串类型转换成数字类型

<el-select multiple-limit="0"></el-select>  改为
<el-select :multiple-limit="0"></el-select>

例子2:

[Vue warn]: Invalid prop: type check failed for prop "title". Expected String, got Boolean with value false.
[Vue 警告]:无效的道具:道具“title”的类型检查失败。 预期的字符串,得到值为 false 的布尔值。

原因:预期是字符串类型,实际是布尔类型
解决方案:把布尔类型转换为字符串类型

<el-popover
:title="([1,2,5].indexOf(item.simuItem.serType)>-1)&&item.simuItem.serName"
width="330">
</el-popover>
改为
<el-popover
:title="([1,2,5].indexOf(item.simuItem.serType)>-1) ? item.simuItem.serName : ''"
width="330">
</el-popover>

例子3:

[Vue warn]: Invalid prop: type check failed for prop "center". Expected Boolean, got String with value "true".
[Vue 警告]:无效的道具:道具“center”的类型检查失败。 预期的布尔值,得到值为“true”的字符串。

原因:预期是布尔类型,实际是字符串类型
解决方案:把字符串类型转换为布尔类型

<el-dialog
title="可以合并的训练需求"
:visible.sync="mergePopup"
center="true"
width="60%">
</el-dialog>
改为
<el-dialog
title="可以合并的训练需求"
:visible.sync="mergePopup"
:center="true"
width="60%">
</el-dialog>

2-1、排查思路:

  1. 根据搜索关键词快速定位问题 (multipleLimit、title、center)
  2. 当前关键词为小驼峰命名,那么搜索时,再大写字母加上’-',并把大写改成小写,例如: multiple-limit

3、 无法读取未定义的属性‘长度’

Error in callback for watcher "editMultipleCourseJson.areaArr": "TypeError: Cannot read property 'length' of undefined"
[Vue 警告]:观察者“editMultipleCourseJson.areaArr”的回调错误:“TypeError:无法读取未定义的属性‘长度’”

原因:newVal 为空时(null、false、‘’、0、undefined),则无法获取属性值,所以无法读取未定义的属性的长度

解决方案:先做对象的非空判断,再做对象属性的长度判断

"editMultipleCourseJson.areaArr": {
   handler: function (newVal, oldVal) {
   		if (newVal.length > 0) {
   			
		}
	},
	deep: true
}
改为
"editMultipleCourseJson.areaArr": {
   handler: function (newVal, oldVal) {
   		if (newVal && newVal.length > 0) {
   			
		}
	},
	deep: true
}

4、 v-for 循环时,绑定key =“item”,item 是一个对象或数据

Avoid using non-primitive value as key, use string/number value instead.
避免使用对象或是数组作为key,而是使用字符串/数字值

解决方案: 绑定key值,使用index绑定

v-for="item in baseObj.block" :key="item"
改为
v-for="(item,index) in baseObj.block" :key="index"

5、渲染错误

[Vue warn]: Error in render: "TypeError: Cannot read property 'simuItem' of undefined"
[Vue 警告]:渲染错误:“TypeError:无法读取未定义的属性‘simuItem’”

产生原因:对象的属性未声明,但是在页面上有实际的应用

<div style="line-height: 24px;margin-bottom: 10px;">
	<span class="group-name" >组名:{{menuObj.item.simuItem.trainName}}</span>
	<span class="training-type" >训练类型:{{menuObj.item.simuItem.tTrPlanAreaEntityVo.subjectName}}</span>
</div>
// menuObj 初始化是一个空对象

解决方案:加v-if判断,当对象属性有值时,再调用对象的属性

<div v-if="menuObj.item && menuObj.item.simuItem && menuObj.item.simuItem.trainName" style="line-height: 24px;margin-bottom: 10px;">
        <span class="group-name" >组名:{{menuObj.item.simuItem.trainName}}</span>
        <span class="training-type" v-if="menuObj.item.simuItem.tTrPlanAreaEntityVo">训练类型:{{menuObj.item.simuItem.tTrPlanAreaEntityVo.subjectName}}</span>
      </div>

6、 v-for 循环时, 避免绑定 非原始值的key值
报错原因

[Vue warn]: Avoid using non-primitive value as key, use string/number value instead.
[Vue 警告]:避免使用非原始值作为键,而是使用字符串/数字值。

解决方案: :key的绑定值 由 非原始值 变成 索引值
例子1:

<div
v-for="item in baseObj.block"
:key="item"></div>
改为
<div
v-for="(item,blockIndex) in baseObj.block"
:key="blockIndex"></div>

例子2:

<span
  v-if="item.simuItem.isCustomerS == '1'">
   学员:
   <span
     v-for="customer in item.simuItem.customerList"
     :key="customer"
     v-if="customer.rankNo=='T303'||customer.rankNo=='S'">
     {{customer.cnName}}{{customer.tsFlag==='0' ? '*' : ''}},
   </span>
   <br/>
</span>
改为
<span
  v-if="item.simuItem.isCustomerS == '1'">
   学员:
   <span
     v-for="(customer, customerIndex) in item.simuItem.customerList"
     :key="customerIndex"
     v-if="customer.rankNo=='T303'||customer.rankNo=='S'">
     {{customer.cnName}}{{customer.tsFlag==='0' ? '*' : ''}},
   </span>
   <br/>
</span>

6-1. 如何快速定位问题

  1. 打开控制台,查看报错信息
    在这里插入图片描述
  2. 翻译报错信息,并理解
[Vue warn]: Avoid using non-primitive value as key, use string/number value instead.
[Vue 警告]:避免使用非原始值作为键,而是使用字符串/数字值。

理解:就是做v-for循环时,绑定的key 不是对象的原始值,原始值是指在data () 里面声明的值,例如:simuObj、name
没有data里面声明的,后期通过赋值的形式获取的 为 非原始值,例如 baseObj,baseKey

data () {
	return {
		simuObj: {} // 数据对象
		obj: [
			{
				name: '张三';
			}
		]
	}
}
mounted () {
	this.initData ();
},
method: {
	initData () {
		// 请求接口
		let data = axios...  // 接口请求后返回值
		this.simuObj = data;
	}
}

<div id="main-J_Draw"
   class="ui-draw-new ui-draw-new-special"
   :class="{'first':baseIndex==0}"
   v-for="(baseObj,baseKey,baseIndex) in simuObj"
   :key="baseObj"
>
</div>

  1. 展开错误列表,点击第一个当前页面的报错代码
    在这里插入图片描述
  2. 光标所在的这样一行就是错误信息来源, 得出可能原因是 customer.rankNo、 key: customer 两种情况
    在这里插入图片描述
  3. 再结合第二个点错误信息,绑定的key 不是对象的原始值,那么报错的关键原因就是 key: customer
  4. 再当前页面搜索关键词 customer ,再html区域,并有v-for 循环,并有 :key = “customer”,
  5. 解决方案看例子2

7、绑定key 值,出现了重复键

 [Vue warn]: Duplicate keys detected: '5'. This may cause an update error. 
 [Vue 警告]:检测到重复键:'5'。 这可能会导致更新错误。

原因:key绑定的值,不是唯一值

解决方案: key绑定的值改为唯一值

<el-select filterable v-model="SchoolResultForm.theoryStudySchool" placeholder="请选择">
	<el-option
     v-for="item in options"
     :key="item.schoolSystem"
     :label="item.schoolName"
     :value="item.schoolName">
   	</el-option>
</el-select>
改为
<el-select filterable v-model="SchoolResultForm.theoryStudySchool" placeholder="请选择">
	<el-option
     v-for="item in options"
     :key="item.id"
     :label="item.schoolName"
     :value="item.schoolName">
   	</el-option>
</el-select>
  1. 渲染错误
 [Vue warn]: Property or method "item" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.
 [Vue 警告]:属性或方法“item”未在实例上定义,但在渲染期间被引用。 通过初始化该属性,确保该属性是反应性的,无论是在数据选项中,还是对于基于类的组件。

原因: 没有声明item变量,就在html页面上调用
解决方案: 删除html中的调用 {{item}}, 或者在data 声明 item变量

排查思路修正:
原来思路:

  1. 根据当前url, 找到路由 ,例如: http://localhost:8026/#/fleetPlaneIndex, 当前路由 为 fleetPlaneIndex
  2. 再VScode里面查找到 fleetPlaneIndex文件,结果排查了好久,发现页面对不上(花了半小时,才发现)

修正思路:

  1. 根据当前url, 找到路由 ,例如: http://localhost:8026/#/fleetPlaneIndex, 当前路由 为 fleetPlaneIndex
  2. 打开路由列表,搜索fleetPlaneIndex, 找到实际跳转的component
{	path: 'fleetPlaneIndex',
     component: LazyLoad('aptitprocessmanage/fleetplan/fleetplan'),
      name: "fleetplan",
      meta: { title: '标题' }
}
  1. 再通过VScode 搜索 aptitprocessmanage/fleetplan/fleetplan ,找到对应页面
Logo

前往低代码交流专区

更多推荐