ホームページ  >  記事  >  ウェブフロントエンド  >  Vueフォームクラスの親コンポーネントと子コンポーネント間のデータ転送例

Vueフォームクラスの親コンポーネントと子コンポーネント間のデータ転送例

不言
不言オリジナル
2018-05-05 16:37:251647ブラウズ

この記事では、主に 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 &#39;./child.vue&#39;

  export default {
    components: {
      child
    },
    data () {
      return {
        form: {
          name: &#39;请输入姓名&#39;
        }
      }
    }
  }
</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: &#39;&#39;
    },
    methods: {
      changeName (e) {
        // 给input元素的 input 事件绑定一个方法 changeName 
        // 每次执行这个方法的时候都会触发自定义事件 input,并且把输入框的值传递进去。
        this.$emit(&#39;input&#39;, 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 &#39;./child.vue&#39;

  export default {
    components: {
      child
    },
    data () {
      return {
        form: {
          name: &#39;请输入姓名&#39;,
          age: &#39;21&#39;
        }
      }
    }
  }
</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: &#39;&#39;,
          age: &#39;&#39;,
          address: &#39;&#39;
        }
      }
    },
    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(&#39;update:formData&#39;, 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 フォームの使用を開始するための手順

以上がVueフォームクラスの親コンポーネントと子コンポーネント間のデータ転送例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。