Code前端首页关于Code前端联系我们

Vue2 Quasar 协同开发有啥核心优势?

terry 1天前 阅读数 14 #Vue
文章标签 Vue2;Quasar

前端开发里,Vue2 虽然不再是最新版本,但很多企业项目还稳定运行在 Vue2 技术栈上;而 Quasar 作为能一站式搞定 Web、移动端、桌面端的 Vue 生态框架,把两者结合起来开发项目,能碰撞出不少实用价值,那 Vue2 搭配 Quasar 开发,到底有哪些核心优势?实际项目里怎么快速落地?不同场景下又要注意什么细节?今天就从开发优势、项目初始化、组件实践、跨端要点、生态整合这几个角度,把这些问题聊透。

首先得说**「跨端开发效率」**这块,Quasar 提供的 CLI 工具特别“聪明”,创建项目时选个模板,就能一键生成 Web 应用、Cordova 移动端 App、Electron 桌面端程序的工程结构,Vue2 负责页面逻辑和数据绑定,Quasar 把不同端的适配细节(比如移动端手势、桌面端窗口事件)都封装好了,举个例子,做一个企业内部工具,既需要员工在电脑网页用,又要业务员在手机上操作,用 Vue2 + Quasar 只写一套核心代码,改改配置就能同时打包出 Web 版和 App 版,比分别用 Vue2 写 Web、React Native 写移动端省太多事。

再看「组件库的实用性」,Quasar 官方组件库覆盖了从基础按钮、输入框,到复杂表格、树形选择器、响应式导航栏等上百个组件,这些组件不仅样式统一(默认 Material Design 风格,也能自定义),还内置了响应式逻辑,在 Vue2 项目里,像表单验证这种场景,Quasar 的 QForm + QInput 组合,配合 Vue2 的 v-model 双向绑定,几行代码就能实现“输入即验证”;要是自己用 Vue2 写这类组件,得折腾表单状态管理、错误提示逻辑,效率差很多。

还有「响应式设计的省心度」,做前端最头疼不同设备的适配,Quasar 内置了栅格系统、断点检测(比如自动识别手机、平板、PC 屏幕),在 Vue2 组件里,用 Quasar 的栅格组件 QRow、QCol 排版,不用手写媒体查询,组件会自动根据屏幕宽度调整布局,比如做一个数据看板页面,PC 端显示三列图表,平板端两列,手机端单列,只需要在模板里用 QCol 的 :cols 属性结合断点参数(如 xs="12" md="6" lg="4"),Vue2 负责数据渲染,Quasar 负责布局适配,开发时不用反复调试不同设备的样式。

Vue2 项目里怎么快速引入 Quasar?

第一步得把环境搭好,确保电脑装了 Node.js(建议 14+ 版本,太新可能和旧版 Quasar 兼容有问题,Vue2 项目常用 Node 14/16),然后用 npm 或 yarn 装 Quasar CLI:

npm install -g @quasar/cli

(注意,Quasar 1.x 版本对 Vue2 支持更好,装的时候可以指定版本,npm install -g @quasar/cli@1)。

接着初始化项目,打开终端执行 quasar create my-vue2-quasar-app,过程中会让选 Vue 版本,选 Vue2;然后选是否用 TypeScript(如果团队技术栈是 JS 就选 No)、ESLint 配置这些,等项目创建好,目录里会有 quasar.conf.js 这个核心配置文件,还有 src 目录(和普通 Vue2 项目结构类似,但多了 Quasar 专属的 bootcomponents 等文件夹)。

之后是组件和样式的引入,在 Vue2 的入口文件 main.js 里,要把 Quasar 全局注册:

import Vue from 'vue'
import App from './App.vue'
import Quasar from 'quasar'
import 'quasar/dist/quasar.css' // 引入默认样式
Vue.use(Quasar)
new Vue({
  render: h => h(App)
}).$mount('#app')

这样就能在任意 Vue2 组件里用 Quasar 组件了,比如写个按钮:<q-btn label="提交" color="primary" />,要是想自定义主题(比如换主色、调整圆角),可以在 quasar.conf.js 里配置 framework.theme,或者在项目里新建 quasar.variables.scss 覆盖默认 SCSS 变量,再配合 Vue2 的 <style lang="scss" scoped> 写组件内样式,实现全局和局部的样式定制。

Quasar 组件在 Vue2 项目里怎么高效用?

先看「表单场景」,Vue2 里表单处理靠 v-model + 验证逻辑,Quasar 的 QForm 组件正好能无缝衔接,比如做一个登录表单:

<q-form @submit="handleSubmit">
  <q-input
    v-model="username"
    label="用户名"
    :rules="[val => val.length > 2 || '用户名至少3位']"
  />
  <q-input
    v-model="password"
    label="密码"
    type="password"
    :rules="[val => val.length > 5 || '密码至少6位']"
  />
  <q-btn type="submit" label="登录" />
</q-form>

这里 QInput 的 rules 属性和 Vue2 的数据验证逻辑结合,提交时 QForm 会自动检查所有输入框的规则,通过后触发 @submit 事件,在 methods 里写 handleSubmit 处理登录逻辑,比自己写多个 watch 或者自定义指令简洁太多。

再聊「导航布局」,企业后台类项目常用侧边栏 + 顶部栏 + 内容区的结构,Quasar 的 QLayout 组件能快速搭起来,结合 Vue2 的 vue-router@3.x(因为 Vue2 对应 router 3 版本),示例代码大概长这样:

<q-layout view="hHh Lpr lFf">
  <q-header>
    <q-toolbar>
      <q-btn dense flat round icon="menu" @click="toggleDrawer" />
      <q-toolbar-title>系统名称</q-toolbar-title>
    </q-toolbar>
  </q-header>
  <q-drawer v-model="drawerOpen" side="left" bordered>
    <q-list>
      <q-item v-for="(item, index) in menuList" :key="index" @click="goTo(item.path)">
        <q-item-label>{{ item.name }}</q-item-label>
      </q-item>
    </q-list>
  </q-drawer>
  <q-page-container>
    <router-view />
  </q-page-container>
</q-layout>

这里 QLayout 的 view 属性是布局缩写(h 代表 header 显示,L 代表 left drawer 显示等),配合 Vue2 的数据响应式(drawerOpendata 里的布尔值),点击按钮切换侧边栏展开/收起,router-view 渲染不同页面,一套代码把布局和路由结合得很丝滑。

「数据展示」方面,QTable 组件堪称“神器”,假设 Vue2 组件里有个表格要展示用户列表,还得支持分页、排序:

<q-table
  :data="tableData"
  :columns="columns"
  :pagination="pagination"
  :sort-by="sortBy"
  @sort="onSort"
/>
<script>
export default {
  data() {
    return {
      columns: [
        { name: 'name', label: '姓名', field: 'name' },
        { name: 'age', label: '年龄', field: 'age' }
      ],
      tableData: [], // 从接口获取的用户数据
      pagination: { page: 1, rowsPerPage: 10 },
      sortBy: 'name'
    }
  },
  methods: {
    onSort(sortBy) {
      this.sortBy = sortBy
      // 调用接口重新获取排序后的数据
    }
  },
  mounted() {
    this.fetchData() // 获取初始数据
  }
}
</script>

QTable 会自动根据 columns 渲染表头,data 渲染内容,pagination 控制分页,@sort 事件处理排序逻辑,Vue2 只需要关注数据请求和状态管理,表格的 UI 交互(比如点击表头排序、分页切换)Quasar 都封装好了,不用自己写大量 DOM 操作代码。

Vue2 + Quasar 做跨端项目要注意啥?

先看「Web 端」,如果项目需要 SEO(比如官网类页面),得考虑服务端渲染(SSR),Quasar 本身支持 SSR,在 quasar.conf.js 里把 ssr 选项打开,然后结合 Vue2 的 SSR 逻辑(比如用 asyncData 在服务端获取数据),Web 端性能优化也不能忽视,Quasar CLI 打包时可以配置代码分割(splitChunks),把第三方库和业务代码分开加载;还能利用 Quasar 的树摇(tree-shaking)功能,只打包用到的组件,减少包体积,比如项目里只用了 QBtn、QInput,打包后不会把整个 Quasar 组件库都塞进去。

「移动端(Cordova 方案)」的关键点在「设备权限」「API 调用时机」,比如做一个拍照上传功能,得先在 config.xml 里配置相机权限,然后在 Vue2 组件里监听 Cordova 的 deviceready 事件,确保设备 API 加载完成后再调用,示例代码:

mounted() {
  document.addEventListener('deviceready', () => {
    this.cordovaReady = true
  }, false)
},
methods: {
  takePhoto() {
    if (this.cordovaReady) {
      navigator.camera.getPicture((imageUri) => {
        // 处理图片路径
      }, (err) => {
        console.error(err)
      }, { quality: 50 })
    }
  }
}

还要注意移动端的手势操作,Quasar 提供了 QSwipe、QTouch 等组件,处理左滑、长按等事件,在 Vue2 里用这些组件能快速实现移动端特有的交互,比如左滑删除列表项。

「桌面端(Electron 方案)」得关注「进程通信」「窗口管理」,Electron 分主进程和渲染进程,Vue2 页面属于渲染进程,要和主进程通信得用 ipcRenderer,比如做一个打开系统文件夹的功能:

// 渲染进程(Vue2 组件)
import { ipcRenderer } from 'electron'
methods: {
  openFolder() {
    ipcRenderer.send('open-folder-request')
  }
}
// 主进程(electron-main.js)
import { ipcMain, dialog } from 'electron'
ipcMain.on('open-folder-request', () => {
  dialog.showOpenDialog({ properties: ['openDirectory'] }).then((result) => {
    if (!result.canceled) {
      // 把选中的路径发回渲染进程
      win.webContents.send('folder-opened', result.filePaths[0])
    }
  })
})

Electron 打包后的应用体积容易偏大,要在 quasar.conf.js 里配置打包参数,比如排除不必要的依赖,用 electron-builder 的压缩选项,让桌面端程序更轻便。

Vue2 + Quasar 生态怎么和其他工具结合?

「状态管理选 Vuex@3.x」很自然,因为 Vue2 官方推荐 Vuex 3 版本,在 Quasar 项目里,把 Vuex 模块拆分成用户、权限、设置等,然后在 Quasar 组件里 dispatch 动作,比如用户登录成功后保存 token:

// store/user.js
export default {
  state: { token: '' },
  mutations: {
    SET_TOKEN(state, token) {
      state.token = token
    }
  },
  actions: {
    login({ commit }, userInfo) {
      // 调用登录接口
      return request.post('/login', userInfo).then(res => {
        commit('SET_TOKEN', res.data.token)
        return res
      })
    }
  }
}
// Quasar 组件里调用
methods: {
  async handleLogin() {
    await this.$store.dispatch('user/login', { username: this.username, password: this.password })
    // 登录成功后的逻辑
  }
}

「请求库用 Axios」时,建议封装一个全局实例,和 Quasar 的加载组件结合,比如请求时显示加载动画:

import axios from 'axios'
import { QSpinner } from 'quasar'
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})
service.interceptors.request.use(
  config => {
    // 显示加载动画
    this.$q.loading.show({ spinner: QSpinnerdots })
    return config
  },
  error => {
    // 隐藏加载动画
    this.$q.loading.hide()
    return Promise.reject(error)
  }
)
service.interceptors.response.use(
  response => {
    this.$q.loading.hide()
    return response
  },
  error => {
    this.$q.loading.hide()
    return Promise.reject(error)
  }
)
export default service

「测试环节」用 Vue Test Utils(针对 Vue2)来测 Quasar 组件,比如测试一个带 QBtn 的组件,模拟点击事件:

import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
describe('MyComponent', () => {
  it('点击按钮触发回调', () => {
    const wrapper = mount(MyComponent)
    const btn = wrapper.find('q-btn')
    const mockFn = jest.fn()
    wrapper.setMethods({ handleClick: mockFn })
    btn.trigger('click')
    expect(mockFn).toHaveBeenCalled()
  })
})

这样把 Vue2 生态里的状态管理、请求、测试工具和 Quasar 结合,项目的可维护性和扩展性都会更强。

Vue2 + Quasar 的组合,在既有 Vue2 技术积累的团队里,能借助 Quasar 的跨端能力、组件库、响应式系统快速落地项目;从初始化到组件实践,再到跨端和生态整合,每个环节都有明确的路径和技巧,哪怕后续要升级到 Vue3,Quasar 也有对 Vue3 的支持版本,现在基于 Vue2 做的业务逻辑和组件,迁移成本也相对可控,所以不管是维护老项目,还是新开需要跨端的 Vue 项目,Vue2 + Quasar 都是值得尝试的技术组合~

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门