You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify Select组件值更新异常:变更后模型仍保留旧值

解决Vuetify Select组件change事件中v-model值未更新的问题

嘿,这个问题我之前在项目里也踩过坑!核心原因是Vue的响应式更新是异步的——当v-select触发change事件时,Vue还没来得及把新选中的值同步到v-model绑定的selectedPlot变量里,所以你在loadPlotInformation()里打印的自然还是旧值。下面给你几个靠谱的解决方案:

方案1:直接通过事件参数获取最新选中值

v-select的change事件会自动把当前选中的项作为参数传递给回调函数,我们可以直接用这个参数来获取最新值,不用依赖还没更新的v-model变量:

修改模板:

<v-select 
  label="..." 
  autocomplete 
  append-icon="search" 
  :items="plots" 
  item-value="id" 
  item-text="plotHeader" 
  v-model="selectedPlot" 
  @change="loadPlotInformation($event);"
></v-select>

然后更新方法:

loadPlotInformation(selectedItem) {
  console.log(selectedItem); // 这里就是当前选中的最新值
  // 如果你需要确保this.selectedPlot和最新值同步,可以手动赋值(不过v-model最终会自动更新,只是异步延迟)
  this.selectedPlot = selectedItem;
  // 后续业务逻辑直接用selectedItem即可
}

方案2:用$nextTick等待响应式更新完成

如果你不想修改方法的参数,也可以利用Vue的$nextTick()方法,等待Vue完成DOM和数据的更新后再访问selectedPlot:

loadPlotInformation() {
  this.$nextTick(() => {
    console.log(this.selectedPlot); // 这里就能拿到最新的选中值了
    // 你的业务逻辑写在这个回调里
  });
}

$nextTick()的作用就是把回调推迟到下一个DOM更新周期之后执行,确保我们能拿到最新的响应式数据。

方案3:改用watch监听变量变化(更推荐的Vue风格)

其实对于这种依赖变量变化触发逻辑的场景,Vue官方更推荐用watch来监听selectedPlot的变化,而不是依赖DOM事件。这种方式更符合Vue响应式的设计思路:

首先在组件的watch选项里添加监听:

watch: {
  selectedPlot(newVal, oldVal) {
    // 可以加个判断,避免初始加载时值为空的情况
    if (newVal !== oldVal && newVal) {
      console.log(newVal); // 新选中的值
      this.loadPlotInformation(newVal);
    }
  }
},
methods: {
  loadPlotInformation(selectedItem) {
    // 这里处理你的业务逻辑,比如加载地块信息
  }
}

然后模板里就可以去掉@change绑定了:

<v-select 
  label="..." 
  autocomplete 
  append-icon="search" 
  :items="plots" 
  item-value="id" 
  item-text="plotHeader" 
  v-model="selectedPlot"
></v-select>

这样只要selectedPlot的值发生变化(不管是用户选择还是其他方式修改),都会自动触发对应的逻辑,代码也更清晰。

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:09:44