この書き方の引数のvalue
とthis.value
は別々の変数です。引数のvalue
は使用されておらず、またthis.value
というプロパティは定義されていないため正常に動作しません。
vue
1panelMethods(value) {
2 this.value = !this.value
3}
このような場合はテンプレートでプロパティの値そのものをメソッドに渡すのではなく、プロパティ名を渡す方法があります。
html
1<button @click="panelMethods(redPanel)"></button>
2
3 ↓ 文字列でプロパティ名を渡す
4
5<button @click="panelMethods('redPanel')"></button>
そしてpanelMethodsメソッドの方はプロパティ名をもとにbooleanの反転を行うようにします。これで期待通りの動作をすると思います。
vue
1panelMethods(propName) {
2 if (propName === 'redPanel') {
3 this.redPanel = !this.redPanel
4 } else if (propName === 'bluePanel') {
5 this.bluePanel = !this.bluePanel
6 } else if (propName === 'greenPanel') {
7 this.greenPanel = !this.greenPanel
8 }
9}
上記の書き方はもう少し簡略化することができます。
dataで定義するプロパティはthis['プロパティ名']
のようにアクセスできるので、このように書き直すことができます。
vue
1methods: {
2 panelMethods(propName){
3 this[propName] = !this[propName]
4 }
5}
下記に動作確認したコードを提示します。
vue
1<template>
2 <div>
3 <button @click="panelMethods('redPanel')">red</button>
4 <button @click="panelMethods('bluePanel')">blue</button>
5 <button @click="panelMethods('greenPanel')">green</button>
6 <div v-show="redPanel">RED</div>
7 <div v-show="bluePanel">BLUE</div>
8 <div v-show="greenPanel">GREEN</div>
9 </div>
10</template>
11<script>
12export default {
13 data() {
14 return {
15 redPanel: false,
16 bluePanel: false,
17 greenPanel: false
18 }
19 },
20 methods: {
21 panelMethods(propName){
22 this[propName] = !this[propName]
23 }
24 }
25}
26</script>
もう1つの解決方法としてclickイベントでプロパティの値を反転する方法があります。この場合はpanelMethodsメソッドは不要です。
html
1<button @click="redPanel = !redPanel">red</button>
2<button @click="bluePanel = !bluePanel">blue</button>
3<button @click="greenPanel = !greenPanel">green</button>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/05 14:40