Dans vue composant de fichier unique. J'importe un fichier svg comme celui-ci: import A from 'a.svg'
Et comment puis-je utiliser A dans mon composant?
D'après les informations que vous avez fournies, vous pouvez:
npm install --save-dev vue-svg-loader
module: {
rules: [
{
test: /\.svg$/,
loader: 'vue-svg-loader', // `vue-svg` for webpack 1.x
},
],
},
<template>
<nav id="menu">
<a href="...">
<SomeIcon class="icon" />
Some page
</a>
</nav>
</template>
<script>
import SomeIcon from './assets/some-icon.svg';
export default {
name: 'menu',
components: {
SomeIcon,
},
};
</script>
Si vous avez le contrôle sur le fichier svg, vous pouvez simplement l'envelopper dans un fichier vue) comme ceci:
a.vue:
<template>
<svg>...</svg>
</template>
Juste demander le fichier comme ça après: import A from 'a.vue'
Si vous utilisez Webpack, vous pouvez utiliser le contexte require pour charger des fichiers SVG à partir d'un répertoire. Sachez que cela mettra tous les fichiers SVG dans vos fichiers Javascript et risquerait d'alourdir votre code.
Comme exemple simplifié, j’utilise ce composant svg
:
data() {
return {
svg: ''
};
},
props: {
name: {
type: String,
required: true
}
}
created() {
this.svg = require(`resources/assets/images/svg/${this.name}.svg`);
}
Le modèle ressemble simplement à ceci:
<template>
<div :class="classes" v-html="svg"></div>
</template>
Normalement, vous ne pouvez pas simplement charger des fichiers SVG de cette manière et vous attendre à ce qu’ils soient utilisés avec un fichier v-html
directive puisque vous n'obtenez pas la sortie brute. Vous devez utiliser le Webpack raw-loader
alors assurez-vous d’obtenir le résultat brut:
{
test: /\.svg$/,
use: [
{
loader: 'raw-loader',
query: {
name: 'images/svg/[name].[ext]'
}
},
{
loader: 'svgo-loader',
options: svgoConfig
}
]
}
L'exemple ci-dessus utilise également le svgo-loader
puisque vous souhaiterez optimiser considérablement vos fichiers SVG si vous procédez de cette façon.
J'espère que cela vous aidera, vous ou toute autre personne, à résoudre ce problème sans vous plonger directement dans une solution tierce.
Vous avez d’abord besoin d’un chargeur spécifique pour le composant, qui contiendra le svg my webpack.base.config.js
module: {
rules: [
{
test: /\.svg$/,
loader: 'vue-svg-loader',
},
{
test: /\.vue$/,
use: [
{
loader: "vue-loader",
options: vueLoaderConfig
},
{
loader: "vue-svg-inline-loader",
options: { /* ... */ }
}
]
}
//.. your other rules
}
documentation de vues-svg-inline-loader: https://www.npmjs.com/package/vue-svg-inline-loader
documentation de vue-svg-loader: https://www.npmjs.com/package/vue-svg-loader
Ensuite, vous pouvez initialiser un fichier vue
<template>
<div>
<img svg-inline class="icon" src='../pathtoyourfile/yoursvgfile.svg' alt="example" />
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'logo',
data () {
},
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
#logo{
width:20%;
}
.rounded-card{
border-radius:15px;
}
//the style of your svg
//look for it in your svg file ..
//example
.cls-1,.cls-7{isolation:isolate;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);};stroke-width:2px;}..cls-6{opacity:0.75;mix-blend-mode:multiply;}.cls-7{opacity:0.13;}.cls-8{fill:#ed6a29;}.cls-9{fill:#e2522b;}.cls-10{fill:#ed956e;}.cls-185{fill:#ffc933;}..cls-13{fill:#ffd56e;}.cls-14{fill:#1db4d8;}.cls-15{fill:#0f9fb7;}.cls-16{fill:#3ad4ed;}.cls-17{fill:#25bdde;}.cls-18{fill:#fff;}
//
</style>
Votre svg fils ne doit pas contenir de balise de style, donc copiez-collez le style dans le style vue avec une propriété scoped pour le conserver spécifique à ce composant).
vous pouvez simplement charger votre composant à un emplacement spécifique de votre application et l'utiliser
<template>
<v-app id="app">
<logo/>
<router-view/>
</v-app>
</template>
<script>
import logo from './components/logo.vue'
export default {
name: 'App',
data(){
return {
//your data
}
},
components:{
logo //the name of the component you imported
},
}
}
</script>
<style>
#app {
font-family: 'Hellow', sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #070b0f;
margin-top: 60px;
}
</style>
J'aime utiliser pug comme moteur de template (avec de nombreux avantages, à mon avis). Si vous le faites, vous pourrez facilement inclure des fichiers tels que SVG simplement en écrivant:
include ../assets/some-icon.svg
C'est ça! il n'y a rien d'autre à faire - je pense que c'est un moyen très facile et pratique d'inclure des choses comme de plus petits svg - le code facilement inclus du fichier est toujours propre!
Vous pouvez trouver ici plus d'informations sur la manière d'inclure PugJS Vue instance https://www.npmjs.com/package/vue-cli-plugin-pug