[英]Vue.js - change color for all elements except the element clicked
我正在嘗試從jQuery切換到Vue.js,對此我有些猶豫。 我在頁面上有3個按鈕。 當我單擊一個按鈕時,我希望所有其他按鈕將背景色更改為綠色,並單擊所單擊的按鈕-將其顏色更改為黑色。
jQuery只有2行代碼,但我不知道如何使用Vue.js完成。 Vue.js似乎也沒有this關鍵字。
另外,在這一點上,我只想應用原始的CSS背景顏色屬性,而不是應用類。
這是我的jQuery代碼-非常簡單
<div class="main-content-area">
<div class="btn">Click me!</div>
<div class="btn">Click me!</div>
<div class="btn">Click me!</div>
</div>
const Example = new Vue({
el: '.main-content-area',
methods: {
addEventListeners() {
$(document).ready(function() {
$(".btn").click(function() {
$(".btn").css("background-color", "green"); // Make all buttons green
$(this).css("background-color", "black"); // Make the clicked button black
});
});
}
},
mounted: function() {
this.addEventListeners();
}
})
有了Vue.js,我到此為止...
<div class="main-content-area">
<div class="btn" @click="changeColor">Click me!</div>
<div class="btn" @click="changeColor">Click me!</div>
<div class="btn" @click="changeColor">Click me!</div>
</div>
const Example = new Vue({
el: '.main-content-area',
methods: {
changeColor() {
// Change color to green for all .btn elements
// and change color for clicked .btn to black
}
})
使用按鈕組件:
HTML:
<div class="main-content-area">
<my-custom-button component-type="my-custom-button" ></my-custom-button>
<my-custom-button component-type="my-custom-button"></my-custom-button>
<my-custom-button component-type="my-custom-button"></my-custom-button>
</div>
JavaScript:
Vue.component("my-custom-button",{
template : '<div class="btn" :style="buttonStyles" @click="activeThisButton" >Click me!</div>',
data(){
return {
isActive : false,
}
},
computed : {
buttonStyles(){
return {
backgroundColor : this.isActive ? 'green' : '',
}
}
},
methods : {
activeThisButton(){
// call inactiveAllButtons on parent to deselect all buttons
this.$root.inactiveAllButtons();
// active current button
this.isActive = true;
}
}
})
const Example = new Vue
({
el: '.main-content-area',
methods : {
// filter children and find buttons ( by component-type property )
// and inactive all .
inactiveAllButtons(){
var buttons = this.$children.filter(function(child) {
return child.$attrs['component-type'] === 'my-custom-button';
});
for(var i = 0 ; i < buttons.length ; i++ ){
buttons[i].isActive = false;
}
}
}
});
這是一種更好的方法,無需使用不安全的$root
和$children
。
<template>
<div class="hello">
<button class="btn" @click="activeButton = 0" v-bind:style="{'background-color':buttonColor[0]}">Click me!</button>
<button class="btn" @click="activeButton = 1" v-bind:style="{'background-color':buttonColor[1]}">Click me!</button>
<button class="btn" @click="activeButton = 2" v-bind:style="{'background-color':buttonColor[2]}">Click me!</button>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
activeButton: 0
};
},
computed: {
buttonColor: function() {
let result = [];
for (var i = 0; i< 3; i++){
if (this.activeButton == i){
result.push('black');
} else {
result.push('green');
}
}
return result;
}
}
};
</script>
演示: https : //codesandbox.io/s/8kz9y0rjj9
您還可以按照@Zoha的建議將button
包裝在單獨的組件中,但是鑒於您沒有要求,我沒有這樣做。 這將允許在組件中隱藏buttonColor
實現。
還請注意,使用類是更可取buttonColor
方法:無需丑陋的buttonColor
計算函數。
<template>
<div class="hello">
<button class="btn" @click="activeButton = 0" v-bind:class="{'greenBtn':true, 'blackBtn': activeButton == 0}">Click me!</button>
<button class="btn" @click="activeButton = 1" v-bind:class="{'greenBtn':true, 'blackBtn': activeButton == 1}">Click me!</button>
<button class="btn" @click="activeButton = 2" v-bind:class="{'greenBtn':true, 'blackBtn': activeButton == 2}">Click me!</button>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
activeButton: 0
};
},
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.greenBtn {
background-color: green
}
.blackBtn {
background-color: black
}
</style>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.