小程序开发汇总

888 阅读4分钟

技术选型

uniapp + vant weapp

uniapp有更强的扩展性,如果以后需要扩展H5端、app端或者扩展微信以外的其他小程序,uniapp都可以快速的打包出来;uniapp对微信的api支持也很全面,其技术社区也相对成熟,在社区提出问题也能更及时的得到回复。

选型weapp是因为vant系的ui控件比较稳定,ui涵盖的功能也比较全面,其团队对bug修复也比较及时,提出issue也能相对及时的得到回复,以最大程度的的减少开发成本。

在h5运行vant-weapp

由于小程序组件缺少了部分依赖文件,需要下载目录下的文件,拷贝到wxcommponents/vant目录下,覆盖老的几个目录,再次编译

无法获取openid

在生产环境无法获取openid的问题:

报错console.png 在开发环境下,默认是不校验合法域名的,在生产环境下必会校验合法域名(如图配置)

配置截图.jpg 所以我们需要根据报错信息配置合法域名才可以,但是。。。

后台配置.jpg 好吧,去看下文档怎么说:

文档说明.png 所以,前端不能保存AppSecret,也就是不能在前端直接通过路径拼接的形式获取openid

前端获取openid.jpg 结论:通过后端配置appid、AppSecret获取openid。

uniapp数据存取

uniapp数据存储

uni.setStorage({
   key: 'nickName',
   data: this.userInfo.nickName
})

uniapp数据读取

uni.getStorageSync('openid')
或
uni.getStorage({
    key:'avatarUrl',
    success(e) {
        self.avatarUrl = e.data
    }
})

van-field无法实现双向数据绑定

van-field无法实现双向数据绑定,可使用blur替代实现,如此,在提交时建议加一些延时,避免在数据绑定之前提交引起报错

<van-field label="联系人姓名" :value="name" @blur="handleFieldChange" data-fieldName="name" placeholder="请输入联系人姓名" /> // 输入绑定
handleFieldChange(e) {
    let fieldName = e.currentTarget.dataset.fieldname
    this[fieldName] = e.detail.value
}

textarea层级问题

textarea为微信小程序原生组件,其层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上,具体表现为textarea的placeholder与其内部的文本会穿透弹框

文本穿透.jpg

placeholder穿透.jpg 解决方法1:

使用小程序cover-view标签代替view标签解决(由于我使用的是vant weapp,cover-view无法嵌套进其内部组件,于是有了方法2)

解决方法2:

弹框弹出时type置为text,关闭时置为textarea,无效,需要后续调试

解决方法3:

写一个固定的文本view,可通过是否显示弹框,使用display控制textarea的显示隐藏(v-show在小程序端不可用),此方法会切换抖动,暂时无解。

<van-field label="备注描述" :class="{disN: fieldType === 'text'}" type="textarea" :value="project_remark" @blur="handleFieldChange" data-fieldName="project_remark" placeholder="请在此描述问题" autosize /> 
<view :class="[{disN: fieldType === 'textarea'}, 'discWrapper']">
    <text class="label">备注描述</text>
    <view class="textarea">{{project_remark}}</view> 
</view>

文件上传、下载失败

需要配置上传、下载域名

上传下载域名配置.jpg

其他

分页控件:uniapp使用mescroll-uni,不能使用mescroll-body,不然无法触发翻页函数

微信小程序获取用户授权需要一个按钮依托才可以弹出授权弹窗(wx.getUserInfo已废弃)

生命周期钩子无法在组件内触发,需要在其父组件触发钩子函数

小程序没有路由守卫的功能

小程序访问接口务必配置https域名

小程序没有document对象

v-show在小程序端不可用

路由跳转

uni.navigateTo({
    url: '/page/home/index'
}) // 路由跳转必须使用绝对路径才能跳转

编译报错: Error: Module build failed (from <./node_modules/@dcloudio/webpack-uni-pages-loader/lib/index.js):> 解决办法:清除缓存

截图.png

pages配置页面后,模拟器显示空白页:

在编译器(webstorm)ctrl+c关闭项目,npm run dev:mp-weixin重启项目

所以,在新增page页后要双重启(重启编译器+微信开发工具重新打开此项目)

uniapp Vant Weapp使用van-dropdown 下拉菜单时,关闭后遮罩下面的盒子无法触发点击: 是 uni-app 底层的问题,可以将 @vant/weapp/dropdown-item/index.wxml 里面的 van-popup 的事件改成驼峰写法 afterEnter 和 afterLeave 就可以了

background-image不能使用本地图片,必须使用网络图片或base54,小程序使用网络图片不显示的问题:

小程序开发工具不报错,图片不显示(使用background-image和image标签都不可以)

于是想起vant有一个van-image标签可以打印出报错日志,因为它会把链接作为接口请求,于是分析日志:

图片bug.png 可以看到图片后边加上了#devtools_refererOrigin的字样

搜索可得是由于网站设置了防盗链(参考blog.csdn.net/fengnext/ar…

目下要解决的是防盗链的问题:

简单的处理方式是在图片的完整url前添加(images.weserv.nl/?url=

var newurl = images.weserv.nl/?url= + oldurl;

拼接地址后就可以正常使用了(前缀网站已经开源)

ps: Images.weserv.nl,是一个利用cloudflare的CDN,可缓存、直链Google Drive、OneDrive等图片的网站,同时,发布了了这样的源码,自己可以创建,用于图片存储等。支持IPv6。

直接在链接后面加上你的共享链接:images.weserv.nl/?url=你的图片链接

相关参数:images.weserv.nl/docs/

开源地址:github.com/weserv/imag…

另:前端设置no-referrer(待确认)

参考:blog.csdn.net/fengnext/ar…