如何在Vue中有条件地设置选定的选项

Posted

技术标签:

【中文标题】如何在Vue中有条件地设置选定的选项【英文标题】:How to conditionally set selected option in Vue 【发布时间】:2018-07-02 15:40:14 【问题描述】:

是否可以预先设置选择框的选中值?

使用 Vue (v2),我尝试在 Vue 模板中创建一个像这样的选择框。

<select v-model="selectedFlavor">
   <option v-for="flavor in flavors" 
           :value="flavor"
           :selected="selectedFlavor == flavor"> flavor </option>
</select>

还有一个像这样的组件:

Vue.component('flavor-pane', 
      ...
      data: function() 
          selectedFlavor: 'strawberry',
          flavors: ['blueberry', 'lime', 'strawberry'],
      );

本质上,这个想法是我需要循环一个简单的数组,在一个选择框中创建几个选项,并将选择框的值设置为现有值。我可以这样做吗?

我的模板/组件渲染良好,但即使满足条件并且选择框中没有选择值,selected 属性似乎也不会出现在 html 中。

【问题讨论】:

【参考方案1】:

是的,这是可能的。 我创建了这个例子https://jsfiddle.net/Luvq9n4r/2/ 来帮助你。 要更改选定的值,只需设置模型。 如果它不是你需要的,请也做一个小提琴。

谢谢。

new Vue(
  el: '#app',
  data: function() 
    return 
      selectedFlavor: 'lime',
      flavors: ['blueberry', 'lime', 'strawberry']
    
  ,
  methods: 
    change: function() 
      this.selectedFlavor = 'strawberry';
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.min.js"></script>
<div id="app">
  <button @click="change()">Set Strawberry</button>
  <select v-model="selectedFlavor">
    <option v-for="flavor in flavors" :value="flavor">flavor</option>
  </select>
</div>

【讨论】:

您的回答很好,但我意识到我的问题可能措辞不当。我需要有条件地在 对,就是这样,预先计算selectedFlavor。我不知道设置selected 属性是否会反映在模型上。但是在控制器上计算 selectedFlavor 属性和设置工作正常。 github.com/vuejs/vue/issues/308 似乎回答了这个问题,可能与此评论有关:github.com/vuejs/vue/issues/308#issuecomment-314248619 - 这解决了我的问题【参考方案2】:

您在选择时使用v-modelselectedFlavor 是正确的。这样做binds the value的选择框的值为selectedFlavor。当您更改selectedFlavor 的值时,您会更改选择元素的值。这是双向的; IE。如果您更改选择框,您还将更改selectedFlavor 的值(即two-way data binding、reactivity)。

更改 select 元素的值也会更改哪个 option 元素具有 selected 属性。您可以使用此 v-model 数据绑定来实现您的目标,但这只是功能等效的结果。您的用例可能会有所不同。

如果您可以使用此方法更改选择框的值,那么在data 对象中设置selectedFlavor 的初始值将实现您设置选择框默认值的目标,因此哪个选项元素具有选定的属性。

您可以通过直接更改绑定到的数据模型的值或(最好)通过某种状态管理(例如Vuex)来更改选择框的值。状态管理回答了有关根据来自其他事件、数据源、API、Web 套接字等的动态数据管理选择状态的更大问题......

我直接修改下面selectedFlavor 的值只是为了突出基本概念,但我也试图暗示这在状态管理范式中可能是什么样子。

<select v-model="selectedFlavor">
   <option v-for="flavor in flavors" 
           :value="flavor"
           @change="onChangeFlavour"
           > flavor </option>
</select>

new Vue(
  el: '#app',
  data() 
    return 
      selectedFlavor: 'lime', // Default value is set here
      flavors: ['blueberry', 'lime', 'strawberry']
    
  ,
  methods: 
    onChangeFlavour(event) 
      // do what you want with the new value when the select box is changed
      console.log(event.srcElement.value);
      // OR preferably
      console.log(this.selectedFlavor); // because binding
    ,
    setFlavour(newFlavour)
      // change the value
      this.selectedFlavor = newFlavour;
    
  
);

【讨论】:

【参考方案3】:

您可以使用 jquery 和 vue 在线选择一个选项。

1.包括 jquery

window.$ = require('jquery');
window.JQuery = require('jquery');

2。 HTML/php 更新 在select tag 中添加data-selected 字段。

<select v-model="company" name="company" data-selected=" $document->company_id ">
   <option value=" $company->id "> $company->name </option>
</select>

3. Vue 更新

const app = new Vue(
   el: '#app',
   data: 
      company: '',
      companies: '',
   
   methods: 
      getCompanies: function () 
         axios.post('/company/getdata').then(function (response) 
            app.companies = [];
            app.companies = response.data;

            // Check if .editCompany is present. 
            if ($('.editCompany').length > 0) 
               app.company = $('.editCompany').data('selected');
            
         ).catch(error => console.log(error));
      ,
   ,
   created: function () 
      this.getCompanies();
   
);

【讨论】:

非常糟糕的建议

以上是关于如何在Vue中有条件地设置选定的选项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue 中有条件地添加一个类?

在 Vue.js 中有条件地定位具有 CSS 样式的类

如何在我的 vue 模板脚本中有条件地调用 apollo 客户端?

如何以编程方式在RadioGroup上设置选定的索引?

Vue JS如何根据传递的嵌套v-for值设置选项?

如何在反应中有条件地添加样式? [复制]