ホームページ >ウェブフロントエンド >jsチュートリアル >Vueフォームクラス親子コンポーネントのデータ転送方法まとめ
今回は、Vue フォームクラスの親コンポーネントと子コンポーネントのデータ転送方法についてまとめました。以下は、Vue フォームクラスの親コンポーネントと子コンポーネントがデータを転送する際の 注意事項 について説明します。一見。
プロジェクト開発に Vue.js を使用する場合、必然的にコンポーネントベースの開発方法を使用することになります。この方法は開発と保守に一定の利便性をもたらしますが、コンポーネント間のデータと状態の転送のやり取りが含まれる場合は面倒です。特にフォームがたくさんあるページに直面しているときはそうです。 ここでは私が普段行っている処理方法を記録します。親コンポーネントと子コンポーネント以外のコンポーネントは主に Vuex を介して処理されます。 ドキュメントに記載されている解決策と同じで、親コンポーネントは主に props を介して子コンポーネントにデータを送信し、子コンポーネントは主にtrigger $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>このメソッドが実行されるたびに、メソッド changeName をサブコンポーネントの入力イベントにバインドします。カスタム イベント入力がトリガーされ、入力ボックスの値が渡されます。 親コンポーネントは、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: {}, } } }これは親コンポーネントで定義されたデータです。もちろん、名前はこのように選択されません。 この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 推奨読書:
vue クロッププレビューコンポーネントの使用方法の詳細な説明
以上がVueフォームクラス親子コンポーネントのデータ転送方法まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。