Expected Array got Object

本文解析了一个常见的编程错误:期望接收数组类型参数,却接收到对象类型。这种情况通常出现在JavaScript等动态类型语言中,不当的数据类型可能导致运行时错误。文章详细解释了错误原因,并提供了检查和修正方法。

Invalid prop: type check failed for prop “data”. Expected Array, got Object

简单来说,就是你传参的类型错了。
需要传递一个对象类型,但是传递的确实数组。

文章来源:学至分享

Vue 组件中,当传递给组件的 prop 类型与预期不符时,Vue 会抛出警告,例如:`[Vue warn]: Invalid prop: type check failed for prop "timelineData". Expected Array, got Object`。这类问题通常发生在数据结构不符合组件定义的 prop 类型时。 ### `props` 类型校验机制 Vue 在组件实例化时会对 `props` 进行类型校验。这一过程主要通过 `validateProp` 函数实现,该函数会调用 `assertProp` 和 `assertType` 等辅助函数来确保传入的值符合定义的类型要求。如果类型不匹配,则会触发警告。 ### `timelineData` 类型校验失败的原因 当组件定义 `timelineData` 为 `Array` 类型时,但实际传入的是一个 `Object`,就会导致类型校验失败。这种情况通常出现在以下几种场景: 1. **数据结构不匹配**:例如,后端返回的数据结构是 `Object` 类型,而组件期望的是 `Array`。 2. **数据处理错误**:在数据传递给组件之前没有正确解析或转换数据。 3. **包装结构问题**:如引用[2]中提到的,返回的数据可能被包装在一个 `Result<>` 对象中,而直接使用了包装后的对象而不是提取其中的数组数据。 ### 解决方案 #### 1. 数据处理 在将数据传递给组件之前,确保数据结构符合组件的期望。例如,如果后端返回的数据是包装在一个对象中,需要从中提取出数组数据: ```javascript // 假设后端返回的数据结构如下 const response = { data: [/* 数据 */], status: 'success', }; // 在组件中使用时,应传递 response.data 而不是 response <component :timelineData="response.data" /> ``` #### 2. 组件定义调整 如果无法更改数据结构,可以考虑调整组件的 `props` 定义,使其能够接受 `Object` 类型,并在组件内部处理数据转换: ```javascript export default { props: { timelineData: { type: [Array, Object], required: true, }, }, // ... }; ``` #### 3. 类型校验自定义 如果需要更复杂的类型校验逻辑,可以使用自定义校验函数: ```javascript export default { props: { timelineData: { type: Array, required: true, validator(value) { // 自定义校验逻辑 return value.every(item => item.isValid); }, }, }, // ... }; ``` ### 实现原理总结 Vue 的 `props` 类型校验机制通过 `validateProp` 函数实现,确保传入的值符合定义的类型要求。当类型不匹配时,会触发警告。解决类型校验失败的问题,关键在于确保数据结构与组件定义的 `props` 类型一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值