【问题标题】:Vue JS set first item in a populated select to be selected with v-modelVue JS 将填充选择中的第一项设置为使用 v-model 选择
【发布时间】:2020-05-16 08:16:40
【问题描述】:

我对 vuejs 有一个棘手的挑战,我想要两个选择字段。例如,第一个应该选择水果,第二个应该列出所有水果。如果我从第一个选择字段中选择蔬菜,第二个选择字段应该列出所有蔬菜。

我在网上偶然发现了类似的东西,但我不知道如何选择第二个选择字段中的第一个项目。

每当我选择水果时,第二个选择第一个列表中的第一项应该被默认选择,如果我选择蔬菜,第二个选择字段中的第一项应该被默认选择。

请帮我检查这里的代码:https://jsfiddle.net/aj6g87dh/1/

new Vue({
  el: '#test',
  data: {
    category: 'fruits',
    list: '',
    optionsData: {
       fruits: [
            { text: 'Orange', value: 'orange' },
            { text: 'Banane', value: 'banana' },
       ],
       
       vegetables: [
           { text: 'Brocolis', value: 'brocolis' },
           { text: 'Radish', value: 'radish' },
       ]
    }
  },

  computed: {
    options: function() {
      let options = ''

      switch (this.category) {
        case 'fruits':
          options = this.optionsData.fruits
          break;

        case 'vegetables':
          options = this.optionsData.vegetables
          break;

        default:
          options = this.optionsData.fruits
      }

      return options
    }
  },

  methods: {
    onChange: function() {
      this.options = this.options
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.5/vue.js"></script>
<div id="test">
  <select v-model="category" v-on:change="onChange" id="select1">
    <option value="fruits">Fruits</option>
    <option value="vegetables">Vegetables</option>

  </select>

  <select id="select2" v-model="list">
    <option v-for="option in options" v-bind:value="option.value"> {{ option.text }} </option>
  </select>

  <span>{{  }}</span>

</div>

【问题讨论】:

标签: javascript vue.js vuejs2


【解决方案1】:

您可以删除 onChange 方法并添加一个 watch 属性。这样您就可以在那里处理不断变化的逻辑。

此外,您可以将选项检索简化为一行。

new Vue({
  el: '#test',
  data: {
    category: 'fruits',
    list: '',
    optionsData: {
      fruits: [{
          text: 'Orange',
          value: 'orange'
        },
        {
          text: 'Banane',
          value: 'banana'
        },
      ],

      vegetables: [{
          text: 'Brocolis',
          value: 'brocolis'
        },
        {
          text: 'Radish',
          value: 'radish'
        },
      ]
    }
  },

  computed: {
    options: function() {
      return this.optionsData[this.category]
    }
  },
  watch: {
    category: {
      handler: function(newVal) {
        this.list = this.optionsData[newVal][0].value;
      },
      immediate: true
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="test">

  <select v-model="category" id="select1">
    <option value="fruits">Fruits</option>
    <option value="vegetables">Vegetables</option>

  </select>

  <select id="select2" v-model="list">
    <option v-for="(option, i) in options" v-bind:value="option.value"> {{ option.text }} </option>
  </select>

  <span>{{ }}</span>

</div>

【讨论】:

  • 非常感谢,但是当我第一次加载页面时,我应该将橙色作为默认选择字段。这就是我实现它的方式,但我知道是否有办法改进它。 mounted() { var groupSelect = this.$refs.groupSelect.children; ` if (groupSelect.length) {` ` this.list = groupSelect[0].value;` } } ` 然后我用这个
  • 您可以添加immediate 属性以使其在页面首次加载时工作。我更新了我的答案。
猜你喜欢
  • 2022-07-15
  • 2019-08-12
  • 2021-06-27
  • 2020-04-28
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多