LoginSignup
0
0

vue3でsvgやmdなどフォルダ内にあるファイルを変数でDynamic import(required)でComponentする

Posted at

iconComponentやpostComponentなど、静的ファイルmoduleを動的に読み込みたい場合のSolution。

ES5では、requiredで変数を使った動的読み込みが可能で、ES6ではどうする?

required(`./${file}.svg`)

→ TSだとlintが反応するのでrequired使えないのでimportを利用する

defineAsyncComponentを利用する

ES モジュールの動的インポートも Promise を返すため

ここがポイントですね。

以下はiconComponentの利用例ですが、vue3(vite)の場合、vite-svg-loaderを利用すればsvgをComponentととして取り扱えるので、以下のようなComponentが作成できます。

vite.config.js
import svgLoader from 'vite-svg-loader'

export default defineConfig({
  plugins: [
    vue(),
    svgLoader()
  ]
})
IconBase.vue
<script setup>
import { defineAsyncComponent } from 'vue';

const props = defineProps({
  name: string
});

// svgファイルを非同期読み込み
const iconFile = defineAsyncComponent(() =>
  import(`./icons/${props.name}.svg`)
);
</script>

<template>
  <component :is="icon" />
</template>

<component><svg ... />に展開される。
同じようにmd-loaderをつかえば、mdを展開できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0