この記事では、主に Vue フォーム クラスの親子コンポーネントのデータ転送例を紹介します。必要な友人に共有します。
プロジェクトに Vue.js を使用する場合。コンポーネントベースの開発方法は、開発と保守に一定の利便性をもたらしますが、コンポーネント間のデータと状態の転送のやり取りが含まれる場合、特に大量のページに直面した場合は面倒です。フォームの。
ここでは私が普段行っている処理方法を記録します。親コンポーネントと子コンポーネント以外のコンポーネントは主に Vuex を介して処理されます。
ドキュメントに記載されている解決策と同様に、親コンポーネントは主に props を介して子コンポーネントにデータを送信し、子コンポーネントは主にトリガー $emit() を介して親コンポーネントにデータを送信しますが、使用方法にいくつかの違いがあります。
1. 基本型データを渡す
サブコンポーネントの内容が少ない場合、基本型データ (通常は文字列、数値、ブール値) が直接渡されます。
まず例を見てみましょう:
<!-- 父组件 parent.vue --> <template> <p class="parent"> <h3>问卷调查</h3> <child v-model="form.name"></child> <p class=""> <p>姓名:{{form.name}}</p> </p> </p> </template> <script> import child from './child.vue' export default { components: { child }, data () { return { form: { name: '请输入姓名' } } } } </script>
<!-- 子组件 child.vue --> <template> <p class="child"> <label> 姓名:<input type="text" :value="currentValue" @input="changeName"> </label> </p> </template> <script> export default { props: { // 这个 prop 属性必须是 valule,因为 v-model 展开所 v-bind 的就是 value value: '' }, methods: { changeName (e) { // 给input元素的 input 事件绑定一个方法 changeName // 每次执行这个方法的时候都会触发自定义事件 input,并且把输入框的值传递进去。 this.$emit('input', e.target.value) } } } </script>
このメソッドが実行されるたびに、カスタム イベント入力がトリガーされ、入力がトリガーされます。ボックスに値が渡されます。
親コンポーネントは、v-model ディレクティブを通じて値をバインドし、子コンポーネントによって渡されたデータを受け取ります。ただし、これは、親コンポーネントが子コンポーネントのデータに応答することを意味するだけです。親コンポーネントから渡されたデータに子コンポーネントが応答するようにするには、子コンポーネントの props 属性値とこの属性を定義する必要があります。 value である必要があり、他の単語で記述することはできません。
v-model は実際には糖衣構文です。詳細については、カスタム イベントを使用したフォーム入力コンポーネントを参照してください。
2. 参照型のデータを渡す
例えば、サブコンポーネントに複数のフォーム要素があり、それでも値をバインドする場合上記の各フォーム要素を作成すると、記述するコードが大量に繰り返されます。このとき通常渡されるのはオブジェクトです。値の受け渡しの基本原理は変わりませんが、書き方が少し異なります。
まずコードを見てみましょう:
<!-- 父组件 parent.vue --> <template> <p class="parent"> <h3>问卷调查</h3> <child :formData.sync="form"></child> <p class=""> <p>姓名:{{form.name}}</p> </p> </p> </template> <script> import child from './child.vue' export default { components: { child }, data () { return { form: { name: '请输入姓名', age: '21' } } } } </script>
<!-- 子组件 child.vue --> <template> <p class="child"> <label> 姓名:<input type="text" v-model="form.name"> </label> <label> 年龄:<input type="text" v-model="form.age"> </label> <label> 地点:<input type="text" v-model="form.address"> </label> </p> </template> <script> export default { data () { return { form: { name: '', age: '', address: '' } } }, props: { // 这个 prop 属性接收父组件传递进来的值 formData: Object }, watch: { // 因为不能直接修改 props 里的属性,所以不能直接把 formData 通过v-model进行绑定 // 在这里我们需要监听 formData,当它发生变化时,立即将值赋给 data 里的 form formData: { immediate: true, handler (val) { this.form = val } } }, mounted () { // props 是单向数据流,通过触发 update 事件绑定 formData, // 将 data 里的 form 指向父组件通过 formData 绑定的那个对象 // 父组件在绑定 formData 的时候,需要加上 .sync this.$emit('update:formData', this.form) } } </script>
props は、props 内のプロパティを双方向にバインドする必要がある場合、 .sync 修飾子を使用する必要があります。詳細については、ここでは説明しませんが、.sync 修飾子を参照してください。
ここで、props は vue で直接変更できないことに注意してください。そのため、親コンポーネントに値を渡したい場合でも、Prop は間の呼び出しの仲介者としてのみ存在します。親子。
さらに、親コンポーネントによって最初に渡されたデータをプレビューしたい場合は、watch を通じてプロパティの変更を監視し、子コンポーネントの初期化時に値を渡す必要があります。
注: this.$emit('update:formData', this.form) を子コンポーネントにマウントしているのは、各入力タグイベントの入力イベントでのカスタマイズのトリガーを避けるためですが、その前提があります。この方法で記述すると、親コンポーネントと子コンポーネントの両方がオブジェクトを共有することになります。
これは、上記のコードで、formData.sync="form" を使用して親コンポーネントの値をバインドする場合の内容です。フォームはオブジェクトであり、子コンポーネントのカスタム イベントがトリガーされます this.$emit(' update:formData' 、 this.form)、 this.form もオブジェクトである必要があります。
ここで、複数のサブコンポーネントがオブジェクトを使用する場合、この書き込み方法は避けるべきであることにも注意してください。1 つのコンポーネントがこのオブジェクトのデータを変更すると、他のサブコンポーネントもそれに応じて変更されるためです。
そのため、これを使用するときは、次のように各子コンポーネントに独自のオブジェクトを割り当てます。
data () { return { parentObject: { child_1_obj: {}, child_2_obj: {}, } } }
これは、親コンポーネントで定義されたデータです。もちろん、名前は次のように選択されません。これ。
終わり
私はまだ Vue を使用している段階で、その基礎となるものについて十分に理解していないので、ソースコードを読みたいのですが。考えてみてください... 何か間違っていると思うなら、ただ言って、お互いにコミュニケーションを取りましょう。
関連する推奨事項:
以上がVueフォームクラスの親コンポーネントと子コンポーネント間のデータ転送例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。