2017-11-14 14 views
2

Vueインスタンスからコンポーネント内のデータを更新したいとします。反対のことを行う方法の例がたくさんあるが、これについては何も見つからない。Vue:Vueインスタンスからのコンポーネントデータの更新

は、私が持っていると言う:

Vue.component('component', { 
props: { 
    prop: { 
     default: null 
    } 
}, 
template: '#template', 
data: function() { 
    return { 
     open: false 
    }; 
} 
}); 

今、私は私のVueのインスタンスからtrueopenを設定したいと思います:

var root = new Vue({ 
    el: '#root', 
    data: {}, 
    methods: { updateComponentData: function() {//set open to true} } }); 
+0

あなたは(あなたの例では 'component')子コンポーネントを更新するために、親コンポーネント(あなたの例では' root')を使用しようとしていますか?そうであれば、**データが親から子に渡され、イベントが子から親に渡されるパターンに従うことを強くお勧めします**([Vueのその他のドキュメント](https:// vuejs。 org/v2/guide/components.html#作成 - コンポーネント))。あなたの例では、あなたの子供は 'open'と呼ばれる' prop'を持ち、あなたの親は 'open'状態を表す値を子コンポーネントにバインドします。 – wing

+0

あなたのコンポーネントの関係が親子よりも複雑な場合は、[状態管理](https://vuejs.org/v2/guide/state-management.html)を中心に回転するパターンを探索することができます。 – wing

+0

事実は、 'open'を' prop'に設定した場合、実際にはデータでなければならないという警告が表示されます。いずれにせよ、私はインスタンス(ルート)からコンポーネント(コンポーネント)にデータを渡そうとしています。しかし、彼らは別々ですので、それが親子としてカウントされているかどうかは分かりません。すなわち、コンポーネントは、ビューインスタンスの内部には存在しない。解決策があると思われる場合は、実際に成功しなかったドキュメントで数時間を費やしたので、回答を投稿してください。 –

答えて

3

あなたはChild Component Refでそれを行うことができるはずです。

<script type="text/x-template" id="template" ref="component"> 
    <div>Hello, {{ name }}!</div> 
</script> 
var root = new Vue({ 
    el: '#root', 
    data: {}, 
    methods: { 
    updateComponentData: function() { 
     this.$refs.component.open = true 
    } 
    } 
}); 

の作業例

const Child = Vue.component('child', { 
 
    template: ` 
 
    <div> 
 
     <h2>Component1</h2> 
 
     <div>Hello, {{ title }}! <strong>{{ open }}<strong></div> 
 
    </div> 
 
    `, 
 
    data() { 
 
    return { 
 
     title: 'component', 
 
     open: false 
 
    } 
 
    } 
 
}); 
 

 
var root = new Vue({ 
 
    el: '#app', 
 
    components: { 
 
    Child 
 
    }, 
 
    methods: { 
 
    updateComponentData: function() { 
 
     //console.log('updateComponentData', this.$refs) 
 
     this.$refs.component1.open = true 
 
    } 
 
    } 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script> 
 

 
<div id="app"> 
 
    <h2>Parent</h2> 
 
    <button v-on:click="updateComponentData">Click me true</button> 
 
    <child ref="component1"></child> 
 
</div>

+0

は私にとってうまくいかなかった、 '$ refs' jqueryですか? –

+0

これはVueです。上記のdocsへのリンクを参照してください。彼らは親の外に 'root。$ refs.component'を使用していますので、' this。$ refs.component'を内部に入れました。確かめます。 –

+0

ありがとうございます、私はそれが動作しないと言うことができる限り。 Vueインスタンスではなく、コンポーネント内にリファレンスを設定しているためだと思います。だから、私たちはこれを言うとき$ refsそれはインスタンス自体にないので、私たちが話しているrefを見つけることはありません –

1

私はちょうどあなたのコードで演奏し、以下のコードはそれを試すようにしてください完璧に動作します。私はVue 'ref'を使っています。コンポーネントにref属性を追加し、親から特定のコンポーネントデータにアクセスできます。

Vue.component('component', { 
 
    props: { 
 
     prop: { 
 
      default: null 
 
     } 
 
    }, 
 
    template: '#template', 
 
    data:() => ({ 
 
     open: false 
 
    }) 
 
}); 
 
var root = new Vue({ 
 
    el: '#root', 
 
    data:() => ({}), 
 
    methods: { 
 
     updateComponentData: function() { 
 
\t \t \t  this.$refs.myComponent.open = true 
 
     } 
 
    }, 
 
});
<script src="https://unpkg.com/vue"></script> 
 
<div id="root"> 
 
\t <button @click="updateComponentData">Change</button> 
 
    <hr> 
 
    <component ref='myComponent'></component> 
 
</div> 
 
<script type="text/x-template" id="template" ref="component"> 
 
    <div>Open: {{ open }}!</div> 
 
</script>

関連する問題