programing

클릭 시 특정 (이) 버튼 클래스를 변경하는 방법Vue.js 2.0 사용

itsource 2022. 7. 27. 23:09
반응형

클릭 시 특정 (이) 버튼 클래스를 변경하는 방법Vue.js 2.0 사용

임의의 버튼을 클릭하면, 모두 액티브하게 됩니다.그래서 내가 원하는 것은 클릭된 것만 바꾸면 되는 것이다.

var vm = new Vue({
	el: '#toolBtns',
	data: {
		isActive: false
	},
	computed: {
		activeClass: function () {
			return {
				active: this.isActive
			};
		}
	}
});
<div class="btn-group" role="group" id="toolBtns">
  <button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn1</button>
  <button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn2</button>
  <button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn3</button></div>

현재 선택되어 있는 버튼을 찾으려면 변수가 필요할 수 있습니다.또한 이 변수를 사용하여 올바른 클래스를 동적으로 바인딩할 수 있습니다.:class="{active: activeBtn === 'btn1' }".

이 접근방식의 장점은 현재 선택된 버튼을 저장하는 변수가 배열이 아닌 하나의 변수만 있기 때문에 버튼을 선택할 때마다 어레이를 반복할 필요가 없다는 것입니다.

var vm = new Vue({
	 el: '#toolBtns',
	 data: {
 		activeBtn:''
	 }
 });
.active{
  background-color:red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.js"></script>
<div id="toolBtns">
<div class="btn-group" role="group" id="toolBtns">
  <button class="btn" type="button" @click="activeBtn = 'btn1'" :class="{active: activeBtn === 'btn1' }">Btn1</button>
  <button class="btn" type="button" @click="activeBtn = 'btn2'" :class="{active: activeBtn === 'btn2' }">Btn2</button>
  <button class="btn" type="button" @click="activeBtn = 'btn3'" :class="{active: activeBtn === 'btn3' }">Btn3</button></div>
</div>

여기서 일하는 바이올린 좀 봐.

isActive: false'를 설정할 필요도 없고 각 항목에 isActive를 바인딩할 필요도 없습니다.다음과 같이 할 수 있습니다.1, '후보'라고 불리는 배열을 선언하면 클릭된 각 항목이 후보 배열에 푸시됩니다.2, 항목이 후보 배열에 있는지 여부를 체크하는 'contains()'라고 하는 함수를 선언합니다.3, 각 항목에 바인드(bind contains(). CSS에서 4는 몇 가지 스타일을 '클릭'합니다.

html 코드:

<body>
    <div id="toolBtns">
        <button v-for="item in buttons" v-on:click="provide(item)" v-bind:class="{clicked: contains(candidates, item)}" type="button">{{ item.name }}
        </button>
    </div>
</body>

javascript 코드:

var toolBtns = new Vue({
el: '#toolBtns',
data: 
{
    buttons: [
        {name: 'Btn1'},
        {name: 'Btn2'},
        {name: 'Btn3'},
    ],
    candidates: [],
},
methods:
{
    provide: function(item)
    {
        if(this.candidates.indexOf(item) == -1)
        {
            this.candidates.push(item);
        }
        else
        {
             this.candidates.splice(this.candidates.indexOf(item), 1);
        }
    },
    contains: function(arr, item)
    {
        return arr.indexOf(item) != -1;
    },
}
});

CSS 코드

.clicked{
    background-color: red;
}

다음은 jsfiddle의 예시입니다.https://jsfiddle.net/JoyAndBrave/anzdzq4L/6/

위 솔루션의 방향은 맞지만 인덱스를 직접 사용하기 때문에 오류에 매우 취약합니다.위의 답변에서 제시된 바와 같이 v-for를 실행하면 기본적으로 문제가 해결됩니다.

var vm = new Vue({
 el: '#toolBtns',
 data: {
    buttons:[{name:'Btn1',active:false},{name:'Btn2',active:false},
            {name:'Btn3',active:false}]
 },
 methods: {
   toggleActiveClass:function(index){
     this.buttons[index].active=!this.buttons[index].active;
   }
  }
});


 <div class="btn-group" role="group" id="toolBtns">
   <button v-for="(btn, index) in buttons" type="button" 
               @click="toggleActiveClass(index)"
              :class="{active: btn.active}">{{btn.name}}
   </button>
 </div>

작업중 : https://jsfiddle.net/z11fe07p/547/

언급URL : https://stackoverflow.com/questions/42062491/how-to-change-a-specific-this-button-class-when-click-on-using-vue-js-2-0

반응형