【问题标题】:How can I set selected option selected in vue.js 2?如何设置在 vue.js 2 中选择的选定选项?
【发布时间】:2017-10-05 22:47:24
【问题描述】:

我的组件vue是这样的:

<template>
    <select class="form-control" v-model="selected" :required @change="changeLocation">
        <option :selected>Choose Province</option>
        <option v-for="option in options" v-bind:value="option.id" >{{ option.name }}</option>
    </select>
</template>

我用这个:&lt;option :selected&gt;Choose Province&lt;/option&gt; 来选中

但是当执行时,在 gulp watch 上存在错误

这样的错误:

错误 ./~/vue-loader/lib/template-compiler.js?id=data-v-53777228!./~/vue-load er/lib/selector.js?type=template&index=0!./resources/assets/js/components/bootst rap/LocationBsSelect.vue 模块构建失败:SyntaxError: Unexpected 令牌 (28:4)

看来我的步骤是错误的

我该如何解决?

【问题讨论】:

标签: javascript vue.js vuejs2 vue-component


【解决方案1】:

处理错误

您将属性绑定到任何内容。 :required

<select class="form-control" v-model="selected" :required @change="changeLocation">

:selected

<option :selected>Choose Province</option>

如果你这样设置代码,你的错误应该消失了:

<template>
  <select class="form-control" v-model="selected" :required @change="changeLocation">
    <option>Choose Province</option>
    <option v-for="option in options" v-bind:value="option.id" >{{ option.name }}</option>
 </select>
</template>

使选择标签具有默认值

  1. 您现在需要有一个名为 selecteddata 属性,以便 v-model 工作。所以,

    {
      data () {
        return {
          selected: "Choose Province"
        }
      }
    }
    
  2. 如果这看起来工作量太大,您也可以这样做:

    <template>
      <select class="form-control" :required="true" @change="changeLocation">
       <option :selected="true">Choose Province</option>
       <option v-for="option in options" v-bind:value="option.id" >{{ option.name }}</option>
      </select>
    </template>
    

什么时候用什么方法?

  1. 如果您的默认值取决于某些数据属性,您可以使用v-model 方法。

  2. 如果您的默认选择值恰好是第一个option,则可以使用第二种方法。

  3. 您也可以通过这样做以编程方式处理它:

    <select class="form-control" :required="true">
      <option 
       v-for="option in options" 
       v-bind:value="option.id"
       :selected="option == '<the default value you want>'"
      >{{ option }}</option>
    </select>
    

【讨论】:

  • :selected="option == '&lt;the default value you want&gt;'" 帮助了我很多。谢谢。
  • @Amesh Venugopal,我试过这个&lt;option v-for="recipe in recipes" :selected="option == 'Sugar Cookies (Default)'"&gt;{{ recipe }}&lt;/option&gt;,但第一个选项在选择列表中仍然是空白的。你会发布小提琴来展示它是如何工作的吗?
  • :selected="option == ''" 帮我
【解决方案2】:

最简单的答案是将选中的选项设置为truefalse

<option :selected="selectedDay === 1" value="1">1</option>

数据对象在哪里:

data() {
    return {
        selectedDay: '1',
        // [1, 2, 3, ..., 31]
        days: Array.from({ length: 31 }, (v, i) => i).slice(1)
    }
}

这是设置所选月份日期的示例:

<select v-model="selectedDay" style="width:10%;">
    <option v-for="day in days" :selected="selectedDay === day">{{ day }}</option>
</select>

在您的数据集上:

{
    data() {
        selectedDay: 1,
        // [1, 2, 3, ..., 31]
        days: Array.from({ length: 31 }, (v, i) => i).slice(1)
    },
    mounted () {
        let selectedDay = new Date();
        this.selectedDay = selectedDay.getDate(); // Sets selectedDay to the today's number of the month
    }
}

【讨论】:

  • 这可行,但不是因为:selected 绑定。使用v-model 意味着忽略任何checkedvalueselected 属性。请在此处查看基本用法,其中描述了对特定属性的忽略 - vuejs.org/v2/guide/forms.html
  • 也可以使用短版::selected="selectedDay === 1"
  • @LucasMorgan,当使用在挂载时动态获取选项列表的组件时,v-model 似乎不起作用。这个解决方案是迄今为止我发现的唯一一个在那个场景中工作的解决方案。
  • 一个人也可以通过一些类似的逻辑来缩短它:this.days = [...Array(31)];,然后是&lt;option v-for="(_, day) in days" :selected="selectedDay === day"&gt;{{ day }}&lt;/option&gt;。祝你好运。
  • 话虽如此,我认为一个人也应该使用图书馆来挑选日期,因为如果他们尝试开始计算月份和闰年中的天数,他们将进入一个痛苦的世界。这是一个特征明确的问题,最好留给已经有单元测试和良好 API 的库。
【解决方案3】:
<select v-model="challan.warehouse_id">
<option value="">Select Warehouse</option>
<option v-for="warehouse in warehouses" v-bind:value="warehouse.id"  >
   {{ warehouse.name }}
</option>

这里的“challan.warehouse_id”来自于你得到的“challan”对象:

editChallan: function() {
    let that = this;
    axios.post('/api/challan_list/get_challan_data', {
    challan_id: that.challan_id
 })
 .then(function (response) {
    that.challan = response.data;
 })
 .catch(function (error) {
    that.errors = error;
  }); 
 }

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
【解决方案4】:

您只需从选定和必需的属性中删除 v-bind (:)。 像这样:-

<template>
    <select class="form-control" v-model="selected" required @change="changeLocation">
        <option selected>Choose Province</option>
        <option v-for="option in options" v-bind:value="option.id" >{{ option.name }}</option>
    </select>
</template>

您没有通过这些属性将任何内容绑定到 vue 实例,这就是它给出错误的原因。

【讨论】:

  • 使用您的示例给出了一个名为“selected”的属性,其值为 selected... selected="selected"
【解决方案5】:

另一种我经常觉得更可靠的方法是,您可以在 app.js 或启动 VueJS 的任何位置添加指令,例如:

Vue.directive('attr', (el, binding) => {
  if (binding.value === true) binding.value = ''
  if (binding.value === '' || binding.value) {
    el.setAttribute(binding.arg, binding.value)
  }
})

然后您可以使用v-attr 来设置一个属性,例如:

<option value="Western Australia" v-attr:selected="form.state == 'Western Australia'">Western Australia</option>

【讨论】:

    【解决方案6】:

    我的反应式多选代码

    data() {
        return {
            article: {title: 'aaaaa', 'categoriesIds': [1,3], ...},
            selectCategories: {1: 'xxx', 2: 'www', 3: 'yyy', 4: 'zzz'},
        }
    },
    

    模板

    <div class="form-group">
         <label for="content">Categories</label>
         <select name="categories" 
             v-model="article.categoriesIds" 
             id="categories" 
             multiple 
             class="form-control col-md-5" 
             size="6">
             <option v-for="(category, key) in selectCategories" 
                 :key="key" 
                 v-bind:value="key">{{category}}</option>
         </select>
    </div>
    

    所选项目绑定到 article.categoriesIds 数组。

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2017-05-30
      • 2017-06-29
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多