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

Vue3新手做移动端电商首页,用Vant怎么快速搞定踩坑又少?

terry 58分钟前 阅读数 24 #Vue

最近身边好多刚从React转过来或者刚学完Vue3基础的朋友,都在吐槽做移动端第一站选电商首页时遇到的麻烦:适配乱糟糟、组件拼接太零散、滚动懒加载半天调不好,还有主题色换得手忙脚乱,其实用对Vant这些组件库的「隐藏特性」和「官方推荐的组合拳」,这些坑大部分都能避开,而且半天就能搭出个有模有样的雏形。

先捋清电商首页的核心模块,提前选好Vant对应组件

做任何页面都不能上来就敲代码,先把核心模块列出来,从Vant文档里挑适配度最高的组件,这是「快速」的第一步,电商首页一般逃不过这几个部分:顶部状态栏、自定义导航栏(带搜索和快捷入口那种)、轮播图、金刚区、品牌专区/推荐商品瀑布流、底部tabbar。

顶部状态栏可以用Vant自带的StatusBar组件,不用自己去算各种机型的安全区高度,太省心了,自定义导航栏就别用自带的NavBar了——电商首页的导航栏通常有搜索框、消息气泡、下拉菜单这些扩展功能,用NavBar的插槽虽然也行,但组合不如Flex布局直接搭得顺手?不对不对,官方文档里有讲过用Cell和Search结合插槽做组合式导航栏的案例,效果比纯Flex稳,因为它能自动适配安全区的上边距,不用手动给状态栏下面的区域加padding,轮播图肯定选Swipe,金刚区用Grid,品牌专区可以用Grid加自定义头像展示,瀑布流选List和Waterfall的组合——注意这里有个新手常踩的坑:Waterfall组件不能单独用,必须套在List组件里面,而且要给List组件设置height或者overflow-y: scroll,否则无限加载触发不了,底部tabbar就用Tabbar,新手记得把active-color和inactive-color设置成自己的品牌色,另外TabbarItem的to属性如果是路由跳转,要在外面包一层RouterLink,别直接写to,否则Vue3里面会警告无效的属性。

适配全机型不用愁,安全区和rem/pcvw/vh转换一步到位

移动端适配最头疼的就是安全区和不同屏幕尺寸的文字图片比例问题,Vant其实都有现成的方案,不用自己手写viewport和flexible.js这些老一套了。

安全区适配,刚才提过StatusBar能自动补顶部安全区,底部安全区的话,只要给Tabbar组件加一个safe-area-inset-bottom属性就行,如果Tabbar不是固定在页面底部,或者页面底部有其他内容(比如限时抢购的悬浮按钮),那给那个元素加safe-area-inset-bottom或者padding-bottom: env(safe-area-inset-bottom); 就可以,env函数是CSS原生支持的,兼容性也很好,大部分主流机型都能用。

然后是尺寸转换,Vant官方推荐用postcss-px-to-viewport这个插件,把px自动转换成vw或vh,这样开发的时候就可以直接按照设计稿的尺寸敲代码,不用再乘以比例系数了,举个例子,设计稿宽度是750px的话,设置插件的viewportWidth为750,设计稿里100px的宽度,编译出来就是13.333vw,新手配置这个插件的时候可能会遇到配置没生效的问题,这里有几个小细节要注意:第一,Vant组件库默认的px是按照375px的设计稿来的,所以要给插件加一个exclude选项,把node_modules/vant里面的文件排除掉,或者把Vant组件库的viewportWidth单独设置成375;第二,有些插件的配置是放在postcss.config.js里面,有些是放在vue.config.js或者vite.config.js里面,新手要看清楚自己用的构建工具是Vue CLI还是Vite;第三,确保插件的版本和构建工具的版本兼容,比如Vite 5.x版本要配合postcss-px-to-viewport的最新版本或者兼容的beta版本。

瀑布流无限加载不卡顿、图片懒加载更丝滑的小技巧

电商首页的瀑布流和推荐商品列表是最容易卡顿的地方,尤其是图片多的时候,新手经常会遇到滚动到一半加载不出来,或者加载出来的图片布局乱跳的问题,这里有几个Vant官方没有明说但非常好用的小技巧。

第一个小技巧是给List组件设置loading-text和error-text,而且要给loading图标和error提示加一点样式,比如居中对齐、加一点上下间距,这样用户体验会好很多,List组件的immediate-check属性默认是true,也就是说页面加载的时候会自动检查是否需要加载更多数据,新手如果不想页面刚打开就加载两次数据,可以把这个属性设置成false,然后手动调用List组件的check()方法来触发第一次加载。

第二个小技巧是用Vant自带的Image组件,它有一个lazy-load属性,开启之后图片会在滚动到可视区域的时候才加载,而且能自动处理图片加载失败的情况,显示一张默认的占位图,新手记得在main.js或者组件库入口文件里面注册Image组件的lazy-load指令,或者直接用Image组件的lazy属性(注意Vue3里面Vant 4.x版本的Image组件推荐用lazy属性而不是指令,指令虽然也能用,但有时候会有兼容性问题),占位图的尺寸最好和实际图片的尺寸比例一致,这样可以避免布局乱跳——比如可以用一张透明的PNG图片,宽高比和设计稿里的图片一致,或者用CSS的padding-bottom来撑开占位空间,比如宽高比是4:3的话,padding-bottom就是75%。

第三个小技巧是给瀑布流的Waterfall组件设置gutter和column-width属性,gutter是两列之间的间距,column-width是每一列的宽度,新手最好不要同时设置column-count和column-width,否则会有兼容性问题,Waterfall组件的item-width属性默认是和column-width一样的,但有时候我们需要给每一个商品卡片加一点内边距或者外边距,这时候就要把item-width设置成column-width减去内边距和外边距的总和,否则商品卡片会超出Waterfall的宽度。

品牌色一键切换,不用手动改每个组件的颜色

电商首页的品牌色通常是统一的,比如淘宝的橙色、京东的红色,新手如果手动改每个组件的active-color、text-color、background-color这些属性,不仅效率低,而且容易漏改,Vant提供了CSS变量的方式来一键切换品牌色,非常方便。

我们需要在项目的根目录下新建一个vant-theme.css文件,或者在App.vue的style标签里面写全局样式,然后在里面覆盖Vant的CSS变量,Vant的CSS变量都是以--van开头的,-van-primary-color是主色调,--van-primary-color-light是主色调的浅色版本,--van-primary-color-dark是主色调的深色版本,--van-text-color是文字颜色,--van-background-color是背景颜色,我们可以直接把这些变量改成自己的品牌色, :root { --van-primary-color: #ff6b35; --van-primary-color-light: #ff9a76; --van-primary-color-dark: #e55a2b; --van-tabbar-item-active-color: var(--van-primary-color); } 这样一来,所有用到Vant组件的地方,主色调都会自动变成#ff6b35,不用再手动改每个组件的颜色了,如果我们需要做深色模式的话,只需要在媒体查询里面重新覆盖这些CSS变量就行, @media (prefers-color-scheme: dark) { :root { --van-primary-color: #ff7b47; --van-text-color: #f5f5f5; --van-background-color: #1a1a1a; } } 新手注意,CSS变量的优先级比组件的props高,所以如果我们在某个组件里面设置了active-color属性,那这个组件的颜色会以props为准,不会被CSS变量覆盖。

最后给新手的一点建议

做移动端电商首页,其实不需要太追求特效,简洁实用、加载速度快、用户体验好才是最重要的,Vant组件库已经帮我们封装好了大部分常用的组件,我们只需要按照官方文档的推荐来组合使用这些组件,就能快速搭出一个符合规范的页面,新手如果遇到问题,不要第一时间去问别人,先去翻Vant的官方文档,官方文档里面有很多详细的案例和常见问题的解答,大部分问题都能在里面找到答案,如果官方文档里面没有,再去GitHub的Issue区搜索一下,看看有没有其他人遇到过类似的问题。

就是我做了这么多次移动端电商首页总结出来的经验,希望能帮到正在踩坑的Vue3新手,如果大家还有其他问题,欢迎在评论区留言交流。

版权声明

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

热门