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

Vueフォームクラスの親子コンポーネントデータ転送の操作方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-06-01 11:38:381515ブラウズ

今回は、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: {},
  }
 }
}

これは親コンポーネントで定義されたデータです。もちろん、名前はこのように選択されません。

終わり

私はまだ Vue を使っている段階で、その基礎となるものについて十分に理解していないのですが、ただ考えています。それについて...何かおかしいと思ったら遠慮なく言ってください、そしてお互いにコミュニケーションを取りましょう。

この記事の事例を読んだ後は、その方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

JS を使用して文字列に含まれるコンテンツを判断する方法の概要

JS+HTML5 マウスイベントのリアルバインディングパーティクルアニメーション

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

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