19 votes

FontAwesome avec Vuetify - Comment inclure les icônes Font Awesome dans le composant v-icon ?

J'espère que quelqu'un saura où je me suis trompé. J'essaie de mettre en œuvre le paquet Font Awesome avec Vuetify. Font Awesome est importé et prêt à fonctionner (la configuration est identique à celle des projets dans lesquels Font Awesome a été intégré avec succès) :

Mes basiques main.js fichier :

import '@babel/polyfill'
import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import store from './store'
import './registerServiceWorker'

import { library } from '@fortawesome/fontawesome-svg-core'
import { faCode } from '@fortawesome/pro-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

library.add(faCode)

Vue.component('font-awesome-icon', FontAwesomeIcon)

Vue.config.productionTip = false

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

Et dans un composant, je fais référence à une icône comme suit :

Mon Component.vue :

<template>
    ...
    <v-btn>
        <v-icon>fas fa-code</v-icon>
    </v-btn>
    ...
</template>

^ Où j'ai laissé le code superflu*.

Ma question est donc la suivante : comment intégrer Font Awesome dans le composant v-icon de Vuetify ?

Pour référence, j'utilise ce qui est décrit ici :

https://vuetifyjs.com/en/components/icons

Ce qui est identique à ce que j'ai prescrit ci-dessus, mais malheureusement mon icône ne s'affiche pas...

Mise à jour : Je veux spécifiquement une solution qui n'inclut pas l'ajout de l'assez lourd Font Awesome. all.css fichier ( <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet"> ) - au lieu de l'importation sur une icône par besoin d'icône. (le poids total du fichier all.css minifié est de 52kb en v.5.2.0 .

23voto

Ole Aldric Points 566

Vous pouvez utiliser secouer les arbres .

Puisque vous cherchez une option pour éviter de charger toutes les icônes dans vue/vuetify, je vous suggère d'utiliser la méthode de l'arbre secoué et d'ajouter chaque icône que vous voulez utiliser, manuellement. Cela peut être un peu fastidieux, mais l'ajout d'icônes à la demande sera bénéfique à long terme - car webpack ne fera que regrouper celles que vous spécifiez.

Veuillez noter :

Dans ce tutoriel, je suppose que le lecteur possède le paquet Pro. Si vous ne voulez utiliser que les versions gratuites, supprimez tout ce qui ressemble à Pro du mélange.

Ci-dessous, vous pouvez voir ma façon préférée de le faire avec vuetify et en utilisant les SVG avec v-icon et v-text/v-html :

Nous devons d'abord installer les icônes :

(ouvrez votre terminal/command-prompt dans votre projet et installez)

$ npm i --save @fortawesome/fontawesome-svg-core // this is the svg core, it is needed.
$ npm i --save @fortawesome/vue-fontawesome // Vue integration *
$ npm i --save @fortawesome/free-brands-svg-icons // Branding icons
$ npm i --save @fortawesome/free-regular-svg-icons // only for FA5 free **
$ npm i --save @fortawesome/free-solid-svg-icons // only for FA5 free **
$ npm i --save @fortawesome/pro-regular-svg-icons // Pro icons regular type
$ npm i --save @fortawesome/pro-light-svg-icons // Pro icons light type
$ npm i --save @fortawesome/pro-solid-svg-icons // Pro icons solid type
$ npm i --save @fortawesome/pro-duotone-svg-icons // Pro icons duotone type *** 
  1. ( * ) Le pack d'intégration Vue plus d'infos
  2. ( ** ) Seulement nécessaire pour les icônes gratuites, si vous possédez Pro et suivi les instructions ici ils sont déjà inclus dans la version pro.
  3. ( *** ) Au moment de la rédaction de cet article, les icônes bicolores ne sont pas encore complètement intégrées, attention aux erreurs.

Ensuite, ajoutons ceci à notre configuration vuetify :

Je suppose ici que vous utilisez vuejs avec javascript (non dactylographié) et que vous avez installé vuetify via vue add vuetify . Le site vuetify.js doit se trouver dans le répertoire plugins dans votre dossier src dossier. Votre kilométrage peut varier .

// src/plugins/vuetify.js
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
import { library } from '@fortawesome/fontawesome-svg-core' // Core SVG
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // Integration
// ... there should be more here, but see next part below ...

Vue.component('font-awesome-icon', FontAwesomeIcon) // add it to vue
Vue.use(Vuetify);

export default new Vuetify({
  icons: {
    iconfont: 'faSvg', // The bees knees, what most people are looking for.
  },
});

Ok, maintenant que nous avons ajouté les principaux composants de FontAwesome 5, utilisons le treeshaking pour indiquer les icônes que nous souhaitons utiliser pour notre projet. Je n'utiliserai que deux icônes à titre d'exemple : fa-plus y fa-user-circle et je vais les ajouter pour trois des paquets Font Awesome Pro 5 que nous avons installés. (Clair, Normal et Duotone) et ensuite j'en ajouterai d'autres (barres et utilisateur) pour le solide, pour voir comment cela peut être fait dans les deux sens en même temps.

Alors, revenons à notre vuetify.js nous remplaçons

// ... there should be more here, but see next part below ...

avec le texte suivant (attention aux majuscules) :

// src/plugins/vuetify.js
// ...
import { 
    faBars,
    faUser
} from '@fortawesome/pro-solid-svg-icons'
import {
    faPlus as farPlus,
    faUserCircle as farUserCircle
} from '@fortawesome/pro-regular-svg-icons'
import {
    faPlus as falPlus,
    faUserCircle as falUserCircle
} from '@fortawesome/pro-light-svg-icons'
import {
    faPlus as fadPlus,
    faUserCircle as fadUserCircle
} from '@fortawesome/pro-duotone-svg-icons'
// ...

Remarque rapide : si vous souhaitez toujours ajouter l'ensemble de la bibliothèque, vous pouvez le faire en l'important comme suit : import { far } from '@fortawesome/pro-regular-svg-icons' (pour les réguliers) et ainsi de suite.

Comme vous pouvez le constater, nous avons maintenant ajouté fa-plus et fa-user-circle à notre projet. A partir de là, nous devons les ajouter à la section library que nous avons importé dans le vuetify.js config. (ne vous inquiétez pas, le fichier entier peut être vu ci-dessous dans l'extrait de code). :

// src/plugins/vuetify.js
// ...
Vue.component('font-awesome-icon', FontAwesomeIcon)
library.add(
    faBars, faUser,
    farPlus, falPlus, fadPlus, 
    farUserCircle, falUserCircle, fadUserCircle
)
/// ...

Maintenant que nous les avons ajoutés à la bibliothèque, nous devons les confier à vuetify. Vuetify a quelques spécial Les icônes qu'ils utilisent pour des choses comme le <v-app-bar-nav-icon></v-app-bar-nav-icon> (menu hamburger) . Nous pouvons les personnaliser et ajouter les nôtres au mélange (si nous le souhaitons). Pour ce faire, je définis une constante et j'y ajoute toutes les icônes dont j'ai besoin, comme suit :

const CUSTOM_ICONS = {
    add: { // custom icon I want to use
        component: FontAwesomeIcon,
        props: {
            icon: ['fad', 'plus']
        }
    },
    menu: { // used for the nav-icon by vuetify
        component: FontAwesomeIcon,
        props: {
            icon: ['fas', 'user']
        }
    }
}

et ensuite nous ajoutons cette constante à la configuration comme ceci :

export default new Vuetify({
  icons: {
    iconfont: 'faSvg',
    values: CUSTOM_ICONS,
  },
});

Vous pouvez également les ajouter directement dans le values mais je trouve plus lisible de le faire à travers une constante.

Nous pouvons maintenant les utiliser dans des modèles, des appendices ou des prépensions :

<template>
    <v-app>
        <!-- reference the whole path -->
        <v-icon>$vuetify.icons.add</v-icon>
        <!-- but this is easier -->
        <v-icon>$add</v-icon>
        <v-select
            :items="direction"
            label="Select direction"
            menu-props="auto"
            prepend-icon="$unfold" <!-- short version -->
            append-icon="$vuetify.icon.unfold" <!-- long version -->
            >
        </v-select>
    </v-app>
</template>

Enfin, voici l'exemple complet :

// src/plugins/vuetify.js
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
import { library } from '@fortawesome/fontawesome-svg-core' // Core SVG
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // Integration
import { 
    faBars,
    faUser
} from '@fortawesome/pro-solid-svg-icons'
import {
    faPlus as farPlus,
    faUserCircle as farUserCircle
} from '@fortawesome/pro-regular-svg-icons'
import {
    faPlus as falPlus,
    faUserCircle as falUserCircle
} from '@fortawesome/pro-light-svg-icons'
import {
    faPlus as fadPlus,
    faUserCircle as fadUserCircle
} from '@fortawesome/pro-duotone-svg-icons'

Vue.component('font-awesome-icon', FontAwesomeIcon)
library.add(
    faBars, faUser,
    farPlus, falPlus, fadPlus, 
    farUserCircle, falUserCircle, fadUserCircle
)
const CUSTOM_ICONS = {
    add: { // custom icon I want to use
        component: FontAwesomeIcon,
        props: {
            icon: ['fad', 'plus']
        }
    },
    menu: { // used for the nav-icon by vuetify
        component: FontAwesomeIcon,
        props: {
            icon: ['fas', 'user']
        }
    }
}

Vue.use(Vuetify);

export default new Vuetify({
  icons: {
    iconfont: 'faSvg',
    values: CUSTOM_ICONS,
  },
});

<template>
    <v-app>
        <!-- reference the whole path -->
        <v-icon>$vuetify.icons.add</v-icon>
        <!-- but this is easier -->
        <v-icon>$add</v-icon>
        <v-select
            :items="direction"
            label="Select direction"
            menu-props="auto"
            prepend-icon="$unfold" <!-- short version -->
            append-icon="$vuetify.icon.unfold" <!-- long version -->
            >
        </v-select>
    </v-app>
</template>

Suggestion : séparer les fichiers pour une meilleure lecture

Nous pouvons séparer la logique de fontAwesome dans un autre fichier :

Nous avons donc 2 fichiers :

  • le site fontAwesome.js où vous faites toute la logique appartenant à fontAwesome
  • le site vuetify.js vous importerez les icônes de fontAwesome.js

    // src/plugins/fontAwesome.js import { library } from '@fortawesome/fontawesome-svg-core' // Core SVG import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // Integration import { faBars, faUser } from '@fortawesome/pro-solid-svg-icons' import { faPlus as farPlus, faUserCircle as farUserCircle } from '@fortawesome/pro-regular-svg-icons' import { faPlus as falPlus, faUserCircle as falUserCircle } from '@fortawesome/pro-light-svg-icons' import { faPlus as fadPlus, faUserCircle as fadUserCircle } from '@fortawesome/pro-duotone-svg-icons'

    library.add( faBars, faUser, farPlus, falPlus, fadPlus, farUserCircle, falUserCircle, fadUserCircle ) const CUSTOM_ICONS = { add: { // custom icon I want to use component: FontAwesomeIcon, props: { icon: ['fad', 'plus'] } }, menu: { // used for the nav-icon by vuetify component: FontAwesomeIcon, props: { icon: ['fas', 'user'] } } }

    export { CUSTOM_ICONS }

    // src/plugins/vuetify.js import Vue from 'vue'; import Vuetify from 'vuetify/lib'; import { CUSTOM_ICONS } from "./fontAwesome"

    Vue.use(Vuetify);

    export default new Vuetify({ icons: { iconfont: 'faSvg', values: CUSTOM_ICONS }, });

    <template>
    <v-app>
    <!-- reference the whole path -->
    <v-icon>$vuetify.icons.add</v-icon>
    <!-- but this is easier -->
    <v-icon>$add</v-icon>
    <v-select
    items="direction" label="Select direction" menu-props="auto" prepend-icon="$unfold" <!-- short version --> append-icon="$vuetify.icon.unfold" <!-- long version --> > </v-select> </v-app> </template>

Pour en savoir plus :

19voto

Guilherme Pereira Points 181

Pour un projet Nuxt/Vuetify :

En complément de la réponse ci-dessus, vous pouvez également le paramétrer dans le fichier de configuration de Vuetify, qui est créé lors de l'installation du projet ( "plugins/vuetify.js" ), en ajoutant la propriété "iconfont" :

import '@fortawesome/fontawesome-free/css/all.css' // Ensure you are using css-loader
import Vue from 'vue'
import Vuetify from 'vuetify'

Vue.use(Vuetify, {
 iconfont: 'fa'
})

Maintenant, utilisez avec le composant icône comme ceci :

<v-icon>fab fa-vuejs</v-icon>

9voto

Saud Ali Points 101

Une solution simple est affichée sous les options du cadre dans Vuetify : https://vuetifyjs.com/en/framework/icons

Installez la bibliothèque d'icônes en utilisant NPM ou yarn :

npm install @fortawesome/fontawesome-free -D

Config - Pour un projet Vue simple

Ajoutez ceci à votre fichier main.js

import '@fortawesome/fontawesome-free/css/all.css'
import Vue from 'vue'
import Vuetify from 'vuetify'

Vue.use(Vuetify, {
 iconfont: 'fa'
})

Config - Pour un projet nuxt + vuetify

Créez un fichier js (par exemple icons.js) sous les plugins.

import '@fortawesome/fontawesome-free/css/all.css'
import Vue from 'vue'
import Vuetify from 'vuetify'

Vue.use(Vuetify, {
  iconfont: 'fa'
})

Ajoutez ceci à vos plugins dans nuxt.config.js

{ src: '~/plugins/icons.js', ssr:false }

Utilisation

Vous pouvez maintenant accéder aux icônes de la police awesome en utilisant v-icon ou append/prepend dans le composant comme :

<v-slider
v-model="energy"
color="red"
label="Energy"
min="1"
max="100"
thumb-label="always"
prepend-icon="fa-burn"
></v-slider>

3voto

Ok, donc en utilisant la suggestion du commentateur ci-dessus, j'ai réussi à le faire fonctionner en utilisant le standard vue-font-awesome méthode d'inclusion de composants d'icônes d'awesome font, swopping <v-icon> que ce que j'ai utilisé dans ma question :

<v-btn>
   <v-icon>fas fa-code</v-icon>
</v-btn>

...devient :

<v-btn fab dark small color="black" v-on:click="addCodeBlock">
   <font-awesome-icon :icon="['fas', 'code']"/>
</v-btn>

1voto

Frank Hou Points 1138

Importent font-awesome dans src/main.js :

import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
import 'font-awesome/css/font-awesome.css'

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

puis définir l'iconfont dans src/plugins/vuetify.js

import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import 'vuetify/src/stylus/app.styl'

Vue.use(Vuetify, {
  iconfont: 'fa4' // 'md' || 'mdi' || 'fa' || 'fa4'
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X