为什么捐赠
API 浏览器
联系站长
如何使用 Vue

在开始学习 Quasar 之前,建议先掌握 Vue 3 的基础知识。对于有响应式 UI 开发经验的开发者来说,Vue 3 文档最多只需半天时间就可以通读,这对理解如何使用和配置 Quasar 组件非常有帮助。

TIP

如果您是 Vue 和响应式 UI 库的初学者,想找一份好教程,推荐您看看 Vue 和 Quasar 视频教程

在阅读 Vue 文档后,让我们来解答一些常见问题,比如 “如何使用 Quasar 组件、Vue 属性、方法和事件”

Vue 单文件组件 (SFC)

您将使用 *.vue 文件来构建 Quasar 应用,每个文件包含多个部分:template(HTML)、script(Javascript)和 style(CSS/SASS/SCSS/Stylus/Less),它们都在同一个文件中。

目前,推荐使用组合式 API 配合 <script setup> 语法。更多信息请查看 Vue.js 文档

<template>
  <!-- 在此定义 Vue 模板 -->
</template>

<script setup>
  // 在这里编写 JavaScript,
  // 定义您的 Vue 组件,
  // 可以是布局、页面或您自己的
  // 可复用组件。
</script>

<style>
  /* 在此编写 CSS */
</style>

当然,您也可以使用不带 <script setup> 的组合式 API 或选项式 API。唯一的区别在 <script> 标签内部。

<template>
  <!-- 在此定义 Vue 模板 -->
</template>

<script>
  // 在这里编写 JavaScript,
  // 定义您的 Vue 组件,
  // 可以是布局、页面或您自己的
  // 可复用组件。

  export default {
    //
  };
</script>

<style>
  /* 在此编写 CSS */
</style>

CSS 预处理器

<style> 标签中,您可以使用任意 CSS 预处理器。Sass/SCSS(推荐)是开箱即用的。

您可以指定使用哪种预处理器来处理 CSS 代码:

<!-- 注意 lang="sass" -->
<style lang="sass">
  .some-div
    font-size: 15px
</style>

<!-- 注意 lang="scss" -->
<style lang="scss">
  .some-div {
    font-size: 15px;
  }
</style>

使用 Quasar 指令

Quasar 提供了一些自定义 Vue 指令,几乎可以用在任何 DOM 元素或组件上。

Quasar 指令示例:

<div v-ripple>点击我</div>

注意在 HTML 模板中 Ripple 以 v-ripple 的形式使用。Vue 指令都以 v- 为前缀。

<div v-touch-pan="handler">...</div>
<div v-touch-swipe="handler">...</div>
<div v-ripple>点击我,会有涟漪效果</div>

使用 Quasar 组件

Quasar 组件的名称以 “Q” 开头,如 “QBtn” 或 “QElementResizeObserver”。要使用它们,需要在 /quasar.config 文件中添加引用。

以 QBtn 和 QIcon 为例,看看如何在应用中嵌入这些组件:

<div>
  <q-btn @click="doSomething" label="Do something" />
  <q-icon name="alarm" />
</div>

注意在 Vue HTML 模板中 QBtn 以 <q-btn> 的形式使用。如果导入 QElementResizeObserver,则在模板中使用 <q-element-resize-observer>

使用 Quasar 插件

Quasar 插件是可以在 Vue 文件内外使用的功能,如 Notify、BottomSheet、AppVisibility 等。

WARNING

在使用前,需要在 /quasar.config 文件中添加引用(如下所示)。

framework: {
  plugins: ["Notify", "BottomSheet"];
}

以 Notify 为例,看看如何使用它。在 Vue 文件中,可以这样写(组合式 API):

<template>
  <div>
    <q-btn @click="$q.notify('My message')" color="primary" label="Show a notification" />

    <q-btn @click="showNotification" color="primary" label="Show another notification" />
  </div>
</template>

<script>
  import { useQuasar } from "quasar";

  export default {
    setup() {
      const $q = useQuasar();

      function showNotification() {
        $q.notify("Some other message");
      }

      return {
        showNotification,
      };
    },
  };
</script>

注意在模板区域中使用 $q.<plugin-name> 的方式。

选项式 API 中等价的 script 部分:

export default {
  methods: {
    showNotification() {
      this.$q.notify("Some other message");
    },
  },
};

在 Vue 文件之外使用 Notify 的示例:

import { Notify } from "quasar";

// ...
Notify.create("My message");

自闭合标签

WARNING

在使用 Quasar UMD 版本时,不要使用自闭合标签。因为浏览器会在 Vue 解析 DOM 元素之前先解释 HTML,所以 HTML 语法必须正确。浏览器无法识别的标签(如 Vue 组件)不能是自闭合的,否则浏览器会认为您打开了一个标签但从未关闭它。

有些 Quasar 组件不需要包含 HTML 内容,这种情况下可以使用自闭合标签。例如 QIcon:

<q-icon name="cloud" />

自闭合等价于:

<q-icon name="cloud"></q-icon>

两种形式都是有效的,UMD 版本除外(必须显式关闭标签)。普通 DOM 元素也是一样的:

<div class="col" />
<!-- 等价于: -->
<div class="col"></div>

某些 eslint-plugin-vue 的规则实际上会强制使用自闭合语法。

处理 Vue 属性

假设有一个虚构的 Quasar 组件 QBogus,支持以下属性。我们将在下面的章节中逐一讨论每种类型的 Vue 属性。

Vue 属性类型描述
infiniteBoolean是否启用无限滚动
sizeString加载条的厚度
speedNumber加载条更新速度(毫秒)
columnsObject列定义对象(见下方 “Columns Definition” 部分)
offsetArray包含两个数字的数组,表示水平和垂直偏移量(像素)

布尔属性

布尔属性只接受严格的布尔值,不会发生自动类型转换,因此您必须确保传入的是真正的布尔值。

TIP

在 Quasar 中,所有布尔属性的默认值都是 false。因此,您不需要显式地为它们设置 false 值。

如果需要动态控制该属性,在运行时改变它的值,请将它绑定到一个变量上:

<template>
  <q-bogus :infinite="myInfiniteVariable" />
</template>

<script>
  import { ref } from "vue";

  export default {
    setup() {
      const myInfiniteVariable = ref(false);
      return {
        myInfiniteVariable,
      };
    },
  };
</script>

如果这个布尔值不会改变,可以使用简写形式,像组件属性一样直接写上即可。换言之,如果不需要绑定到组件作用域中的变量,因为它始终为 true

<template>
  <q-bogus infinite />

  <!--
    下面的写法也完全正确,
    只是更长一些
  -->
  <q-bogus :infinite="true" />
</template>

字符串属性

字符串属性需要传入一个字符串值。

<template>
  <!--
    直接赋值,不需要
    在作用域中定义变量
  -->
  <q-bogus size="24px" />

  <!--
    也可以绑定到作用域中的变量,
    这样就能动态修改它
  -->
  <q-bogus :size="mySize" />
</template>

<script>
  import { ref } from "vue";

  export default {
    setup() {
      // 注意值是字符串
      const mySize = ref("16px");
      return {
        mySize,
      };
    },
  };
</script>

数字属性

<template>
  <!--
    情况 1:直接赋值。
    注意属性名前的冒号(":")。
  -->
  <q-bogus :speed="50" />

  <!-- 情况 2:通过作用域变量赋值 -->
  <q-bogus :speed="myNumber" />
</template>

<script>
  import { ref } from "vue";

  export default {
    setup() {
      // 注意值是数字
      const myNumber = ref(50);
      return {
        myNumber,
      };
    },
  };
</script>

对象属性

<template>
  <!-- 情况 1:直接赋值 -->
  <q-bogus :columns="{key: 'value', anotherKey: 'another value'}" />

  <!-- 情况 2:通过作用域变量赋值 -->
  <q-bogus :columns="myColumns" />
</template>

<script>
  import { ref } from "vue";

  export default {
    setup() {
      const myColumns = ref({
        key: "value",
        anotherKey: "another value",
      });

      return { myColumns };
    },
  };
</script>

数组属性

<template>
  <!-- 情况 1:直接赋值 -->
  <q-bogus :offset="[10, 20]" />

  <!-- 情况 2:通过作用域变量赋值 -->
  <q-bogus :offset="myOffset" />
</template>

<script>
  export default {
    setup() {
      return {
        myOffset: [10, 20],
      };
    },
  };
</script>

处理 Vue 方法

在文档中,您会注意到某些 Quasar 组件提供了可调用的方法。例如:

Vue 方法描述
next()跳转到下一张幻灯片
previous(doneFn)跳转到上一张幻灯片
toggleFullscreen()切换全屏模式

要访问这些方法,首先需要在组件上设置一个 Vue 引用。以下是组合式 API 的示例:

<template>
  <!--
    注意 ref="myRef"。我们将在下方的
    script 部分使用 "ref" 对应的名称
  -->
  <q-bogus ref="myRef" />
</template>

<script>
  import { ref, onMounted } from "vue";

  export default {
    setup() {
      const myRef = ref(null);

      // 在组件挂载到 DOM 之后:
      onMounted(() => {
        // 调用组件的 "next()" 方法
        myRef.value.next();
      });
      // 在挂载前调用可能会出错,
      // 因为 Vue 尚未准备好 Vue 引用

      // 将 myRef 暴露到作用域中,以便
      // Vue 也能在模板中使用它
      return { myRef };
    },
  };
</script>

以下是相同示例的选项式 API 版本:

<template>
  <!--
    注意 ref="myRef"。我们将在下方的
    script 部分使用 "ref" 对应的名称
  -->
  <q-bogus ref="myRef" />
</template>

<script>
  export default {
    // 现在可以访问 `this.$refs.myRef`
    // 以下是在 mounted() Vue 组件钩子中的示例
    mounted() {
      // 调用 "next()" 方法:
      this.$refs.myRef.next();
    },
    // 在挂载前调用可能会出错,
    // 因为 Vue 尚未准备好 Vue 引用
  };
</script>

处理 Vue 事件

在文档中,您会注意到某些 Quasar 组件有一个 “Vue Events” 部分。

“Vue Events” 示例:

事件名称描述
@show模态框显示后立即触发
@hide模态框隐藏后立即触发

要捕获这些事件,需要在 HTML 模板中的组件上添加监听器。示例如下:

<template>
  <q-bogus @show="doSomething" @hide="doSomethingElse" />
</template>

<script>
  export default {
    setup() {
      function doSomething() {
        // 当 QBogus 组件触发 @show 事件时
        // 这个方法会被调用
      }

      function doSomethingElse() {
        // 当 QBogus 组件触发 @hide 事件时
        // 这个方法会被调用
      }

      return {
        doSomething,
        doSomethingElse,
      };
    },
  };
</script>