🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

解決済

1回答

6329閲覧

Vue.jsでv-on:clickの引数をmethods内で使用したいがうまくいかない

grimro92

総合スコア15

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2020/05/05 12:49

前提・実現したいこと

Vue.jsでv-on:click=""の引数をmethodsに送り、使用したいのですがうまくいきません。
【実現したい流れ】
赤、青、緑の3つのボタンとパネルがあり、ボタンを押すとその色と同じパネルが出現する。

どうかご教授お願い致します。

該当のソースコード

html

1<template> 2 <div> 3 <button @click="panelMethods(redPanel)"></button> 4 <button @click="panelMethods(bluePanel)"></button> 5 <button @click="panelMethods(greenPanel)"></button> 6 7 <div v-show="redPanel"></div> 8 <div v-show="bluePanel"></div> 9 <div v-show="greenPanel"></div> 10 </div> 11</template>

javascript

1export default { 2data(){ 3 return{ 4 redPanel: false, 5 bluePanel: false, 6 greenPanel: false 7 } 8 }, 9 10 methods:{ 11 panelMethods(value){ 12 this.value = !this.value 13 } 14 }

補足情報(FW/ツールのバージョンなど)

【vue cli】v4.3.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この書き方の引数のvaluethis.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:21

rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grimro92

2020/05/05 14:40

とても丁寧な回答・解説ありがとうございます。なるほど、dataのプロパティにはthis['プロパティ名']とアクセスするのですね...勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問