はじめに
プルダウンで定型文を選ぶとフォームにその内容が入力されるテキストエリアのコンポーネントを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で渡せば実際のプロダクトでも役に立つ機能になりそうです。