为什么捐赠
API 浏览器
联系站长
Quasar 默认图标库

Quasar 的组件中会用到一些默认的图标,您可以指定 Quasar 使用哪个图标库作为默认图标库,被指定的这个图标库称为 Quasar Icon Set

您可以安装多个图标库,但是只能选择一个作为 Quasar 组件的默认图标库。

Quasar 目前支持 Material IconsMaterial SymbolsFont AwesomeIoniconsMDIEva IconsThemify IconsLine AwesomeBootstrap Icons

当然,您也可以将自己的图标(自定义的 SVG 或者任意格式的图片)用在 Quasar 的组件中,请参阅 QIcon 页面了解更多信息。

TIP

相关页面:安装图标库QIcon 组件

配置默认的图标库

Quasar 中有两种类型的图标库:webfont 类型和 svg 类型。

如果没有特别的配置,Quasar 将会使用 webfont 类型的 Material Icons 作为默认的组件图标库。当然,您可以指定 Quasar 使用别的图标库,但是如果是一个 webfont 类型的图标,您需要确保提前将其安装,请参考安装图标库

硬编码

如果不需要动态切换 Quasar 默认图标库,那么您可以根据您的项目类型选择以下方式之一:

Quasar CLI 方式

编辑 /quasar.config.js

extras: [
  // 确保启用了图标库
  'mdi-v7'
],
framework: {
  // webfont 类型的图标库示例
  iconSet: 'mdi-v7'
}
framework: {
  // svg 类型的图标库示例
  iconSet: "svg-mdi-v7";
}

关于所有可用的选项,请参考:GitHub 仓库

下面是一个完整的示例,启用 MDI 和 Fontawesome 并指定 Quasar 使用 Fontawesome 作为其组件的默认图标库。

extras: [
  'mdi-v7',
  'fontawesome-v6'
],
framework: {
  iconSet: 'fontawesome-v6'
}

这样,您可以同时在您的项目中使用 MDI 和 Fontawesome 的字体图标,同时,所有的 Quasar 组件都会默认使用 Fontawesome 的图标。

UMD 方式

引入图标库,并指定 Quasar 使用它,示例:

<!-- 在 Quasar 的 js 标签之后引入图标库 -->
<script src="https://cdn.jsdelivr.net/npm/quasar@v2/dist/icon-set/fontawesome-v6.umd.prod.js"></script>
<script>
  Quasar.IconSet.set(Quasar.IconSet.fontawesomeV6)
</script>

请参考 UMD / Standalone 页面查看您需要在 HTML 中引入的标签。

Quasar Vite 插件的方式

编辑 main.js

// ...
import { Quasar } from "quasar";
// ...
import iconSet from "quasar/icon-set/fontawesome-v6";
import "@quasar/extras/fontawesome-v6/fontawesome-v6.css";
// ...
app.use(Quasar, {
  // ...,
  iconSet: iconSet,
});

Vue CLI 方式

编辑 main.js:

import iconSet from "quasar/icon-set/fontawesome-v6";
// ...
import { Quasar } from "quasar";
// ...
app.use(Quasar, {
  // ...,
  iconSet: iconSet,
});

动态切换 (适用于非 SSR 模式)

Quasar CLI: 如果您的项目中 Quasar 默认图标库需要动态的切换(例如:根据 cookie 来切换),那么您需要创建一个启动文件:quasar new boot quasar-icon-set [--format ts],这个命令会创建一个 /src/boot/quasar-icon-set.ts 文件,编辑它如下:

// -- 在 @quasar/app-vite 版本中 --

import { IconSet } from "quasar";

// 修改路径为您的 node_modules/quasar/.. 的相对路径
const iconSetList = import.meta.glob("../../node_modules/quasar/icon-set/*.js");
// 或者只选择少数的几个图标库(如下面的示例只选择了 mdi-v7 和 fontawesome-v6):
// import.meta.glob('../../node_modules/quasar/icon-set/(mdi-v7|fontawesome-v6).js')

export default async () => {
  const iconSetName = "mdi-v7"; // ... 在此您可以自定义选择图标库的逻辑(例如使用一个 Cookies 插件?)

  try {
    iconSetList[`../../node_modules/quasar/icon-set/${iconSetName}.js`]().then((lang) => {
      IconSet.set(lang.default);
    });
  } catch (err) {
    // 请求的图标库不存在
    // 为了避免整个应用被破坏,所以捕获这个错误
  }
};
// -- 在 @quasar/app-webpack 版本中 --

import { IconSet } from "quasar";

export default async () => {
  const iconSetName = "mdi-v7"; // ... 在此您可以自定义选择图标库的逻辑(例如使用一个 Cookies 插件?)

  try {
    await import(
      /* webpackInclude: /(mdi-v7|fontawesome-v6)\.js$/ */
      "quasar/icon-set/" + iconSetName
    ).then((setDefinition) => {
      IconSet.set(setDefinition.default);
    });
  } catch (err) {
    // 请求的图标库不存在
    // 为了避免整个应用被破坏,所以捕获这个错误
  }
};

然后记得在 /quasar.config.js 中注册这个启动文件:

boot: ["quasar-icon-set"];

始终限制动态导入

注意其中关于 Webpack 魔法注册 - webpackInclude 的使用。否则所有的图标库都会被打包进构建产物中去,即使并没有使用它们,导致编译时间和产物体积增大。更多信息请参考动态导入的注意事项

动态切换 (适用于 SSR 模式)

在处理 SSR 模式时,我们不能使用单例对象,因为这会污染会话。因此,与上面的动态示例(先阅读它!)相反,您还必须从引导文件中指定 ssrContext

// -- With @quasar/app-vite --

import { IconSet } from "quasar";

// 修改路径为您的 node_modules/quasar/.. 的相对路径
const iconSetList = import.meta.glob("../../node_modules/quasar/icon-set/*.js");
// 或者只选择少数的几个图标库(如下面的示例只选择了 mdi-v7 和 fontawesome-v6):
// import.meta.glob('../../node_modules/quasar/icon-set/(mdi-v7|fontawesome-v6).js')

// ! 注意 ssrContext 参数:
export default async ({ ssrContext }) => {
  const iconSetName = "mdi-v7"; // ... 在此您可以自定义选择图标库的逻辑(例如使用一个 Cookies 插件?)

  try {
    iconSetList[`../../node_modules/quasar/icon-set/${iconSetName}.js`]().then((lang) => {
      IconSet.set(lang.default, ssrContext);
    });
  } catch (err) {
    // 请求的图标库不存在
    // 为了避免整个应用被破坏,所以捕获这个错误
  }
};
// -- With @quasar/app-webpack --

import { IconSet } from "quasar";

// ! 注意 ssrContext 参数:
export default async ({ ssrContext }) => {
  const iconSetName = "mdi-v7"; // ... 在此您可以自定义选择图标库的逻辑(例如使用一个 Cookies 插件?)

  try {
    await import(
      /* webpackInclude: /(mdi-v7|fontawesome-v6)\.js$/ */
      "quasar/icon-set/" + iconSetName
    ).then((setDefinition) => {
      IconSet.set(setDefinition.default, ssrContext);
    });
  } catch (err) {
    // 请求的图标库不存在
    // 为了避免整个应用被破坏,所以捕获这个错误
  }
};

在运行时切换 Quasar 默认图标库

动态切换默认图标库

Quasar Icon Set 是响应式的,所以,如果修改了 $q.iconSet 对象,所有的组件都会自动更新。示例:

// 组合式 API 形式
import { useQuasar } from 'quasar'
import mdiIconSet from 'quasar/icon-set/mdi-v7.js'

setup () {
  const $q = useQuasar()

  function changeIconSetToMdiIconSet () {
    $q.iconSet.set(mdiIconSet)
  }

  return {
    changeIconSetToMdiIconSet
  }
}
// 选项式 API 形式
import mdiIconSet from 'quasar/icon-set/mdi-v7.js'

methods: {
  changeIconSetToMdiIconSet () {
    this.$q.iconSet.set(mdiIconSet)
  }
}

动态的切换一个指定的组件的图标

如果您想修改一个指定的图标:

// 组合式 API 形式
import { useQuasar } from 'quasar'

setup () {
  const $q = useQuasar()

  function changeQEditorHeaderIcon () {
    $q.iconSet.editor.header1 = 'fas fa-font'
  }

  return { changeQEditorHeaderIcon }
}
// 选项式 API 形式
methods: {
  changeQEditorHeaderIcon () {
    this.$q.iconSet.editor.header1 = 'fas fa-font'
  }
}