希望有人会知道我在哪里出错了-我正在尝试使用Vuetify实现Font Awesome软件包。 Font Awesome已全部导入并可以使用(设置与我成功集成了Font Awesome的项目相同):
我的基本知识const somethingAsync = () => new Promise(res => setTimeout(res, 500, 'foo'));
function sumTotal(items) {
return items.reduce((total, item) => item.price + total, 0)
}
function checkOut(items) {
return Promise.all([
somethingAsync(),
somethingAsync('johndoe@gmail.com'),
sumTotal(items)
]).then(([offers, details, total]) => (
{ offers, details, total }
));
}
console.log('start');
checkOut([{ price: 10 }, { price: 20 }])
.then(output => console.log(output));
文件:
main.js
在组件中,我引用的图标如下:
我的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')
:
Component.vue
^我遗漏了多余的代码*。
所以,我的问题是-我们如何将Font Awesome集成到Vuetify的v-icon组件中?
作为参考,我使用的是这里概述的内容:
https://vuetifyjs.com/en/components/icons
与我上面的规定完全相同,但是可惜我的图标没有显示...
更新 :我特别想要一个不包含添加非常重的Font Awesome <template>
...
<v-btn>
<v-icon>fas fa-code</v-icon>
</v-btn>
...
</template>
文件(all.css
)的解决方案-而是根据需要导入图标。 (在<link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
中,缩小的all.css文件的总重量为52kb。
答案 0 :(得分:7)
作为上述答案的补充,您还可以在项目安装过程中创建的Vuetify配置文件中进行设置( “ plugins / vuetify.js” ) ,添加“ 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'
})
现在,像这样使用图标组件:
<v-icon>fab fa-vuejs</v-icon>
答案 1 :(得分:3)
在Vuetify中的框架选项下发布了一个简单的解决方案:https://vuetifyjs.com/en/framework/icons
使用NPM或yarn安装图标:npm install @ fortawesome / fontawesome-free -D
将此添加到您的main.js
import '@fortawesome/fontawesome-free/css/all.css'
import Vue from 'vue'
import Vuetify from 'vuetify'
Vue.use(Vuetify, {
iconfont: 'fa'
})
在插件下创建一个js文件(例如icons.js)
import '@fortawesome/fontawesome-free/css/all.css'
import Vue from 'vue'
import Vuetify from 'vuetify'
Vue.use(Vuetify, {
iconfont: 'fa'
})
将此添加到nuxt.config.js中的插件
{ src: '~/plugins/icons.js', ssr:false }
现在,您可以使用v-icon或在组件中添加/添加前缀来访问字体真棒图标
<v-slider
v-model="energy"
color="red"
label="Energy"
min="1"
max="100"
thumb-label="always"
prepend-icon="fa-burn"
></v-slider>
答案 2 :(得分:2)
好吧,因此使用上述评论者的建议,我设法通过使用标准的vue-font-awesome
方法来使其工作,该方法包括字体真棒图标组件,将<v-icon>
替换为我在其中使用的我的问题:
<v-btn>
<v-icon>fas fa-code</v-icon>
</v-btn>
...成为:
<v-btn fab dark small color="black" v-on:click="addCodeBlock">
<font-awesome-icon :icon="['fas', 'code']"/>
</v-btn>
答案 3 :(得分:2)
由于您正在寻找避免将所有图标加载到vue / vuetify中的选项,因此建议您使用树摇动方法并手动添加要使用的每个图标。这可能有点乏味,但从长远来看,按需添加图标将是有益的-因为webpack只会捆绑您指定的图标。
请注意:
在本教程中,我假设读者具有Pro软件包。如果您只想使用免费版本,只需从混音中删除类似pro的内容
在下面,您可以看到我通过vuetify以及在v-icon和v-text / v-html中使用SVG的首选方式:
首先我们必须安装图标:
(在项目内部打开终端/命令提示符并安装)
$ 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 ***
然后将其添加到我们的vuetify配置中:
我在这里假设您将vuejs与javascript (不是打字稿)一起使用,并且已经通过
vue add vuetify
安装了vuetify。vuetify.js
文件应位于plugins
文件夹中的src
文件夹中。 Your milage may vary。
// 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.
},
});
好吧,现在我们已经添加了FontAwesome 5的主要组件,让我们使用树形交换来指示我们要在项目中使用哪些图标。我将仅使用两个图标作为示例:fa-plus
和fa-user-circle
,并为安装了(浅色,常规和双色调)然后我将为实体添加一些其他内容(条和用户),以了解如何同时以两种方式完成此操作。
所以回到我们的vuetify.js
文件,我们替换
// ... there should be more here, but see next part below ...
带有以下内容(注意驼峰大写字母):
// 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'
// ...
快速注释:如果您仍想添加这些库的整个库,则可以通过如下导入来做到这一点:
import { far } from '@fortawesome/pro-regular-svg-icons'
(常规),依此类推。>
如您所见,我们现在已经在我们的项目中添加了fa-plus和fa-user-circle。在这里,我们需要将它们添加到导入到library
配置中的vuetify.js
中。 (不要出汗,整个文件可以在下面的代码段中看到。):
// src/plugins/vuetify.js
// ...
Vue.component('font-awesome-icon', FontAwesomeIcon)
library.add(
faBars, faUser,
farPlus, falPlus, fadPlus,
farUserCircle, falUserCircle, fadUserCircle
)
/// ...
现在我们已经将它们添加到库中,我们需要将它们移交给vuetify。 Vuetify具有一些特殊图标,它们用于诸如<v-app-bar-nav-icon></v-app-bar-nav-icon>
(汉堡菜单)之类的图标。我们可以自定义这些,然后将自己添加到混合中(如果需要)。我通过定义一个常量并在其中添加所需的所有图标来做到这一点,就像这样:
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 default new Vuetify({
icons: {
iconfont: 'faSvg',
values: CUSTOM_ICONS,
},
});
您也可以将它们直接添加到
values
变量中,但是我发现通过一个常数来进行读取更具可读性。
<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>
// 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>
我们可以将fontAwesome逻辑分离到另一个文件:
所以我们有2个文件:
fontAwesome.js
,您可以执行所有属于fontAwesome的逻辑vuetify.js
导入图标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>
答案 4 :(得分:1)
在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')
然后在src / plugins / vuetify.js中定义iconfont
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import 'vuetify/src/stylus/app.styl'
Vue.use(Vuetify, {
iconfont: 'fa4' // 'md' || 'mdi' || 'fa' || 'fa4'
})