🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

1回答

756閲覧

Vueで<trash-can />,<arrow />のようなコンポーネントをファクトリー関数を使って定義したい

Arima9111

総合スコア5

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

0クリップ

投稿2019/10/03 08:12

前提・実現したいこと

Vueの初学者です。初歩的な質問で申し訳ないですが、よろしくお願いします。
現在アイコンのコンポーネントを以下のように使っております。

<icon icon-name="trash-can"/> <icon icon-name="arrow">

これを

<trash-can /> <arrow />

のように変更したいのですが、アイコンが膨大でコンポーネントの数だけvueファイルを作りたくはないのです。1つのicon.vueコンポーネントから他のコンポーネントを作りたいですがやり方が分かりません。

現在iconコンポーネントの中身は以下のようにimgタグのsrc属性を変えてるだけです。

icon.vueファイル

<template> <img :src="iconImage"> </template> <script> export default { data(){ return { iconImage: require(`~/app/assets/icons/${this.iconName}.svg`) } }, props: { iconName: { type : String, required: true, }, } } </script>

次は実現したいコンポーネントを使う側のコードです。最終的にこのような感じで記述できないかと思ってます。

<template> <div> <trash-can-icon /> <arrow-icon /> </div> </template> <script> import { TrashCanIcon, ArrowIcon } from 'path/to/iconFactory.js' export default { component: { TrashCanIcon, ArrowIcon } } </script>

iconFactory.jsの内容

export const TrashCanIcon = iconFactory('trash-can') export const ArrowIcon = iconFactory('arrow')

しかしここでiconFactoryをどのように実装すれば良いのか分からず途方にくれております。
上記の実現方法について何かしらアドバイスやヒントを頂けないでしょうか。

どうかよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

propで実現するほうが個人的には一般的でスマートだと思いますが、一応以下の方法で実現は可能でした。

vue

1<template> 2 <div> 3 <trash-can /> 4 </div> 5</template> 6 7<script> 8const iconFactory = name => { 9 return { 10 name, 11 template: `<img src="/app/assets/icons/${name}.svg">` 12 } 13} 14 15export default { 16 components: { 17 trashCan: iconFactory('trash-can') 18 } 19} 20</script> 21

このままではエラーが出るのでnuxt.config.jsからwebpackのconfigにエイリアスを追加してください

js

1 build: { 2 extend (config, ctx) { 3 config.resolve.alias['vue$'] = 'vue/dist/vue.esm.js' 4 } 5 }

エラーの詳細はこちら
Rails5.1でVue.jsで単一ファイルコンポーネントのエラーがでる - qiita

投稿2019/10/04 03:47

編集2019/10/04 03:52
nt4c

総合スコア768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arima9111

2019/10/04 05:19

ありがとうございました! おかげさまでコードを重複することなく、iconFactory関数に渡すアイコン名を変えるだけで個別のアイコンコンポーネントを作成することができるようになりました。 本当に感謝ですm(_ _)m ※ 後、最初に書いたpropの方が一般的だと言うことも覚えておきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問