私はVue Frameworkを新しく導入しました。属性が追加または削除されるたびに、または後の段階でコンポーネント外で更新されるたびに、親から子への変更を伝播しようとしています。以下のスニペットでは、親ノードからプロパティとして渡されるノードのname属性に基づいて挨拶メッセージを表示するコンポーネントを記述しようとしています。vue JSが親からコンポーネントへの変更を伝播しない
ノードが初期化時に(名前がスニペットである)属性 "name"を含む場合、すべてが正常に動作します。しかし、name属性が実行の後の段階に追加されている場合(ここではデモンストレーション目的のために設定タイムアウトを追加して適用しています)コンポーネントがエラーをスローし、変更は反映されません。私は、コンポーネントの外部の他のイベントに基づいて生成された、コンポーネント内の動的属性の変更をどのように伝播できるかについてはわかりません。
基本的には、渡されたプロパティに基づいて、動的な方法でサーバーの応答に基づいて異なる種類のウィジェットを表示するコンポーネントを更新したいと考えました。プロパティが更新されると、コンポーネント自体が更新されます。 Vuejsで双方向バインドが正しく機能しないのはなぜですか?
Vue.component('greeting', {
template: '#treeContainer',
props: {'message':Object},
watch:{
'message': {
handler: function(val) {
console.log('###### changed');
},
deep: true
}
}
});
var data = {
note: 'My Tree',
// name:"Hello World",
children: [
{ name: 'hello' },
{ name: 'wat' }
]
}
function delayedUpdate() {
data.name='Changed World';
console.log(JSON.stringify(data));
}
var vm = new Vue({
el: '#app',
data:{
msg:data
},
method:{ }
});
setTimeout(function(){ delayedUpdate() ;}, 1000)
<script src="https://vuejs.org/js/vue.js"></script>
<div id="app">
<greeting :message="msg"></greeting>
</div>
<script type="text/x-template" id="treeContainer">
\t <h1>{{message.name}}</h1>
</script>
編集1:クレイグの答え@属性名に属性のそれぞれのセットを呼び出すことによって基づいて変更を伝播するために私を助けます。しかし、データが複雑で、挨拶がノードの多くの属性に基づいている場合はどうでしょうか。ここでは単純な使用例を示していますが、実際には、ウィジェットはサーバーから動的に送信される多くの属性に基づいており、各ウィジェットの属性はウィジェットのタイプによって異なります。 "ようこそ、{{message.name}}。{{message.location}}の温度は{{message.temp}}です。ノードの属性が異なるため、javascriptコード内のツリー全体をトラバースせずに完全なツリーを更新し、各属性の呼び出しセットを更新する方法はありますか?これを処理できるVUEフレームワークには何かがありますか?あなたがする必要があるので、:あなたはsetメソッドを使用しない限り
更新のおかげで、データが複雑で、挨拶がノードの多くの属性に基づいていた場合はどうなりますか?ここでは単純な使用例を示していますが、実際には、ウィジェットはサーバーから動的に送信される多くの属性に基づいており、各ウィジェットの属性はウィジェットのタイプによって異なります。 "ようこそ、{{message.name}}。{{message.location}}の温度は{{message.temp}}です。ノードの属性が異なるため、ツリー全体をトラバースせずにツリー全体を更新し、各属性の呼び出しセットを更新する方法はありますか? – Ajay
さらに、data.name = 'Changed world'を追加するとコードが機能しませんVueの前に .set(データ、 '名前'、 '変更されたワールド1')。これは、オブジェクトがスコープの外で既に更新されていて、セット操作でさえ同じキーに設定している間は助けにならないということです。どのようにこの制限を克服するためのアドバイス?ありがとう@クレイグ。 – Ajay
ソリューションは不具合なく動作します。 – Ajay