2017-11-22 21 views
0

親コンポーネントのデータを更新すると、私の小道具が更新されない理由がわかりません。私はフィドルでそれを試してみましたが、それはhttps://jsfiddle.net/f3w69rr6/1/で動作しますが、私のアプリでは動作しません。更新された小道具でVue計算されたプロパティが更新されない

<PlayerCards :gameState="gameState" :hand="gameState.playerHand" /> 

子:

親:経由子にデータを入れて

methods: { 
    addToHand(index) { 
     let card = this.gameState.playerDeck.splice(index, 1) 
     if (this.gameState.playerHand.length < 12) 
     { 
      // put card into hand 
      this.$set(this.gameState, 'playerHand', [...this.gameState.playerHand, card]) 
      // this.gameState.playerHand.push(card) 
     } 
     // otherwise discard card 
    }, 
    retrieveDeck() { 
     let array = [] 
     for (let i = 0; i < 20; i++) 
     { 
      array.push(this.src + "?text=card"+i) 
     } 
     this.$set(this.gameState, 'playerDeck', array) 
    }, 
}, 
mounted() { 
    this.retrieveDeck() 
    for (let i = 0; i < 5; i++) 
    { 
     this.addToHand(1) 
    } 
}, 

export default { 
    name: 'PlayerCards', 
    props: ["gameState", "hand"], 
    data() { 
     return { 
     } 
    }, 
    computed: { 
     rows() { 
      let cards = this.gameState.playerHand 
      let max = 6; 
      if (cards.length <= max) 
       return [cards] 

      var mid = Math.ceil(cards.length/2); 
      let return_value = [cards.slice(0, mid), cards.slice(mid)] 
      return return_value 
     } 
    } 
} 

が、行の内容は空です。

アップデート(更新フィドル):

あなたがあなたのcamelCase小道具にkebab-case同等のものを使用する必要があり、文字列のテンプレートを使用していない場合は、問題が計算

https://jsfiddle.net/f3w69rr6/1/

+0

ええと、私はあなたが小道具の種類を修正する必要があると思います。それが何かに影響するかどうかわかりませんが、試してみてください:https://vuejs.org/v2/guide/components.html#Prop-Validation – pirs

+0

'this.gameState'のためにマウントされた値を取得しますか?子コンポーネントでは? – C2486

+0

@ user2486ブラウザで 'console.log(this.gameState)'を実行すると内容があることがわかりますが、 'Object.assign({}、this.gameState)'を別のものに実行するとそれを記録すると、それは空になります(初期化時に期待どおり)。問題は、私のアプリでは反応していないが、私のフィドルでうまく動作しているようだ。必要に応じてさらにコードを投稿することができます。何らかの理由で –

答えて

3

であります:

<PlayerCards :game-state="gameState" :hand="gameState.playerHand" /> 

あなたのフィドルで動作する理由は、文字列テンプレート(参照:https://vuejs.org/v2/guide/components.html#camelCase-vs-kebab-case)jsfiddleであなたのデモで

+0

になっていても、起動時に空の配列が返されているので問題はないようです。それは子供を正しく更新していないのです。 –

+0

あなたの答えは私の問題の一部にも有効ですが、問題は計算された値であるようです。 –

0

ルック:gameState.playerHandが更新されたとき

rows() { 
    let cards = this.gameState.playerHand 
    let max = 6; 
    if (cards.length <= max) 
     return [cards] 

    var mid = Math.ceil(cards.length/2); 
    let return_value = [cards.slice(0, mid), cards.slice(mid)] 
    return return_value  
    } 

実は、VUEが正常に計算された機能を通知しました。しかし、計算されたプロパティ:rowsは、[cards][cards.slice(0, mid), cards.slice(mid)]のような配列にラップされています。そして、明らかにrows.length1または2になります。

0

これは、computedプロパティの悪用によるものだと思います。 dataに切り替えて、this.$setのアップデートを期待どおりに使用してください。 computedを使用する場合は、セッターが必要です。 Computedは、それ自身のプロパティではなく、dataのプロパティを結合/更新する方がより適しているようです。

関連する問題