Vue.jsのv-classとv-model
このエントリは、v-classを初めて使ったのでその説明だけ載せるようと思っていましたが、説明用に作成したコードで詰まりかけたので、
v-modelとの兼ね合いも書いておきます。
チェックボックスで使うv-class
v-classは、Vue.jsオブジェクトの値を元に、classを設定するディレクティブになります。
シンプルな形で書いてみます。
<div id="app"> <input type="checkbox" v-model="hoge">hoge <input type="checkbox" v-model="hage">hage <hr> <p v-class="bold: hoge">hoge</p> <p v-class="bold: hage">hage</p> </div>
var vm = new Vue({ el: '#app', data: { hoge: false, hage: false } });
.bold { font-weight: bold; }
hogeをチェックすると、下のhogeが太字になります。hageも同様です。
このとき、v-modelでvue.jsに渡されるのは、trueかfalseです。
v-classで真偽値を扱う場合は、bold: hoge
のように引数をつけます。
セレクトボックスで使うv-class
では、selectタグのように、v-modelで真偽値ではなく、文字列が渡される場合はどのようにしたら良いのでしょうか。 また簡単なサンプルを載せます。
<div id="app"> <select v-model="freeza" size="4"> <option value="first-form">第1形態</option> <option value="second-form">第2形態</option> <option value="third-form">第3形態</option> <option value="fourth-form">第4形態</option> </select> <div v-class="freeza"></div> </div>
var vm = new Vue({ el: '#app', data: { freeza: "" } });
.first-form { background: url("../images/freeza-first.jpg"); width: 400px; height: 232px; } .second-form { background: url("../images/freeza-second.jpg"); width: 280px; height: 300px; } .third-form { background: url("../images/freeza-third.jpg"); width: 200px; height: 288px; } .fourth-form { background: url("../images/freeza-fourth.jpg"); width: 280px; height: 460px; }
例えば、セレクトボックスの第1形態を選択すると、divのbackgroundで第1形態の画像がでてくるようにしました。 この場合、選択されていない状態は
data { freeza: "" }
で、 選択されるとvalueの値がfreezaに設定されるイメージです。
data { freeza: "first-form" }
divのclass名はv-class="freeza"
としてありますが、
v-classは引数無しだと、vueオブジェクトの値をそのままclass名にしてくれます。
これは実際セレクトボックスを選択したあとv-class="first-form"
になります。
そのため、cssにはoptionのvalueをそのままクラス名として書けばOKなのです!