2017-09-11 9 views
1

人。私はVue.jsの陛下の本を読んでいます2.私は本の一例と混同しています。なぜv-bindは一方向データバインディングであるのに対し、v-forはvue.jsの子コンポーネントからデータを更新できるのですか?

私の質問は - お気に入りのボタンができない間、preタグに表示されているVueインスタンスのデータをupvoteボタンで変更できるのはなぜですか?

お気に入りはv-bindディレクティブによってバインドされていると言われています。これは、片方向のデータバインディングで、子が親とデータを同期できないことを意味します。しかし、どのように話が更新されましたか? v-modelのような双方向データバインディング?ここで

はコードの例です:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Hello Vue</title> 
</head> 
<body> 
<div v-cloak id="app"> 
    <div class="container"> 
     <h1>Let's hear some stories!</h1> 
     <ul class="list-group"> 
      <story v-for="story in stories" :story="story" :favorite="favorite"></story> 
     </ul> 
     <pre>{{ $data }}</pre> 
    </div> 
</div> 
</body> 
<template id="story-template"> 
    <li class="list-group-item"> 
     {{ story.writer }} said "{{ story.plot }}" 
     Story upvotes {{ story.upvotes }}. 
     <button v-show="!story.voted" @click="upvote" class="btn btn-default">Upvote</button> 
     <button v-show="!isFavorite" @click="setFavorite" class="btn btn-primary">Favorite</button> 

    </li> 
</template> 
<script src="../../vue.js"></script> 
<script type="text/javascript"> 
    Vue.component('story', { 
     template: "#story-template", 

     props: ['story', 'favorite'], 
     methods: { 
      upvote: function() { 
       this.story.upvotes += 1; 
       this.story.voted = true; 
      }, 
      setFavorite: function() { 

       this.favorite = this.story; 
      } 
     }, 
     computed: { 
      isFavorite: function() { 
       return this.story === this.favorite 
      } 
     } 
    }); 
    window.app = new Vue({ 
     el: '#app', 
     data: { 
      stories: [ 
       { 
        plot: 'My horse is amazing.', 
        writer: 'Mr. Weebl', 
        upvotes: 28, 
        voted: false 
       }, 
       { 
        plot: 'Narwhals invented Shish Kebab.', 
        writer: 'Mr. Weebl', 
        upvotes: 8, 
        voted: false 
       }, 
       { 
        plot: 'The dark side of the Force is stronger.', 
        writer: 'Darth Vader', 
        upvotes: 49, 
        voted: false 
       }, 
       { 
        plot: 'One does not simply walk into Mordor', 
        writer: 'Boromir', 
        upvotes: 74, 
        voted: false 
       } 
      ], 
      favorite: {} 
     } 
    }) 
</script> 
</html> 

答えて

1

これは、オブジェクトはJavascriptでどのように機能するかに関係しています。変数に格納されると、そのオブジェクトへの参照が渡されます。だからあなたがそれを渡すとき、あなたは実際に参照を渡すだけです。オブジェクトを変更すること(上書きしないこと!)は、すべての場所に変更することを意味します。

あなたの例で起こることは、ストーリーオブジェクトを変更することです。そのキーを変更しますが、オブジェクト自体を上書きしません。アプリを見ることは物語オブジェクトと同じ参照を持っています。変更が表示されます。

ただし、お気に入りの場合は、あなたはお気に入りのオブジェクトの参照を渡されます。しかし、すぐにお気に入りのボタンをクリックします。ストーリーを参照するために変数を交換しますが、ローカルでのみ行います。アプリはまだ古いリファレンスを保持しています。これは、親オブジェクトではなく参照自体を渡すためです。

これは、Vuexのような州の管理者が入る場所です。

+0

ありがとうございます! – krave

関連する問題