2017-05-25 32 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

相關問題