登録と編集って同じフォームを使いまわすので、Componentにしてあれこれできないかなと思ってたら、意外とデータを親子のVueでやり取りするのが面倒そうで…
を参考に。
上記の記事の問題点
なんで、子コンポーネントでまたpropsを定義し直さないと…というのが死ぬほど嫌だったので、考えた。ES2015を全然知らないのに考えた。
とりあえずこんなかんじ。
親側 Create.vue
<template> <div> <order-form v-bind.sync="order" ></order-form> </div> </template> <script> import OrderFrom "@/components/OrderForm"; import defaultOrder from "@/helper/order"; export default { components: { 'order-form': OrderForm, }, data() { return { order: (new defaultOrder).props(), } } } </script>
子側 OrderForm.vue
<template> <div> <div class="form-group"> <label>お名前</label> <input type="text" :value="name" @input="$emit('update:name', $event.target.value)" :class="{'form-control':true, 'error': false}"> </div> <div class="form-group"> <label>メールアドレス</label> <input type="text" :value="email" @input="$emit('update:email', $event.target.value)" :class="{'form-control':true, 'error':false}"> </div> <div class="form-group"> <label>電話番号</label> <input type="text" :value="tel" @input="$emit('update:tel', $event.target.value)" :class="{'form-control':true, 'error':false}"> </div> </div> </template> <script> import defaultOrder from "@/helper/order"; export default { props: (new defaultOrder()).defs, data() { }, }; </script>
Orderの定義ファイル
helper/order.js
export default class defaultOrder { constructor() { this.defs = { email: { type: String, default: "" }, name: { type: String, default: "" }, tel: { type: String, default: "" }, }; } props(){ let prop = {}; for (let p in this.defs){ prop[p] = this.defs[p].default; } return prop; } };
みたいな。
でもダメだね。
これ、Modelを一括で渡すには良いけど、他のプロパティが渡せない。 ダメだわ。普通に1個づつ渡すしか無いな。