登録と編集って同じフォームを使いまわすので、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個づつ渡すしか無いな。