2017-09-25 7 views
1

設定オプションがあり、それは親コンポーネントから更新されます。これらの設定データをlocalStorageに保存しています。これら3つの子コンポーネントは設定データを使用しています。Vue JSの親コンポーネントのボタンを押したときに子コンポーネントをリフレッシュする方法は?

設定データを更新するときに、3つのコンポーネントが更新されて新しい値を取得するようにしたいと思います。 同様に、親コンポーネントのボタンを押して、3つの子が更新されます。

------------------------ UPDATED --------------------- ---------

TEMPLATE部分:

<template> 
 
    <div class="main-content"> 
 
    <div class="main"> 
 

 
<!-- COMPONENT --> 
 
<div class="row"> 
 
    <div class="padpad"> 
 
     <div class="col-md-6"> 
 
     <app-colma></app-colma> 
 
     </div> 
 
     <div class="col-md-3"> 
 
     <app-colmb></app-colmb> 
 
     </div> 
 
    
 
    </div> 
 
</div> 
 

 
<!-- SAVE BUTTON --> 
 

 
      <button type="submit" class="btn btn-success" data-dismiss="modal" aria-label="Close" v-on:click="onSubmit()"><span>Save</span></button> 
 
      
 
      
 
       
 
<!-- DATA FORM (SELECT, OPTION) --> 
 
       <div class="container modal-body"> 
 

 
        <div class="col-xs-12 col-md-3"> 
 
        <h4>Sortierung</h4> 
 

 
        <div class="radio"> 
 
         <label><input value="theropeut" type="radio" name="filterop">Theropeut</label> 
 
        </div> 
 
        <div class="radio"> 
 
         <label><input value="ausl_perf" type="radio" name="filterop">Ausl Perf</label> 
 
        </div> 
 
        <div class="radio"> 
 
         <label><input value="ausl_bud" type="radio" name="filterop">Ausl Bud</label> 
 
        </div> 
 
        <div class="radio"> 
 
         <label><input value="umsatz" type="radio" name="filterop">Umsatz</label> 
 
        </div> 
 

 
        <div class="order-select"> 
 
         <select id="orderid" class="form-control"> 
 
          <option value="ascending">Ascending</option> 
 
          <option value="descending">Descending</option> 
 
         </select> 
 
        </div> 
 
        </div> 
 
    </div> 
 
</div> 
 
</template>

スクリプトコード:

<script> 
 
import ColmA from './ColmA.vue'; 
 
import ColmB from './ColmB.vue'; 
 
import ColmTotal from './ColmTotal.vue'; 
 
export default { 
 
    components: { 
 
    'app-colma': ColmA, 
 
    'app-colmb': ColmB, 
 
    'app-colmtotal': ColmTotal 
 
    }, 
 
\t name: 'main-content', 
 
\t data() { 
 
\t \t return { 
 
\t \t \t users: [], 
 
     filtr:'', 
 
\t \t \t order:'' 
 
\t \t } 
 
\t }, 
 
\t methods: { 
 
    onSubmit: function(){ 
 
     // console.log("onsubmit"); 
 

 
     //filter 
 
     var filterop = document.getElementsByName('filterop'); 
 

 
     for (var i = 0, length = filterop.length; i < length; i++) { 
 
      if (filterop[i].checked) { 
 
       // do whatever you want with the checked radio 
 
       // alert(filterop[i].value); 
 
       this.filtr = filterop[i].value; 
 
       // only one radio can be logically checked, don't check the rest 
 
       break; 
 
      } 
 
     } 
 
     //order 
 
     var e = document.getElementById("orderid"); 
 
     this.order = e.options[e.selectedIndex].value; 
 

 
     var homesetting = { 
 
      filter: this.filtr, 
 
      order:this.order, 
 
     }; 
 

 

 

 
     if (localStorage.getItem('homesetting') === null) { 
 
     var homesettings = []; 
 

 
     // homesettings.push(homesetting); 
 
     localStorage.setItem('homesetting', JSON.stringify(homesetting)); 
 
     } else { 
 
     localStorage.removeItem('homesetting'); 
 
     localStorage.setItem('homesetting', JSON.stringify(homesetting)); 
 

 
     }; 
 
    } 
 

 
\t }, 
 

 
\t created: function() { 
 
\t \t this.fetchData(); 
 
\t } 
 

 
} 
 

 
</script>

コンポーネントコード:片道この周り

<script> 
 
export default { 
 
    name: 'colma', 
 
    data() { 
 
    return { 
 
     title: 'A Area', 
 
     colmAdata:[] 
 
    } 
 
    }, 
 
    methods: { 
 
    fetchData: function() { 
 
     var self = this; 
 
     var homeObject = JSON.parse(localStorage.getItem('homesetting')); 
 

 
     // console.log('retrievedObject: ', retrievedObject.filter); 
 
     var filter= homeObject.filter; 
 
     var order= homeObject.order; 
 

 
     // HERE I NEED MY TWO UPDATED VARIABLES 
 
     var a = 'http://localhost:3000/'+'_'+filter+'_'+order; 
 
     console.log('A',a); 
 

 

 
     $.get(apiURL, function (data) { 
 
     self.colmAdata = data; 
 
     // self.$store.state.storeGdata = ' store data from content'; 
 
     // console.log(data.people[0].name); 
 

 
     }); 
 

 
    } 
 

 
    }, 
 
\t created: function() { 
 
\t \t this.fetchData(); 
 
\t } 
 
} 
 
</script>

+0

あなたは何を試してみましたか?あなたはどこで調査しましたか? – Script47

答えて

2

は(変更が子に由来する場合)子コンポーネントからカスタムイベントを発し、その後、聞く/キャプチャすることですメソッドを呼び出す親のこのイベント。このメソッドを使用して、値を更新する子メソッドを呼び出すことができます。

実際の質問は、なぜこれを行う必要がありますか?親コンポーネントが真実のソースであると仮定すると(つまり、子コンポーネントに小道具としてデータを渡す)、これらの小道具の変更を監視するか、または計算された小道具を使用して更新された値を取得するだけでよい。メソッドを呼び出すためにイベントを使用する必要はありません。

基本的には、お使いの手口を指定できます

  1. は、子コンポーネントに小道具として(親データに保存されている)親の値を渡します。子コンポーネントは、継承されたプロパティを反応的に更新します。

  2. 親の設定は、localStorageに同時に保存することもできます。これは、単にwatchを使用して親データの変更を監視することによって行うことができます。この場合、mounted lifecycle hookを使用して、親が再マウントされたとき(ページがリロードされたときなど)—の場合は、localStorageから再度読み取ることができます。これらの変更は、ポイント#1ごとに子コンポーネントに伝播されます。

の概念実証例(仕事へのlocalStorage機能について、please check this fiddleコードスニペットをサンドボックス化されているため):

Vue.component('child-component-a', { 
 
    template: '<div><h2>Child component A</h2><p>I multiply inherited parent value by 2: <strong>{{ computedNumber }}</strong></p></div>', 
 
    props: { 
 
    number: { 
 
     type: Number 
 
    } 
 
    }, 
 
    computed: { 
 
    computedNumber() { 
 
     return this.number * 2; 
 
    } 
 
    } 
 
}); 
 

 
Vue.component('child-component-b', { 
 
    template: '<div><h2>Child component B</h2><p>I divide inherited parent value by 16: <strong>{{ computedNumber }}</strong></p></div>', 
 
    props: { 
 
    number: { 
 
     type: Number 
 
    } 
 
    }, 
 
    computed: { 
 
    computedNumber() { 
 
     return this.number/16; 
 
    } 
 
    } 
 
}); 
 

 
var app = new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    parentNumber: 1024 
 
    }, 
 
    watch: { 
 
    parentNumber() { 
 
     // Store parent number in localStorage when updated 
 
     // *NOTE: Disabled in this code snippet since it is sandboxed 
 
     // localStorage.setItem('parentNumber', this.parentNumber); 
 
    } 
 
    }, 
 
    mounted() { 
 
    // Overwrite parent data if localStorage is found 
 
    // *NOTE: Disabled in this code snippet since it is sandboxed 
 
    // if (localStorage.getItem('parentNumber') !== null) { 
 
    // this.parentNumber = localStorage.getItem('parentNumber'); 
 
    // } 
 
    } 
 
});
html { 
 
    font-family: Arial, sans-serif; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.min.js"></script> 
 
<div id="app"> 
 
    <div> 
 
    <h1>Parent component</h1> 
 
    <p>I have a value of <strong>{{ parentNumber }}</strong>.</p> 
 
    <p>But wait, you can change my number!</p> 
 
    <input v-model="parentNumber" type="number" /> 
 
    </div> 
 
    <child-component-a v-bind:number="parentNumber"></child-component-a> 
 
    <child-component-b v-bind:number="parentNumber"></child-component-b> 
 
</div>

+0

私は同意します。ローカルストレージに格納してローカルストレージから読み込むことは、変更を伝播する方法ではありません。 – Strernd

+0

これらの設定データをlocalstorageに保存する必要があります。だから私はこの手順はうまくいかないと思う。 – Sharat

+0

@コードネーム私の更新された答えを読む:) – Terry

1

あなたはVueのを使用している場合。JSあなたは本当にちょうどを使用する必要がありますVue.JS - 親は、反応性のあるデータとして設定を含むモデルを持っている必要があります。次に、このプロパティをプロパティとしてコンポーネントに渡します。このコンポーネントでは、プロパティのウォーフャーがと定義されています。

var localStore = { reason: 'Fake, because no localStorage in Sandbox' }; 
 

 
Vue.component('rows', { 
 
    props: ["order"], 
 
    data: function(){ return { values: [] } }, 
 
    template: `<ul><li v-for="v in values">{{v}}</li></ul>`, 
 
    created: function() { this.fetchValues() }, 
 
    watch: { order: function() { this.fetchValues() } }, 
 
    methods: { fetchValues: function() { 
 
    /* Placeholder for an ajax-call with order as a parameter */ 
 
    this.values = (this.order == 'ascending') ? [1,2,3] : [3,2,1] 
 
    } } 
 
}) 
 

 
new Vue({ 
 
    el: '#main', 
 
    data: { order: 'ascending' }, 
 
    created: function() { 
 
    if (localStore.order) { 
 
     this.order = localStore.order; 
 
    } 
 
    }, 
 
    watch: { order: function() { 
 
    /* Save any change on order in the local storage */ 
 
    localStore.order = this.order; 
 
    } } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script> 
 

 
<div id="main"> 
 
    <select v-model="order"> 
 
    <option value="ascending">Sort Ascending</option> 
 
    <option value="descending">Sort Descending</option> 
 
    </select> 
 

 
    <rows :order="order"></rows> 
 
</div>

関連する問題