技术选型
uniapp有更强的扩展性,如果以后需要扩展H5端、app端或者扩展微信以外的其他小程序,uniapp都可以快速的打包出来;uniapp对微信的api支持也很全面,其技术社区也相对成熟,在社区提出问题也能更及时的得到回复。
选型weapp是因为vant系的ui控件比较稳定,ui涵盖的功能也比较全面,其团队对bug修复也比较及时,提出issue也能相对及时的得到回复,以最大程度的的减少开发成本。
在h5运行vant-weapp
由于小程序组件缺少了部分依赖文件,需要下载此目录下的文件,拷贝到wxcommponents/vant目录下,覆盖老的几个目录,再次编译
无法获取openid
在生产环境无法获取openid的问题:
在开发环境下,默认是不校验合法域名的,在生产环境下必会校验合法域名(如图配置)
所以我们需要根据报错信息配置合法域名才可以,但是。。。
好吧,去看下文档怎么说:
所以,前端不能保存AppSecret,也就是不能在前端直接通过路径拼接的形式获取openid
结论:通过后端配置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与其内部的文本会穿透弹框
解决方法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>
文件上传、下载失败
需要配置上传、下载域名
其他
分页控件: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):> 解决办法:清除缓存
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标签可以打印出报错日志,因为它会把链接作为接口请求,于是分析日志:
可以看到图片后边加上了#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=你的图片链接
另:前端设置no-referrer(待确认)