2017-06-22 19 views
1

我嘗試使用vue.js創建調查,這非常棒。在每個部分中,用戶可以通過單擊div.box來選擇答案。 click事件之後,我想的事情發生:通過單擊突出顯示構建vue.js調查

  1. 點擊對話框的分配data-value=""data:層我的應用程序所選擇的答案

  2. 標記點擊div.box加入.choosen,而同一類應該刪除同一部分中的所有其他框。

我得到了我的HTML標記是這樣的:

<div class="wrapper"> 
    <div class="box-holder"> 
    <div class="box" data-value="lorem">Dogs</div> 
    </div> 
    <div class="box-holder"> 
    <div class="box" data-value="aperiam">Birds</div> 
    </div> 
    ... and some more ... 
</div> 

在jQuery中我可以簡單地創建一個$('.box')選擇和使用.parent()removeClass()addClass()。我怎樣才能在vuejs中實現相同?

JS FIDDLE DEMO

回答

1

new Vue({ 
 
    el: ".wrapper", 
 
    data: { 
 
    list: [ 
 
     { 
 
     id: 'lorem', 
 
     text: 'Dogs' 
 
     }, 
 
     { 
 
     id: 'aperiam', 
 
     text: 'Birds' 
 
     }, 
 
     { 
 
     id: 'aperiam2', 
 
     text: 'Birds2' 
 
     }, 
 
     { 
 
     id: 'aperiam3', 
 
     text: 'Birds3' 
 
     } 
 
    ], 
 
    choosen: 'lorem' 
 
    }, 
 
    methods: { 
 
    onClick: function(id) { 
 
     this.choosen = id; 
 
    } 
 
    } 
 
})
.choosen{ 
 
    color: red 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script> 
 
<div class="wrapper"> 
 
    <div 
 
    class="box-holder" 
 
    v-for="item in list" 
 
    :class="{ 'choosen': choosen === item.id }" 
 
    > 
 
    <div class="box" @click="onClick(item.id)">{{ item.text }}</div> 
 
    </div> 
 
</div>

+0

Hey Mixa,感謝這個偉大的和無代碼建議。有沒有辦法將多個部分分開,例如最喜歡的寵物和最喜歡的運動,以便它們不會互相影響? –

+0

使用組件我添加了一個例子 – Mixa

0

您需要點擊處理程序添加到您的元素,並有條件類綁定。例如:在綁定類在這裏

<div class="box" data-value="lorem" 
    v-on:click="favoritePet = 'dogs' " 
    v-bind:class="{ choosen: favoritePet == 'dogs' }" 
>Dogs</div> 

文檔:https://vuejs.org/v2/guide/class-and-style.html#Object-Syntax 和事件處理在這裏:https://vuejs.org/v2/guide/events.html

+0

是否有解決方案,我不必編輯每個框?就像創建一個組件並只傳遞變化的參數一樣? –

+0

是的https://vuejs.org/v2/guide/components.html 你可以根據你的盒子元素創建一個組件,並將其作爲道具傳遞給動物類型 – Ferdia

0

使用組件

Vue.component('question', { 
 
    template: '#question', 
 
    data: function() { 
 
    return { 
 
     choosen: undefined 
 
    } 
 
    }, 
 
    props: ['data'], 
 
    methods: { 
 
    onClick: function(choosen) { 
 
     this.choosen = choosen; 
 
     this.$emit('set-question', this.choosen, this.data.id) 
 
    } 
 
    } 
 
}) 
 

 
new Vue({ 
 
    el: "#app", 
 
    data: { 
 
    question: {}, 
 
    question1: { 
 
     id: 'question1', 
 
     list: [ 
 
     { 
 
      id: 'lorem', 
 
      text: 'Dogs' 
 
     }, 
 
     { 
 
      id: 'aperiam', 
 
      text: 'Birds' 
 
     }, 
 
     { 
 
      id: 'aperiam2', 
 
      text: 'Birds2' 
 
     }, 
 
     { 
 
      id: 'aperiam3', 
 
      text: 'Birds3' 
 
     } 
 
     ], 
 
     title: 'Your favorite pet?' 
 
    }, 
 
    question2: { 
 
     id: 'question2', 
 
     list: [ 
 
     { 
 
      id: 'lorem', 
 
      text: 'Dogs' 
 
     }, 
 
     { 
 
      id: 'aperiam', 
 
      text: 'Birds' 
 
     }, 
 
     { 
 
      id: 'aperiam2', 
 
      text: 'Birds2' 
 
     }, 
 
     { 
 
      id: 'aperiam3', 
 
      text: 'Birds3' 
 
     } 
 
     ], 
 
     title: 'Your favorite sport?' 
 
    } 
 
    }, 
 
    methods: { 
 
    setQuestion: function(choosen, id) { 
 
     this.question[id] = choosen; 
 
     console.log(this.question); 
 
    } 
 
    } 
 
})
.choosen{ 
 
    color: red 
 
} 
 
#app{ 
 
    padding-bottom: 200px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script> 
 
<div id="app"> 
 
    <question :data="question1" @set-question="setQuestion"></question> 
 
    <question :data="question2" @set-question="setQuestion"></question> 
 
</div> 
 

 
<template id="question"> 
 
    <div> 
 
    <h1>{{data.title}}</h1> 
 
    <div class="wrapper"> 
 
     <div 
 
      class="box-holder" 
 
      v-for="item in data.list" 
 
      :class="{ 'choosen': choosen === item.id }" 
 
      > 
 
     <div class="box" @click="onClick(item.id)">{{ item.text }}</div> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</template>