Vue3で○×ゲームを作る①
タグ:
vue3
v-forでmasuコンポーネントを繰り返し利用する
まずはcomponentsフォルダにMasuコンポーネントを作り、styleだけ定義しました。
そのMasuコンポーネントをApp.vueから読み込み、v-for
を使い、必要なマス目の数だけ作成します。
App.vue
<template> <div class="board"> <Masu v-for="n of 9" v-bind:key="n" /> </div> </template> <script> import Masu from "./components/Masu.vue"; export default { name: "App", components: { Masu, }, }; </script> <style> .board { display: grid; grid-template-columns: 1fr 1fr 1fr; width: 450px; } </style>
components/Masu.vue
<template> <div class="masu"> </div> </template> <script> export default { name: "Masu", }; </script> <style> .masu { width: 150px; height: 150px; border: 1px solid black; text-align: center; font-size: 80px; color: red; } </style>
クリックイベントに反応して○を表示させる
子コンポーネントのMasu.vueにクリックイベントに配置し、クリックしたら○が表示されるようにします。
Masu.vue
<template> <div class="masu" v-on:click="doAction"> {{ masu }} </div> </template> <script> export default { name: "Masu", data() { return { masu: "", }; }, methods: { doAction() { this.masu = "◯" }, }, }; </script>
何回目のクリックであるかの情報を、子コンポーネントに伝える
アプリ全体でマスを何回クリックしたのかをカウントします。
クリックした回数という情報は親であるAppコンポーネントに持たせてcountとしました。
このcountを子供のMasuコンポーネントにpropsで伝えます。
App.vue
<template> <div class="board"> <Masu v-bind:count="count" v-for="n of 9" v-bind:key="n" /> </div> </template> <script> import Masu from "./components/Masu.vue"; export default { name: "App", data() { return { count: 0, }; }, components: { Masu, }, }; </script>
components/Masu.vue
<template> <div class="masu" v-on:click="doAction"> {{ masu }} </div> </template> <script> export default { name: "Masu", data() { return { masu: "", }; }, props: { count: Number, }, methods: { doAction() { if(this.count % 2 === 0 ){ this.masu = "◯" ; } else { this.masu = "×"; } }, }, }; </script>
続きます