2017-05-25 54 views
1

我被困,伙计们。也许我的问题有简单的解决方案。请帮帮我。 这是问题。我如何连接按钮,并凭借其在Vue的选项中选择JS

我有5个可能的选项可供选择。比方说,[A,B,C,d,E]

我的布局是两个按钮选择下拉菜单。 换句话说,我举两个可能性用户:

无论点击的两个按钮一个或从列表中选择。

所以模板是有点

<button> A <button> 
<button> B <button> 
<select v-model="selected"> 
    <option :value="i" v-for="i in list">i</option> 
</select> 

在我的剧本我有

data() { 
     return { 
     list: ['c', 'd', 'e'] 
     } 
    } 

我怎么能这三个要素结合成一个。我能以某种方式使用V模型吗?现在的原因,我可以从列表中选择选项。那么我该怎么做。如果我将@click事件添加到按钮,他们应该处理什么?

我认为做计算的值,如检查是否selected不是未定义或等于'',则该选项是selected。但为了绑定按钮点击事件,我应该创建方法来处理他们的国家,像

data() { 
     return { 
     list: ['c', 'd', 'e'], 
     a: false, 
     b: false 
     } 
    }, 
methods: { 
    handleA() { 
    this.a = true 
    this.b = false  
    }, 
    handleB() { 
    this.b = true 
    this.a = false  
    } 
} 

,然后每点击将改变falsetrue,此外还需要有一个逻辑,只保留一个true状态:对于a(按钮A),b(按钮B)或selected。真是太错误了。在我看来,我让事情变得更加困难。必须有一个简单的方法。

+0

所以,单击按钮一次,值A,单击两个值是B,否则从列表中选择C,d或E? – Bert

+0

是的,价值只能是这5个选项之一。 – ogostos

回答

1

我推荐一个组成部分。构建组件以支持v-model

Vue.component("picker",{ 
    props:["value"], 
    data(){ 
    return { 
     list:["c","d","e"], 
     currentValue: this.value, 
     selectedValue: "" 
    } 
    }, 
    template:` 
    <div> 
     <button @click="currentValue = 'a'">A</button> 
     <button @click="currentValue = 'b'">B</button> 
     <select @change="currentValue = $event.target.value" v-model="selectedValue"> 
      <option value="">Select a value</option> 
      <option v-for="item in list" :value="item" :key="item">{{item}}</option> 
     </select> 
    </div> 
    `, 
    watch:{ 
    currentValue(newValue){ 
     if (!this.list.includes(newValue)) 
     this.selectedValue = "" 

     this.$emit('input', newValue) 
    } 
    } 
}) 

new Vue({ 
    el:"#app", 
    data:{ 
    pickedValue: null 
    } 
}) 

Example

+0

所以,我可以忽略'v-model'并简单地赋值'@ click =“currentValue ='_somevalue_'或$ event.target。价值' accroding每个事件发生,点击或选项选择。 它为我工作,但我真的想要得到代码的其余部分。 'CurrentValue的:this.value' '手表:{ CurrentValue的(NEWVALUE){ 此$发出( '输入',NEWVALUE)}' 我们正在关注currentValue'的'每一个变化。当它改变时,我们发出名为* input *的事件传递给它的监听器'newValue'。我们什么时候听这个活动?为什么我们需要在这里使用这个词'currentValue = this.value' – ogostos

+0

@KarénMarkosyan你所问的所有代码都是为了让你可以使用组件外部的'v-model' *。 'v-model'的作用方式是将'value'属性传递给你的组件,并监听'input'事件。 'currentValue:this.value'就是这样的,所以当组件初始化时,如果'v-model'中传递的表达式已经有一个值,那么这个组件将被初始化为值。 – Bert

+0

@KarénMarkosyan基本上[本文档](https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events)涵盖了所有这些内容。 – Bert

1

基本问题是,如果您在012中选择v-model,并且绑定到v-model的变量获取的值不在您的选项中,则变量将重置为空。

你必须拿出一些特殊情况的处理要解决这个问题。一种方法是选择列表设置为v-model计算的可设置的,其解释非列出的值作为空并向selected数据项写入非空值。

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    selected: null, 
 
    list: ['c', 'd', 'e'] 
 
    }, 
 
    computed: { 
 
    proxySelected: { 
 
     get() { 
 
     return this.list.includes(this.selected) ? this.selected : null; 
 
     }, 
 
     set(newValue) { 
 
     if (newValue) { 
 
      this.selected = newValue; 
 
     } 
 
     } 
 
    } 
 
    } 
 
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.min.js"></script> 
 
<div id="app"> 
 
    <button @click="selected = 'a'"> A </button> 
 
    <button @click="selected = 'b'"> B </button> 
 
    <select v-model="proxySelected"> 
 
    <option :value="i" v-for="i in list">{{i}}</option> 
 
    </select> 
 
    Selected value: {{selected}} 
 
</div>

+0

我明白了。最后,我将按钮的值传递给droplist,然后'v-model'处理它的值。但是,不希望在下拉列表中看到我的'a'和'b'选项。有趣的是,当你点击任何按钮时,它的值将被添加到列表中*,并且新添加的选项出现在顶部*上。无论如何这是一个工作解决方案,谢谢你的回答。 – ogostos

+0

查看更新的答案。 –

+0

完美。它正在工作。 – ogostos