2021年5月22日土曜日

Laravel10:Vueの親子コンポーネント

親子コンポーネントについて

見本ソースを参照している

親子間のデータ連携

子供のコンポーネント

<template>
  <p>{{ foo }}</p> <!-- hoge -->
</template>

<script>
export default {
  props: [
    'foo'
  ]
}
</script>

親コンポーネント

<template>
  <child-component v-bind:foo="var" />
</template>

<script>
export default {
  data() {
    return {
      var: "hoge"
    }
  }
}
</script>

props 経由で受け取った foo の中身はリテラルではななく、親で定義されたオブジェクトのため、foo の値として hoge が出力される。

v-bindはリアクティブのために親子間で連携していることを意味します
下記も同様です。

<child-component :foo="var" />


子コンポーネントから親のイベントを呼出

親のコンポーネント

<template>
  <div>
    ボタンA<child-component v-on:call-parent="parentFunc" foo="1" bar="A" />
    ボタンB<child-component v-on:call-parent="parentFunc" foo="2" bar="B" />
  </div>
</template>

<script>
export default {
  methods: {
    parentFunc(foo, bar) {
      console.log(foo)
      console.log(bar)
    }
  }
}
</script>

子供のコンポーネント

<template>
  <button v-on:click="childFunc(foo, bar)" type="button">Button</button>
</template>

<script>
export default {
  props: [
    'foo',
    'bar'
  ],
  methods: {
    childFunc(foo, bar) {
      this.$emit('call-parent', foo, bar)
    },
  },
}
</script>

子コンポーネントから親のメソッドを実行するためには、子から $emit でイベントを発火させるのがポイントです。

template から直接イベントを発生させることができないため、クリックイベントを一旦 子コンポーネントのメソッド ( ここでは childFunc ) で受け取り、そのメソッド内でイベントを処理します。

親子間でデータ量が増えた場合はVUEXを使うのが最善。

今、思案しているところでした・・・