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

Vue.js 2表单默认选中选项后提交按钮未激活的问题排查

问题描述

我在Vue.js 2中编写了如下表单:

<form id="trial-form" action="post" class="trial">
    <div class="form-field required selectbox">
        <select name="region" id="region" label="region" v-validate="'required'" v-model="region" class="required selectbox region" aria-label="Region">
            <option value="">{{ $t("region") }}</option>
            <p-option v-for="regionOption in regionList" :key="regionOption.region" :value="regionOption.plane">{{$t(regionOption.region)}}</p-option>
        </select>
        <p-button size="lrg" align="left" type="submit" :disabled="isFormInvalid" @click.prevent="validateBeforeSubmit">{{ $t("trialSubmit") }}</p-button>
    </div>
</form>

通过以下代码硬编码设置v-model的默认值:

mounted () {
  this.region = 'US'
}

此时页面下拉框已默认选中US,但提交按钮处于禁用状态,仅手动切换下拉选项后按钮才会激活。明明下拉框已默认选中,用户无需手动操作即可提交,请问问题原因是什么?

原因分析

你使用的v-validate(推测是vee-validate 2.x插件)默认只会监听表单元素的用户交互触发的事件(比如change、input)来执行校验逻辑。而在mounted钩子中直接通过代码赋值region,属于非用户交互的数据更新,不会触发校验插件的自动校验流程,导致校验状态仍停留在初始的“未通过”状态,isFormInvalid保持为true,所以提交按钮处于禁用状态。

解决方案

有两种常见的解决方式:

  1. 手动触发校验
    在mounted中赋值后,主动调用校验方法更新字段的校验状态:
mounted () {
  this.region = 'US'
  // 触发单个字段的校验
  this.$validator.validate('region')
}
  1. 初始化时直接赋值
    将region的默认值直接写在data选项中,组件初始化时校验插件会自动识别初始值并完成校验:
data() {
  return {
    region: 'US'
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:55:49