
在vue 3应用开发中,动态填充下拉菜单是常见的需求,通常涉及到通过fetch api从后端服务获取数据。然而,如果对api返回的数据结构理解不当,可能会导致数据虽然成功获取,却无法正确绑定到ui组件,例如下拉菜单。本教程将通过一个具体示例,详细阐述如何正确处理这类问题。
问题的核心在于API返回的数据结构与前端组件期望的数据结构不匹配。假设我们从一个交通事件API获取数据,该API返回的是一个包含多个事件对象的数组,每个事件对象都含有
reason、condition 和 incidentType 等属性。
原始API响应示例(简化):
[
{
"id": "1",
"reason": "Accident",
"condition": "Clear",
"incidentType": "Collision"
},
{
"id": "2",
"reason": "Roadwork",
"condition": "Wet",
"incidentType": "Maintenance"
},
{
"id": "3",
"reason": "Accident",
"condition": "Clear",
"incidentType": "Collision"
}
]而我们的Vue组件期望的是一个包含独立 reasons、conditions 和 incidentTypes 数组的对象,用于 v-for 循环:
dropdownData: {
reasons: [],
conditions: [],
incidentTypes: []
}初学者常犯的错误是,在接收到上述数组形式的 data 后,尝试直接访问 data.reasons、data.conditions 或 data.incidentTypes。然而,由于 data 本身是一个数组,它并没有这些顶层属性,因此这些访问会返回 undefined 或空值,导致下拉菜单无法填充。
错误的尝试代码示例:
// 假设data是API返回的数组
this.dropdownData = {
reasons: [...data.reasons], // data.reasons 是 undefined
conditions: [...data.conditions], // data.conditions 是 undefined
incidentTypes: [...data.incidentTypes] // data.incidentTypes 是 undefined
}要解决此问题,我们需要对API返回的数组数据进行转换,从每个事件对象中提取出所需的属性,并聚合成独立的数组。同时,为了避免下拉菜单中出现重复选项,通常还需要对这些提取出的值进行去重处理。
Mureka
Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。
1091
查看详情
以下是正确的数据处理步骤:
示例代码:
<template>
<div>
<div>调试输出: {{ dropdownData }}</div>
<select v-model="reason">
<option disabled value="">请选择原因</option>
<option v-for="r in dropdownData.reasons" :key="r" :value="r">{{ r }}</option>
</select>
<select v-model="condition">
<option disabled value="">请选择状况</option>
<option v-for="c in dropdownData.conditions" :key="c" :value="c">{{ c }}</option>
</select>
<select v-model="incidentType">
<option disabled value="">请选择事件类型</option>
<option v-for="type in dropdownData.incidentTypes" :key="type" :value="type">{{ type }}</option>
</select>
<button @click="getData">获取数据</button>
</div>
</template>
<script>
export default {
data() {
return {
reason: null,
condition: null,
incidentType: null,
dropdownData: {
reasons: [],
conditions: [],
incidentTypes: []
}
}
},
mounted() {
this.fetchDropdownData()
},
methods: {
async fetchDropdownData() {
try {
// 实际API路径应根据您的项目配置
const response = await fetch(`${import.meta.env.VITE_API_VERBOSE}`)
if (!response.ok) {
throw new Error(`网络响应不佳,状态码: ${response.status}`)
}
const data = await response.json()
// 核心数据处理逻辑:从数组中提取并去重
const reasons = [...new Set(data.map(el => el.reason))].sort()
const conditions = [...new Set(data.map(el => el.condition))].sort()
const incidentTypes = [...new Set(data.map(el => el.incidentType))].sort()
this.dropdownData = {
reasons,
conditions,
incidentTypes
}
} catch (error) {
console.error('获取下拉菜单数据时出错:', error)
// 可以在这里添加用户友好的错误提示
}
},
getData() {
// 使用选定的值:this.reason, this.condition, this.incidentType
console.log('选定的原因:', this.reason)
console.log('选定的状况:', this.condition)
console.log('选定的事件类型:', this.incidentType)
// 根据选定值执行后续操作或API调用
}
}
}
</script>在上述代码中:
在Vue 3应用中,通过Fetch API动态填充下拉菜单是一个常见且重要的功能。解决“数据已获取但下拉菜单未填充”的问题,关键在于正确理解API返回的数据结构,并进行必要的数据转换和去重处理。通过 Array.prototype.map() 和 Set 的组合使用,我们可以高效地将复杂的数组数据转换为适合下拉菜单绑定的独立、唯一的选项数组。遵循本文所述的最佳实践,将有助于构建更健壮、用户体验更佳的Vue应用。
以上就是Vue 3中Fetch API数据获取与下拉菜单动态填充指南的详细内容,更多请关注其它相关文章!
相关文章:
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
在React函数组件中利用原生HTML5进行邮箱地址验证
Lar*el 递归关系中排除指定分支的教程
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
响应式图片在网页设计中的正确实现方法
qq音乐在线播放入口_qq音乐电脑版登录链接
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Golang如何优雅处理error_Golang error处理最佳实践总结
J*aScript中如何高效提取对象指定属性
Python实时数据流中的动态最值查找策略
汽水音乐在线版入口_汽水音乐网页播放手册
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
UC浏览器网页版登录入口官网 电脑版网址入口
Python类型检查:优化关联可选属性的Mypy推断策略
C++如何跨平台操作文件和目录_C++17标准库std::filesystem的使用教程
React Hooks最佳实践:动态组件状态管理的组件化方案
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
AO3最新可访问网址 Archive of Our Own官方在线入口
J*aScript类型检查_j*ascript代码规范
Shopware订单对象中获取产品自定义字段的正确方法
期待已久:小米17 Ultra、小米首款NAS本月登场
126邮箱网页版官方入口 126邮箱账号在线登录平台
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
Fabric模组开发:自定义物品与物品组的现代管理方法
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
铁路12306的积分有效期是多久_铁路12306积分有效期说明
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
Lar*el Migration:重命名列后添加新列的正确操作顺序
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
将PCM16音频转换为W*并编码为Base64:浏览器环境下的手动处理指南
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
解决Python单元测试中Mock异常方法调用计数为零的问题
在命令行怎么运行html项目_命令行运行html项目方法【教程】
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
在Pyomo中实现基于变量的条件约束:Big-M方法详解
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
海棠电脑版入口_通过电脑访问海棠官网阅读
Kafka Streams中基于消息头条件过滤消息的实现指南