はじめに
プルダウンで定型文を選ぶとフォームにその内容が入力されるテキストエリアのコンポーネントをVue.jsで作成しました。同じような内容が入力されるようなテキストエリアにおいて、入力の手間やミスの削減に役立ちます。

今回はローカルで開発環境を構築する手間を省くため、CodeSandboxで開発環境を用意しました。
実装
実装の概要
ドロップダウンメニュー(TemplateSelector.vue)とテキストエリア(TextArea.vue)のコンポーネントを作成しました。ユーザーがドロップダウンメニューで入力テンプレートを選択し、「適用する」というボタンをクリックすることでその内容をテキストエリアに挿入できるようにしています。
テキストエリアとドロップダウンメニューのコンポーネントは親コンポーネント(TextAreaWithTemplate.vue)から呼び出します。TemplateSelector.vueで選択した定型文を親コンポーネントに渡し、親コンポーネントからTextArea.vueに選択された定型文を渡すことでリアクティブにテキストエリアに反映するようにしています。
実装の詳細
ドロップダウンメニュー(TemplateSelector.vue)
v-forでテンプレートのリストをselectのoptionとして展開します。テンプレートを選択して「適用する」ボタンをクリックした際にemitTemplateメソッドを実行し、select-template というカスタムイベントをemit で親コンポーネントに送信します。
親コンポーネント(TextAreaWithTemplate.vue)
@select-template="handleTemplateSelection"でTemplateSelectorコンポーネントから送信されたイベントを受け取ります。handleTemplateSelectionメソッドでtextareaContentを選択したテンプレートの内容で更新します。textareaContentをpropsとして渡しているTextAreaコンポーネントが再レンダリングされます。
また、@update-content="textareaContent = $event"でTextAreaコンポーネントでの入力内容を受け取り、textareaContentを受け取った内容で更新しています(実際の入力内容とtextareaContentのデータの整合性を保つため)。
テキストエリア(TextArea.vue)
v-modelで、localContentをバインドして、テキストエリアに入力した内容を自動的にlocalContentに反映させます。テキストエリアの内容が変更されたときに update-contentイベントを親に送信することで、親コンポーネントに変更を通知します。
また、watchを使って、親コンポーネントから渡されるprops.contentの変更を監視しています。親コンポーネントでcontentが更新された場合、その新しい値がlocalContentに反映され、テキストエリアの内容も更新されます。
まとめ
完成した機能が以下になります。
Vueの基本的な機能を使用して実装することができました。子コンポーネントから親コンポーネントへ値を受け渡すemitの理解が大変でしたが、今回のように子コンポーネントで親コンポーネントから渡されるpropsを更新するのが必要な場面にとても有用でした。
テンプレートの内容も、サーバーサイドから受け取るようにして、propsで渡せば実際のプロダクトでも役に立つ機能になりそうです。
