正しく言えば、v-bind:field="formData.name"
または:field="formData.name"
を使用する必要があります。
メインアプリテンプレートをhtmlに直接定義し、<example-form>
と<example-input>
を含む「コンテンツ配信」を使用しているため、動作しません。
ドキュメントで定義されているように、このコンテンツ配布(またはAngular 1.xに精通している場合は「移譲」)はうまく動作しますが、スコープはメインアプリケーション(ルートインスタンスです。それ)。
文献:https://vuejs.org/v2/guide/components.html#Compilation-Scope
引用:
コンポーネントスコープの親指の簡単なルールがある:
親テンプレートのすべてが親スコープにコンパイルされます。子テンプレートのすべてが子スコープでコンパイルされます。
あなたが興味があれば、次のようにあなたのメインアプリ(ルート・インスタンス)を変更してみてください:
new Vue({
el: '*[my-app]',
data: function() {
return {
formData: { name: 'abc', location: 'xyz'}
};
}
});
今、あなたはFORMDATAはもうundefined
ではないことがわかります。
しかし、より適切な方法は、次のようにexample-form
コンポーネントのテンプレートの一部として<example-input>
を含めることです。
Vue.component('example-form', {
template: `
<div class="my-example-form">
<form><pre>{{formData}}</pre><slot></slot></form>
<example-input :field="formData.name"></example-input>
<example-input :field="formData.location"></example-input>
</div>
`,
data: function() {
return {
formData: { name: '', location: ''}
};
}
});
あなたが期待するよう今では右formData
にバインドします。
props
は片方向バインディングであるため、これはまだ機能しません。子コンポーネント(example-input
)が値を取得しますが、親コンポーネントに戻ってデータの変更を渡しません(example-form
)
子が戻って親にデータを渡すためには、正しい方法では、この問題で説明$emit
を使用することです:Updating parent data via child component?
<example-input>
コンポーネントをフォーム要素として機能させたい場合は、期待どおりに機能する関連する回答があります。https://stackoverflow.com/a/40337942/654825 - jsFiddleも動作しています。
ありがとうございます! 私の問題は、ルートコンポーネントの誤解によるものです。最初のコンポーネント 'example-form'がルートであると誤って考えていました。実際にはVueを初期化するノードです。 今は完全に理にかなっています。 – Wildhoney