使用v-model绑定数组的下标的新增属性时

本文探讨了在Vue框架中,如何正确地更新DOM以反映数据的变化。特别是在使用Ajax调取数据并需要对列表项添加新属性时,直接修改属性可能不会立即更新视图。文章分享了一种有效的方法,通过Vue.set()函数来确保DOM的实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比如有个list,在通过ajax调取数据后需要对这个list进行新增属性操作

vm.itemList[i].chooseChoiceId = '';

如果这样在

 v-model="itemList[nowItemIndex].chooseChoiceId"

数据是不会实时变化,并且更新dom的。

需要这样:

vm.itemList[i].chooseChoiceId = '';
Vue.set(vm.itemList,i ,JSON.parse(JSON.stringify(vm.itemList[i])));

 


 
<template> <div class="dynamic-select"> <!-- Element-UI 下拉选择器 --> <el-select v-model="selectedValue" :placeholder="placeholder" filterable clearable @change="handleSelectChange" :disabled="disabled" style="width: 100%" > <el-option v-for="(item, index) in options" :key="index + item.value" :label="item.label" :value="item.value" /> </el-select> <!-- 新增选项输入框 + 确认按钮 --> <div class="add-option"> <el-input v-model="newOption" placeholder="输入新选项" clearable @keyup.enter.native="handleAddOption" :disabled="disabled" class="add-input" /> <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAddOption" :disabled="!newOption.trim() || disabled" > 新增 </el-button> </div> </div> </template> <script> export default { name: 'DynamicSelect', props: { // 选项列表(必填) options: { type: Array, required: true, default: () => [] }, // 绑定值(支持 v-model) value: { type: [String, Number, Array], default: '' }, // 占位符 placeholder: { type: String, default: '请选择' }, // 是否禁用 disabled: { type: Boolean, default: false } }, data() { return { selectedValue: this.value, // 双向绑定选中值 newOption: '' // 新增选项的输入内容 } }, watch: { // 监听父组件传入的 value,同步到内部 selectedValue value(newVal) { this.selectedValue = newVal }, // 监听内部选中值变化,同步到父组件 selectedValue(newVal) { this.$emit('input', newVal) this.$emit('change', newVal) } }, methods: { // 选中值变化触发(可选) handleSelectChange(val) { this.$emit('select-change', val) }, // 新增选项逻辑 handleAddOption() { const label = this.newOption.trim() if (!label) { this.$message.warning('请输入有效内容!') return } // 检查是否已存在相同选项 const isExist = this.options.some(item => item.label === label) if (isExist) { this.$message.warning('该选项已存在!') return } // 生成唯一值(可根据需求自定义,如 UUID、间戳等) const value = Date.now() // 简单用间戳作为唯一值 // 更新选项列表 this.options.push({ label, value }) // 选中新增的选项 this.selectedValue = value // 清空输入框 this.newOption = '' // 通知父组件选项已更新(可选) this.$emit('options-updated', this.options) this.$message.success('新增选项成功!') } } } </script> <style scoped> .dynamic-select { display: flex; align-items: center; gap: 8px; } .add-option { display: flex; align-items: center; gap: 4px; } .add-input { width: 140px; } </style> 完善新增功能,并附上使用范例
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值