![見出し画像](https://assets.st-note.com/production/uploads/images/73025695/rectangle_large_type_2_aab9037b04f5023da5c5e4083f7fcd45.png?width=800)
Vue.js勉強記録その5 コンポーネントを使おう section3-2 ver2
こちらの書籍で勉強しています!
今日は、Chapter3 のSection3-2の続きから!!
■v属性を使いこなす
・v-onでイベントをバインドする
今度はイベント。イベントが出てくると、一気にプログラムらしくなって楽しくなってきますね。
今回は、まず最初に出来ないパターンのコードが出てきて、その後に正しい書き方を紹介されています。
まずは、出来ないパターンのコード
<h1 class="bg-secondary text-white display-4 px-3">Vue3</h1>
<div id="app" class="container">
<p>{{message}}</p>
<hello />
</div>
<script>
const appdata = {
data() {
return {
message: '※コンポーネントを表示する',
name: 'no-name'
}
}
}
let app = Vue.createApp(appdata);
app.component('hello', {
data() {
return {
counter: 0
}
},
template: '<p onclick="counter++" class="alert alert-info">clicked:{{counter}}</p>'
});
app.mount('#app');
</script>
このコードが、なぜ動かないかというと、コンポーネント内のテンプレートの表記にある、onclick="counter++"が間違っているから。
このままブラウザで表示して、pタグをクリックすると、counterが無いというエラーが、コンソールに出る。
コンポーネント内の、dataプロパティ内の変数counterをインクリメントする記述だが、どうやら単純にはdataプロパティ内の変数にアクセス出来ないらしい。
なのでv-on属性を使って、イベントを結びつける必要がある。
先ほどのコードの、
template: '<p onclick="counter++" class="alert alert-info">clicked:{{counter}}</p>'
を、
template: '<p v-on:click="counter++" class="alert alert-info">clicked:{{counter}}</p>'
この様に直すと、動く様になる。
正しく動くコードの全体は以下
<h1 class="bg-secondary text-white display-4 px-3">Vue3</h1>
<div id="app" class="container">
<p>{{message}}</p>
<hello />
</div>
<script>
const appdata = {
data() {
return {
message: '※コンポーネントを表示する',
name: 'no-name'
}
}
}
let app = Vue.createApp(appdata);
app.component('hello', {
data() {
return {
counter: 0
}
},
template: '<p v-on:click="counter++" class="alert alert-info">clicked:{{counter}}</p>'
});
app.mount('#app');
</script>
処理的には、
1.pタグが表示される。この時、テンプレート内に{{counter}}があるから、数字が(最初は0)が表示される。
2.pタグをクリック。counter++が実行される
3.コンポーネント内の、dataプロパティの変数counterに1足される
4.テンプレート内の{{counter}}の値が変わり、画面に表示される
多分、こんな感じの処理になっていると思われる。
・イベント処理を別途用意する
イベントで行いたい処理が単純なら、v-on:click=""この中に直接書いてもいいけど、処理が長くなると(通常は複数行になると思われる)書くのが大変なので、コンポーネント内に、
method:{
名前(event){処理},
名前(event){処理},
...
}
こんな感じに関数をまとめられる様になっている。eventは、いわゆるイベントオブジェクトっぽい。
クリックするとクラスを変更する処理
<h1 class="bg-secondary text-white display-4 px-3">Vue3</h1>
<div id="app" class="container">
<p>{{message}}</p>
<hello />
</div>
<script>
const appdata = {
data() {
return {
message: '※コンポーネントを表示する',
name: 'no-name'
}
}
}
let app = Vue.createApp(appdata);
app.component('hello', {
data() {
return {
counter: 0,
isInfo: true,
isDark: false
}
},
methods: {
doAction() {
this.counter++;
console.log("counter");
if (this.counter % 2 == 0) {
this.isInfo = true;
this.isDark = false;
console.log("true");
} else {
this.isInfo = false;
this.isDark = true;
console.log("false");
}
}
},
template: '<p v-on:click="doAction" v-bind:class="{\'alert-warning\':isInfo,\'alert-dark\':isDark}" class="alert">clicked:{{counter}}</p>'
});
app.mount('#app');
</script>
pタグをクリックするとカウントが増えていく。そしてクラスが毎回交互につけ替わり、色が変わる。
pタグをクリックすると、doActionメソッドが実行される。
doAction内で、dataメソッドで設定している、counter、isInfo、isDarkを操作しているが、thisを付けて記述する。
if文を作り、counterの値が偶数か奇数かで、処理を分けている。処理自体は、isInfoとisDarkにtrue/falseを付け替えているだけ。
このisInfoとisDarkの真偽値が変わることで、
template: '<p v-on:click="doAction" v-bind:class="{\'alert-warning\':isInfo,\'alert-dark\':isDark}" class="alert">clicked:{{counter}}</p>'
このテンプレート内の、v-bind:classの値が変わる様になっている。
新グルクォートのエスケープ処理があるから、ちょっとわかりにくいですが、この記述は前に出てきましたね。
v-bind:class{クラス名:変数}
この変数に入る真偽値がtrueならクラスが付加され、falseなら外される。
■まとめ
とりあえず今回はここまで。
たくさんコード書いてきて、少しずつvue.jsに慣れてきたかな?って感じです。
やはりイベントが出てくると、どんどん楽しくなりますね。
この記事が気に入ったらサポートをしてみませんか?