进行动态值绑定

在前一节的示例应用中,我们仅通过 v-model 就获得了单选按钮、复选框和选择选项的字符串或布尔值。我们可以通过使用 true-valuefalse-valuev-bind 来修改这些默认值。下面我们来具体探讨。

替换布尔值 - 复选框元素

我们可以通过使用 true-valuefalse-value 为单选框元素绑定自定义值。例如,我们可以用 yes 替换默认的布尔值 true,用 no 替换默认的布尔值 false

// src/components/dynamic-values.vue
<input
  type="checkbox"
  v-model="form.subscribe"
  true-value="yes"
  false-value="no"
>
export default {
  data () {
    return {
      form: { subscribe: 'no' }
    }
  },
  methods: {
    checkForm (e) {
      this.errors = []
      if (this.form.subscribe !== 'yes') {
        this.errors.push('必须订阅')
      }
    }
  }
}

现在,当您将订阅输入的值发送到服务器时,会得到 yesno 的响应。在 <script> 块中,我们现在将 no 声明为 subscribe 属性的初始值,并在 if 条件块中验证它,确保在点击提交按钮时始终为 yes,否则将错误消息推送到 errors 数组中。

使用动态属性替换字符串 - 单选框元素

对于单选按钮 <input> 元素,我们可以通过 v-bind 将其值绑定到 Vue 实例中的动态属性:

// src/components/dynamic-values.vue
<input type="radio" v-model="form.gender" v-bind:value="gender.male">
export default {
  data () {
    return {
      gender: {
        male: 'm',
        female: 'f',
        other: 'o'
      },
      form: { gender: null }
    }
  }
}

当选择该单选按钮时,现在会获取到值 m,其验证逻辑与之前保持一致。

使用对象替换字符串 - select 选项元素

我们还可以使用 v-bind 将非字符串值(如对象)绑定到表单输入元素。请看以下示例:

// src/components/dynamic-values.vue
<select v-model="form.favourite">
  <option v-bind:value="{ title: 'On the Origin of Species' }">On the Origin of Species</option>
</select>
export default {
  data () {
    return {
      form: {
        favourite: null
      }
    }
  }
}

当选择该选项时,typeof this.favourite 将返回 object 类型,而 this.favourite.title 的值为 "物种起源"。验证逻辑保持不变。

我们还可以结合 v-for 动态渲染 <option> 元素并绑定动态值:

// src/components/dynamic-values.vue
<select v-model="form.favourites" name="favourites_array[]" multiple>
  <option v-for="book in options.books" v-bind:value="book.value">
    {{ book.text }}
  </option>
</select>
data () {
  return {
    form: { favourites: [] },
    options: {
      books: [
        { value: { title: '物种起源' }, text: '物种起源' },
        { value: { title: '时间简史' }, text: '时间简史' },
        { value: { title: '自私的基因' }, text: '自私的基因' }
      ]
    }
  }
}

现在我们不再需要硬编码 <option> 元素,可以从 API 等外部数据源动态获取 books 数据。

除了为表单输入绑定动态值外,我们还可以修改 v-model 在输入元素上的默认行为。例如,可以使用 change 事件替代默认的数据同步机制。我们将在下一主题中探讨具体实现方式。