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

Vuex中v-model的setter如何接收事件对象?

好问题!首先直接回答你:Vue的计算属性setter本身不支持直接接收event参数——因为计算属性的v-model绑定本质上是把值的变化传递给setter,不会自动传递事件对象。不过没关系,我们有几种简单的方法可以实现你想要的「无论值是否变化,选择后让select失焦」的需求,下面给你详细拆解:

方法1:直接用@click监听选项点击(最推荐)

不管用户点击的是当前已选中的选项,还是新选项,点击事件都会触发,刚好能覆盖你要的「无论值变不变都失焦」的场景:

<select v-model:value="leadTrackNumber" @click="(e) => e.target.blur()">
  <option v-for="(track, index) in tracks" :key="index">{{ index }}</option>
</select>

这里直接绑定内联函数,点击后立刻让select元素失焦。记得给option加上:key属性,符合Vue列表渲染的规范哦。

如果不想写内联函数,也可以抽成组件方法:

<select v-model:value="leadTrackNumber" @click="handleSelectBlur">
  <option v-for="(track, index) in tracks" :key="index">{{ index }}</option>
</select>
methods: {
  handleSelectBlur(e) {
    e.target.blur();
    // 要是需要额外做些逻辑,也可以在这里补充
  }
}

方法2:结合ref在计算属性setter中失焦(仅值变化时生效)

如果你还是想结合计算属性的逻辑,也可以通过ref获取select元素,然后在setter里调用失焦方法:

<select v-model:value="leadTrackNumber" ref="leadTrackSelect">
  <option v-for="(track, index) in tracks" :key="index">{{ index }}</option>
</select>
computed: {
  leadTrackNumber: {
    get() {
      // 你的原有数据处理逻辑
      return this.$store.state.leadTrackNumber;
    },
    set(value) {
      this.$store.commit('updateLeadTrack', value);
      // 通过ref获取元素并失焦
      this.$refs.leadTrackSelect.blur();
    }
  }
}

不过要注意:这种方法只有在值发生变化时才会触发setter,所以如果用户点击了当前已选中的选项,setter不会执行,也就不会失焦。适合只需要值变化时失焦的场景,对你的需求来说不如方法1通用。

补充:为什么你之前的写法不可行?

你尝试的v-model:value="leadTrackNumber(value, $event)"写法不生效,是因为v-model的绑定值需要是一个响应式属性(比如data、computed),而不是函数调用。Vue的v-model语法糖会自动把值的变化映射到setter或data属性赋值,不会把event参数传递给绑定的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:49