当前位置: 首页 > Web前端 > JavaScript

开发微信小程序你一定要知道

时间:2023-03-27 18:27:13 JavaScript

前面写的是因为微信小程序号称解决了前端程序员头疼的兼容性问题,只需要按照腾讯官方的一套规则进行编码,就可以满足不同终端的需求.于是去年下半年用微信小程序实现了一个在我们公司使用的项目(目前用户700+)。下面是我在探索过程中的一些心得总结,为以后的同学们做铺垫,让大家早点下班回家陪老婆孩子。你将学习:如何使用自定义tabbar和权限控制如何使用echarts图表插件程序大小超限如何分包如何使用vantUI组件解决页面滚动自定义页眉弹出层滑动问题并将页面滚动到顶部如何实现自动更新,以及手动更新方案。内部软件需要登录,如何通过审核?其他陷阱?为什么在使用wepy设置数据后不更新视图?1如何使用自定义tabbar和权限控制用过原生tabbar的同学都知道,原生tabbar太丑了,有些样式没办法自定义。大多数应用最终都会有自定义tabbar的需求。按照规矩,先丢官方链接。使用步骤:将官方demo中的custom-tab-bar文件复制到我使用的wepy框架的根目录下,然后复制到src目录下如图。是的,自定义tabbar部分需要使用原生写法。其他自己的业务页面使用wepy框架。入口文件app.json启用自定义tabbarwepy框架。app.wpy配置对象中列表中的pagePath是其自身页面的目录。有必要,其他属性可以删掉,因为具体的tabbar样式(比如图片和颜色)还是要在Customizecustom-tab-bar中设置。"tabBar":{"custom":true,//"color":"#7A7E83",//这里写着不起作用,可以注释掉//"selectedColor":"#3cc51f",//这里写的不行,可以注释//"borderStyle":"black",//"backgroundColor":"#ffffff",//写这里不行,可以注释"list":[{"pagePath":"index/index","iconPath":"image/icon_component.png",//写这里不行可以评论"selectedIconPath":"image/icon_component_HL.png",//写这里可以不行可以评论"text":"Component"//写在这里不行可以评论},{"pagePath":"index/index2","iconPath":"image/icon_API.png",//写在这里不行cancomment"selectedIconPath":"image/icon_API_HL.png",//写到这里可以评论"text":"Interface"//写到这里不行可以评论}]},回到自定义的custom-tab-bar/index.js,有如下代码:Component({data:{selected:0,//默认的下标颜色selecteditem:"#7A7E83",//默认item的字体颜色selectedColor:"#3cc51f",//selecteditem列表的字体颜色:[{pagePath:"/index/index",iconPath:"/image/icon_component.png",selectedIconPath:"/image/icon_component_HL.png",text:"组件"},{pagePath:“/index/index2”,iconPath:“/image/icon_API.png”,selectedIconPath:“/image/icon_API_HL.png”,文本:“接口”}]},附加(){},方法:{switchTab(e){constdata=e.currentTarget.datasetconsturl=data.pathwx.switchTab({url})//this.setData({注释掉这三行//selected:data.index//})}}})把this.setData()方法注释掉,因为跳转的标签页也会setData一次,避免重复设置数据造成的闪烁,继续往下看添加wepy框架中每个标签页生命周期展示的代码是显示方法。获取当前页面对象selected:0//每个标签页在配置的列表数组中有不同的下标,需要相应修改})}}不难发现,每次进入标签页,都会得到该标签页的bar对象当前页(tabbar对象在每个tab页不一样,是一个新的对象),然后setselected。所以把上面switchTab方法中的setData方法注释掉,因为重复了。菜单右上角的numberinfo实现并更新list数组中的属性infoNum(只添加需要的菜单项)。infoNum在wxml代码中有条件地呈现(仅当它有一个值并且大于0时)。在每个标签页的显示生命周期中获取信息编号后设置数据。this.$wxpage.getTabBar().setData({['list[1].infoNum']:infoNum//更新信息数})['list[1].infoNum']如何更新多层对象,对吧?我想投诉。相信很多同学也有这种根据登录的角色来控制菜单项的需求,根据登录的用户不同,看到的底部菜单也不同,比如:administrator。实现方法和info非常相似。将属性添加到列表数组。在wx:for循环中,根据list数组中的条件添加show和hide的className。登录后获取用户权限列表,确定显示或隐藏的项目。调用方法更新条形实例的数据。为了方便,可以在custom-tab-bar/index.jsmethods中创建一个方法,然后在每个tab页调用:this.$wxpage.getTabBar().yourFuncName(balabala),注意每个bar页,因为上面说到每个tabpagebar实例都是独立的。原生页面可以直接通过this.getTabBar()获取TabBar实例。由于篇幅有限,有些细节没有说完。如果您有任何需求,请发表评论或直接与我联系。如何使用echats图表插件在小程序中使用图表是一个很常见的需求。好在有比较成熟的echarts组件。使用方法很简单,按照官方文档按照规则按照官方链接进行配置即可,但是需要注意的地方:echarts.js原版比较大,小程序打包有大小限制.建议去echarts官网按需打包,需要写样式上面:ec-canvas{width:100%;height:100%;}3.在微信开发工具中预览echarts图表显示有问题,但在真机上并没有出现程序大小超出限制的情况。打开程序,拥有良好的用户体验。所以小程序的大小是有限制的(总共不超过20M,每包不超过2M),但是随着程序越来越复杂,页面越来越多,难免会超过限制。好在官方给出了分包方案。按照规则,官方链接简单的说就是主页面(tabbar关联的页面)先下载到客户端显示——主包的其他次级页面(详情页)可以在需要的时候下载显示.-可以有任意数量的分包,这样可以有效地控制每个包的大小。核心配置代码:app.js/app.wepypages:[//主要封装tabpages'pages/index','pages/bill','pages/mgMenu','pages/my',],subPackages:[{//分包配置是一个代表多个根的数组,可以添加:'subPackage1',//subPackage1是分包目录的名字,你可以选择你想要的名字pages:["pages/login",//login"pages/billDetail",//账单明细"pages/shopDetail",//商品申请]}],注意:每次添加新页面时,页面路径都要添加到对应包的页面中小程序的大小,项目中的静态文件比如(开源的js、字体、图片、视频)等都可以丢到CDN上,一方面减小包体积,另一方面增加阅读速度。CDN可以是付费的,比如阿里,也可以是免费的CDN,比如BootCDN、jsdelivr(国内最近慎用)、unpkg国内版等,有兴趣的我会单独写一篇关于CDN免费的文章。如何使用vantUI组件在当前快速迭代的趋势下,UI库非常重要。我个人喜欢开源的vantUI。当然其他的UI库也很好,看个人喜好。遵循规则,下面分享官方链接,分享我使用vant组件的一些心得:我选择下载编译好的组件代码,将项目需要哪些组件复制到自己的组件中。单击此处使用此方法。有一个缺点,就是如果使用的组件依赖于其他组件,则需要将它们一起复制。依赖组件可以在component/index.json中看到。例如组件的index.json如下:{"component":true,"usingComponents":{"van-icon":"../icon/index","van-loading":"../loading/index"}}可以看到组件还依赖于组件。这时候我们把组件也复制到自己的components目录下即可。2、在页面中使用前需要在usingComponents中配置,配置时的路径为相对位置。import中不能以@的形式使用,必须用于查找路径。usingComponents:{"van-action-sheet":"../components/lib/action-sheet/index","van-toast":"../components/lib/toast/index","van-picker":"../components/lib/picker/index","van-popup":"../components/lib/popup/index","van-search":"../components/lib/search/index"},Popup弹出窗口防止页面滚动的方法当我们使用Popup弹出层弹出时间选择器,或者picker等时,此时滚动弹出层的内容时,内容底部主页的也会滑动,影响用户操作。我们可以用包裹主要内容。默认的scroll-y="true"是在我们显示弹出层的时候设置的。属性scroll-y="{{false}}"。可以通过变量控制:在弹出层显示或隐藏时设置noScroll为true或''(空字符串)。请注意,“false”的字符串布尔值实际上是true。另外,如果页面本身只有一屏内容,不需要滚动,可以通过页面config设置disableScroll:false如何通过内部软件的审核企业内部的大部分软件都是进入的程序必须登录才能继续使用,但不符合小程序官方设计规范。以前我们公司进入页面后直接跳转到登录页面,但是审核不通过。如果你的页面不是那么机密,可以默认显示首页和菜单,但数据留空。关键地方提示登录后可以看到。我公司小程序访客模式如下:如果您的软件属于高度机密,您必须授权用户登录。您可以在发起审核时向审核者提供体验账号,并注明该软件仅为企业版内容使用。自定义头部并滑动到顶部自定义头部也是一个比较常见的需求,下面介绍我是如何实现页面配置设置navigationStyle:Addcodeto'custom'wxml我是页面标题cus-head:自定义头部块固定布局。head-title:title固定布局,保证z-index在cus-head之上,top值必须和capsule一样,line-height和capsuleheight一样。下面是获取胶囊的api:constres=wx.getMenuButtonBoundingClientRect()console.log(res.height)//获取胶囊的高度console.log(res.top)//获取top值capsulecusHead:自定义head,height要保证大于capsule的高度,可以根据自己的需要调整。showCusHead:控制显示和隐藏,滚动到一定程度时显示,滚动回到顶部时隐藏,添加滚动监听函数scroll(e){//滚动时触发wepy框架原生使用setData方法consttop=e.细节.scrollTop;if(top>=10){this.showCusHead=true;}else{this.showCusHead=false;}this.$apply();},如何实现自动更新,自动更新的手动更新替代方案在app.wpy或者app.js生命周期show/onLaunch中添加如下代码。你可以把它写成一个函数并直接调用它。完整代码参考://获取兼容的小程序更新机制if(wx.canIUse('getUpdateManager')){constupdateManager=wx.getUpdateManager()//1.检测小程序是否有新版本updateManager.onCheckForUpdate(function(res){//请求新版本信息后回调if(res.hasUpdate){//2.如果小程序有新版本,下载静默更新新版本并准备更新res){if(res.confirm){//3.新版本已经下载,调用applyUpdate应用新版本并重启updateManager.applyUpdate()}elseif(res.cancel){//如果是强制更新需要,会给出二次弹窗,如果没有,可以删掉这里的代码正常访问~',成功:function(res){self.autoUpdate()返回;//第二次提示后,强制更新if(res.confirm){//新版本已下载,调用applyUpdate应用新版本并重启updateManager.applyUpdate()}elseif(res.cancel){//返回版本更新提示self.autoUpdate()}}})}}})})updateManager.onUpdateFailed(function(){//新版本下载失败wx.showModal({title:'更新提醒',content:'新版本上线~请删除当前小程序和tryagainSearchopen',})})}})#}else{//如果想让用户在最新版本的客户端上体验你的小程序,可以这样提示wx.showModal({title:'Prompt',content:'当前微信版本太低,无法使用该功能,请升级到最新微信版本再试'})}备用更新方案在个人中心等小程序页面,添加版本number,给版本号添加点击事件,点击再次调用上述方法进行手动更新。其他一些wepy框架必须在设置数据后手动调用this.$appplay()视图来更新。对使用vue的同学很不友好。他们经常忘记写,视图没有更新。我认为有一个错误。wepy方法不能通过this.funname访问如果想直接使用this.funname访问,需要写在最外层(和生命周期同级)。如果坚持直接调用,可以使用this.methods.funcName.call(this)newDate在iOS系统上会报错问题在iOS系统上,newDate('2021-1-112:00:00')无法通过连接字符串识别,可以用.replace(/\-/g,'/')'/'解决。小程序的名称可能违反规则。小程序上线时的名字很重要。名字在一定程度上是一个引流的工具,但是小程序的官方名字有非常严格的规定。强行下架。我们公司拿了“电费单”这个词,然后要求改名,因为这个词是政府性质的,不能给私人公司用。感谢官方链接由于是第一次写这种技术文章,还有很多不足之处。感谢您阅读到最后。如果这篇文章对你有帮助,请不要忘记给我点赞和评论。