【问题标题】:Conditionally set v-model in Vue在 Vue 中有条件地设置 v-model
【发布时间】:2023-03-20 12:46:01
【问题描述】:

我有一系列输入,可以是复选框或单选按钮,具体取决于我的 vue 组件的 data 中的值。

特别是,我有一个Question 组件,问题可能只接受一个答案或多个答案。我的data 中有一个selected_answers 数组,我想我可以让复选框将其定位为v-model,而单选按钮可以定位selected_answers[0]。这样,我不必复制粘贴输入元素,只需更改它们的类型和 v-model。

所以,我的解决方案如下所示:

<input
    :type="question.accepts_multiple answers ? 'checkbox' : 'radio'"
    :id="'ans-' + answer.id"
    :value="answer.id"
    v-model="question.accepts_multiple_answers ? selected_answers : selected_answers[0]"
/>

但是,eslint 抱怨我的代码:

'v-model' directives require the attribute value which is valid as LHS

有什么方法可以完成我想做的事情?

【问题讨论】:

  • 顺便说一句,除了v-model,你几乎可以在任何地方使用任何常规的 ES6 代码。有效代码示例::id="`ans-${answer.id}`"

标签: javascript html vue.js eslint


【解决方案1】:

您不能在v-model 中使用任何高级 代码(只是一个基本字符串),您可以将question.accepts_multiple_answers ? selected_answers : selected_answers[0] 导出到computed 并将computed 插入到v-model .

如果你需要一个setter,你需要写一个computed setter,看起来像这样

computed: {
  fullName: {
    // getter
    get() {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set(newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}

同时,由于v-model 只是一些sugar syntax,您也可以将其替换为通常的:value + @input(取决于字段的类型)。我现在更喜欢使用那些 2 而不是 v-model,尤其是对于你现在确实存在的那种限制。

【讨论】:

    【解决方案2】:

    你真的不能那样做。

    我建议您在像这样加载组件时设置一个变量:

    data()
    {
        return {
            model_string: '',
        }
    }
    

    然后你根据你自己的条件给你的变量一些值

    created() {
       if (your.first.condition) {
        this.model_string = your.value;
       } else if (your.other.condition) {
        this.model_string = your.value;
       }
    }
    

    在此之后,您可以在视图中随意使用它

    <input v-model="model_string" ..... // your attributes>
    

    【讨论】:

      【解决方案3】:

      最终自己解决了。

      <input
          :type="question.accepts_multiple_answers ? 'checkbox' : 'radio'"
          :id="'ans-' + answer.id"
          :value="question.accepts_multiple_answers ? answer.id : [answer.id]"
          v-model="selected_answers"
      />
      

      【讨论】:

      • 正如我在回答中所说的,这里基本上有 2 个value。也许删除 v-model 并将其更改为 @input 类似 @input=selected_answers = $event.value。
      • 不确定拥有 2 个 value 是什么意思。官方 vue 文档显示了在相同元素上同时存在 v-model 和 value 的示例
      • 取决于输入的类型。对于文本,保留v-model IMO 没有任何意义,但您可以。这样说不会出错。
      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 2020-06-27
      • 2019-03-20
      • 2020-03-17
      • 1970-01-01
      • 2021-06-18
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多