引き続きTODOリストを作っていきます。
前回追加したBulmaを活用して、編集のモーダルウインドウを追加します。
完成品はこんな感じです。
そしてPull Requestはこちらです。
Edit modal by nek0meshi · Pull Request #9 · nek0meshi/todo-list · GitHub
EditModal.vue
モーダルは1つのコンポーネントとして作成します。
propsは、下記の2つ
- show ... モーダルを表示するかどうか
- text ... 表示時点での文言
表示・非表示は、親コンポーネントで管理させます。閉じるボタンがクリックされたような場合は、emitで親コンポーネントに報せます。
this.$emit('close')
表示時点で、受け取ったtextを一旦コピーしておきます。
watch: { show(val) { if (val) { this.innerText = this.text } } },
この書き方は結構微妙だと思っていて、showと同様親コンポーネントで管理しちゃう方法もあり得ます。
表示コンポーネントにどこまでロジックを持たせるかは悩ましいところです。
親コンポーネントは下記の感じです。
<template> <EditModal :show="showEditModal" :text="editText" @save="saveEdit" @close="showEditModal = false" /> </template> export default { data () { return { showEditModal: false, editId: null, } }, computed: { editText() { return this.list.find(({ id }) => id === this.editId)?.name } } }
表示・非表示に は、showEditModal: false
を定義しています。
textは直接変数で持つのではなくそのId = editId
で編集ターゲットを管理し、computedを介してデータをEditModalコンポーネントに渡しています。
親が全ロジックを持つ方針の場合は、単にコピーした値をdataで管理するで良さそうです。
Backendのロジックももちろん追記していますが、目新しいところがないので省略します。
まとめ
ロジックをどこまで親が持ち、どこまで子(表示コンポーネント)が持つかは僕の中でも正解が出ていません。
今後の課題です。