質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Vue.js

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

Q&A

解決済

2回答

619閲覧

Vueでemitによる親コンポーネントの更新

naa07

総合スコア25

Vue.js

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

0グッド

0クリップ

投稿2021/11/12 01:49

編集2021/11/12 01:53

Vueでemitした値でデータの更新ができない

問題

Vueの学習のためオセロを作っています。
Vueで親コンポーネントからturnを子コンポーネントに渡し、子コンポーネントではturnをplayerTurnに格納して変更してからemitで親に返しています。
親コンポーネントでは受け取ったplayerTurnをturnに格納して値を変更しているのですが、console.logでみると変わっていますが、dataのturnはblackのままです。emitで受け取った値でdataの値を変えるにはどうしたらよいでしょうか?

(クリックするとturnの色のオセロの石を置けるのですが、ずっと黒の石のままになってしまいます。)

js

1//親コンポーネント 2template> 3 <div class="game"> 4 <h3>{{ whosTurn(turn) }}のターン</h3> 5 <Board 6 :board= "board" 7 :turn = "turn" 8 @putStone="whosTurn($event)" 9 /> 10 </div> 11</template> 12 13<script lang="ts"> 14import Vue from 'vue' 15import Board from '@/components/reversi/Board.vue' 16import { Board as BoardModel } from '../../model/reversi' 17 18export default Vue.extend({ 19 data() { 20 return { 21 board: new BoardModel(), 22 turn: 'black' 23 } 24 }, 25 components: { 26 Board 27 }, 28 methods: { 29 whosTurn(playerTurn: 'black' | 'white') { 30 console.log(this.turn) 31 this.turn = playerTurn 32 console.log(this.turn) 33 return playerTurn === 'black' ? '黒' : '白' 34 } 35 } 36}) 37</script>

js

1//子コンポーネント 2<template> 3 <div 4 :class="cellxy" 5 class="cellSize" 6 @click="putStone()" 7 > 8 <div class="cell"></div> 9 <div class="stone"></div> 10 </div> 11</template> 12 13<script lang="ts"> 14import Vue from 'vue' 15 16export default Vue.extend({ 17 props: ['cell', 'turn'], 18 data() { 19 return { 20 reversicell: this.cell, 21 stoneState: this.cell.state, 22 cellxy: `cell${this.cell.x}${this.cell.y}`, 23 playerTurn: this.turn 24 } 25 }, 26 mounted() { 27 this.addColorClass() 28 }, 29 methods: { 30 addColorClass() { 31 const cellBox = document.querySelector(`.${this.cellxy}`)! 32 cellBox.querySelector('.stone')!.classList.add(this.stoneState) 33 }, 34 putStone() { 35 if (this.stoneState === 'None') { 36 this.stoneState = this.playerTurn 37 this.addColorClass() 38 this.playerTurn === 'white' ? this.playerTurn = 'black' : this.playerTurn = 'white' 39 this.$emit('putStone', this.playerTurn) 40 } 41 }, 42 } 43}) 44</script>

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

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

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

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

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

guest

回答2

0

子コンポーネントを以下のように修正したらうまくいきました

js

1 putStone() { 2 if (this.stoneState === 'None') { 3 this.playerTurn = this.turn 4 this.stoneState = this.playerTurn 5 this.addColorClass() 6 this.playerTurn === 'white' ? this.playerTurn = 'black' : this.playerTurn = 'white' 7 this.$emit('putStone', this.playerTurn) 8 } 9 },

投稿2021/11/12 02:20

naa07

総合スコア25

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

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

0

ベストアンサー

子コンポーネントから値を受け渡すプロセスは次の3つです。

  1. emitを用いて、値を受け渡す。そこにコールバック用の関数を記述する
  2. 親コンポーネントにイベントハンドラを記述しコールバック用の関数と受け取り用の関数を紐付ける
  3. 親コンポーネントのメソッドに受け取り用の関数を記述する

コールバック用の関数と子コンポーネントのメソッドがかぶっているのが問題のような気がします。

投稿2021/11/12 01:58

編集2021/11/12 02:15
FKM

総合スコア3644

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

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

naa07

2021/11/12 02:02

@putStone="whosTurn($event)" のwhosTurnで受け取っているつもりだったんですが、これが間違いということでしょうか?
FKM

2021/11/12 02:12 編集

コールバック用の関数をputStoneではなくputStoneStateなどと変えてみて下さい。関数がかぶっているために処理がおかしくなっているのかもしれません。
naa07

2021/11/12 02:19

子コンポーネントのputStoneメソッドを以下のように変更したらうまくいきました。 回答していただいきありがとうございます。コールバック用の関数も見直してみます。 ```js putStone() { if (this.stoneState === 'None') { this.playerTurn = this.turn this.stoneState = this.playerTurn this.addColorClass() this.playerTurn === 'white' ? this.playerTurn = 'black' : this.playerTurn = 'white' this.$emit('putStone', this.playerTurn) } }, ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問