Nuxt3中如何引入Vant UI+移动端适配处理

之前笔者分享了如何在Nuxt3中使用Element Plus UI,但那是PC端的UI组件库,不适用于做移动端页面。做移动端比较主流的UI库就是Vant UI了。接下来我们讲讲如何在Nuxt3中使用VantUI。

引入Vant UI

  1. 先安装Vant

    # 可以选择一个你喜欢的包管理器npm/yarn/pnpm
    pnpm install vant
  2. 安装Nuxt官方专门针对引入vant 开发的模块

    # 选择合适的包管理器,npm/yarn/pnpm
    pnpm i @vant/nuxt -D
    1. 在nuxt.config.ts中配置modules参数
    export default defineNuxtConfig({
      modules: [
     '@vant/nuxt'
      ],
      vant: { /** Options */ }
    })

    至此,已经引入成功,且所有Vant 组件也都可以直接自动导入。
    示例:

    <template>
      <van-button type="primary" @click="showToast('toast')">button</van-button>
      <VanButton type="success" @click="showNotify('notify')">button</VanButton>
      <LazyVanButton type="default">lazy button</LazyVanButton>
    </template>

记住:Vant组件已经可以被自动导入,而且也包括自动导入showDialog、showToast等方法,所以我们不用再手动书写import了。

移动端适配

其实在Vant UI官方文档中有讲到如何做移动端的单位适配,需要借助postcss插件实现。其中,讲到了两种适配方式,一种是将px单位转换为vw。一种是将px单位转换为rem

  • vw单位适配方案
    vw单位适配方案
  • rem单位适配方案
    rem单位适配方案

那我们该使用哪种方案呢?其实笔者更倾向于使用rem方案,因为rem的兼容性更好,但是用rem的话,需要用到lib-flexble库去根据媒体查询动态的调整html的font-size,略显麻烦,所以,笔者打算将两者结合。

  1. 开发的时候书写px单位,然后通过插件将px单位换算成rem;
  2. 将html的font-size设置为vw单位,这样根元素font-size就能自动根据视口宽度动态变化;

具体的实现方式如下:

  1. 安装postcss-pxtorem

    pnpm i -D postcss-pxtorem
  2. nuxt.config.ts中配置postcss参数。笔者是以750px的尺寸做为设计稿参考值,定1rem=100px,这样换算方便。

    export default defineNuxtConfig({
      // ...other setting
      postcss: {
     plugins: {
       'postcss-pxtorem': {
         rootValue({ file }: any) {
           return file.indexOf('vant') !== -1 ? 37.5 : 100
         },
         propList: ['*'],
         exclude: /(node_module)/,
         selectorBlackList: ['html', '.rem-ignore']
       }  
     }
      },
    })
  3. 在app.vue或者其他全局的css文件中添加以下css。

    <style>
      html {
     font-size: 13.33333333vw;
      }
    
      @media (min-width: 560px) {
    html {
       font-size: 74.66666666666667px;
     }
      }
    
      body {
     font-size: 16PX;
      }
    </style>

13.33333333vw在750的设计稿上刚好为100px,所以刚好和第二步定的基准值一致。然后我将body的字体大小设为16px,是为了不让页面中内容在没有设置font-size时显的过大。而当页面宽度超过560px后,我们一般认为已经是宽屏设备了,采用一个统一的单位就可以了。
至此,配置完成,开发时候,我们将设计稿宽度调为750后,就可以完全按照设计稿的尺寸书写样式了。
比如我们写一个只占一半宽度的盒子:

<script setup lang="ts">

</script>

<template>
  <div>
    <div class="box"></div>
  </div>
</template>

<style>
.box {
  width: 375px;
  height: 375px;
  background-color: blue;
}
</style>

375px其实也就是标准稿的一半宽,也就是说这个div实际只会占据一半的页面,以下是在iPhoneXR的模拟设备上的效果。真实宽度是207px, 刚好是414px的一半。完美适配!
image.png

后记

至此,Vant组件成功引入,移动端适配问题也解决。接下来就可以好好的撸业务代码咯。一般移动端页面的大多数访问场景都是在微信内。其中就涉及怎么实现微信授权登录,这对新手来说也是个麻烦事,笔者将在下一篇分享中再来探讨该问题。
欢迎批评指正,或者与我交流探讨前端技术。源码尚未公开,联系我可私发。
联系我:imwty2023(微信)

本文原创地址:Nuxt3实战系列之引入Vant+移动端适配处理 | imwty


开发小记
记录一次次入坑和翻坑的经历

Enjoy creating rather than coding!

1.1k 声望
93 粉丝
0 条评论
推荐阅读
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs40阅读 4.7k评论 5

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.9k评论 9

用了那么久的 SVG,你还没有入门吗?
其实在大部分的项目中都有 直接 或 间接 使用到 SVG 和 Canvas,但是在大多数时候我们只是选择 简单了解 或 直接跳过,这有问题吗?没有问题,毕竟砖还是要搬的!

熊的猫17阅读 1.5k评论 2

封面图
嘿,vue中keep-alive有个「大坑」你可能还不知道
背景是这样的,我们使用vue2开发一个在线客服使用的IM应用,基本布局是左边是访客列表,右边是访客对话,为了让对话加载更友好,我们将对话的路由使用&lt;keep-alive&gt;缓存起来。但是如果将所有对话都缓存,未...

wuwhs12阅读 2.5k

封面图
你可能需要的多文档页面交互方案
在日常工作中,面对不同的需求场景,你可能会遇到需要进行多文档页面间交互的实现,例如在 A 页面跳转到 B 页面进行某些操作后,A 页面需要针对该操作做出一定的反馈等等,这个看似简单的功能,却也需要根据不同...

熊的猫8阅读 1.2k

封面图
把React新文档投喂给 GPT-4 后...
大家好,我卡颂。最近,React新文档终于上线了。从内容上看,新文档包括:理论知识、学习指引API介绍从形式上看,新文档除了传统的文字内容,还包括:在线Demo示意图小测验可以说是阅读体验拉满。但是,由于文档...

卡颂7阅读 7.5k评论 3

封面图

Enjoy creating rather than coding!

1.1k 声望
93 粉丝
宣传栏