做为一个二流前端也有段时间了,天天沉溺于项目功能代码不少积累到最后只成了模糊的印象。
很不巧,我这我的记性不太好。
不过有句话是这么说的,好记性不如烂笔头,在这个年代固然不须要烂笔头了,但道理是同样的,得有个地方作积累与沉淀,不管是之后翻看仍是分享都是能够拿出手的。css
废话说够了,那么,让一切的开始。
做为第一篇记录,也分享不了太多的东西,代码什么的就先不上了,最近在开发小程序,那就先记录一些在微信小程序的项目中踩过的坑。html
在绝大多数的状况下,小程序自带的底部Tabbar都能知足需求。但在此项目中须要根据页面来改变底部Tabbar内容与链接,尝试使用wx.setNavigationBarTitle(OBJECT),wx.setNavigationBarColor(OBJECT)等接口来对底部导航作设置,发现这两个接口并不能控制导航单项的显示隐藏。 结局方案:本身写底部。前端
随着iphonex的加入,市面上的长屏幕手机愈来愈多,而项目中对界面的设计每每是针对iphone6的1344px制做的,而在项目中单位统一使用了适应宽度的rpx,在大部分页面中会出现底部较长等问题,这个问题自己影响不大,但在活动页中底部过多的留白会形成较差的用户体验,可是盲目引入vh等适应高度会形成图片变形等问题。
最后的解决方案:获取手机的宽高比例后与设计稿的宽高比例作对应的计算,计算出冗余的高度,并将这些高度分配在元素的间距之中。react
在移动端的前端表单中,底部的输入框会被键盘顶上适应的距离,但这个距离是以输入框底部为基准的,在你的输入框有padding等样式时会出现较差的用户体验,特别在使用ui框架的cell之类的元素,会致使上移距离不够的问题。
最终解决方案:改写ui框架的cell,新增一个样式,让这个样式中的input框以高度占满整个cell列。css3
wx自带的动画接口功能不够完善,没法适应项目的循环动画等需求。
最终解决方案:本身写动画,并作相应的封装。项目制做中未封装成组件,遂写在util中。 若是可以支持,使用css3动画应该是最好的解决方案。web
单个,有结束的动画:
const animation=function (params, end, frame, speed,that, callback) {//参数自左到右分别为修改对象,结束值,刷新速度,刷新距离,回调函数,注意,end应能被speed整除
let clock2 = setInterval(() => {
let value;
for (let i in params) {
params[i] < end ? params[i] = params[i] + speed : params[i] = params[i] - speed;
value = params[i];
}
that.setData({
...params
})
if (value == end) {
clearInterval(clock2);
if (callback)
callback();
}
}, frame)
};
复制代码
循环动画 注意start应小于end
const animationload = function (params,start, end, frame, speed, that) {//参数自左到右分别为修改对象,最小值,最大值,刷新速度,刷新距离
let flag=true;
let value;
let clock2 = setInterval(() => {
if(flag){
for (let i in params) {
params[i] < end ? params[i] = params[i] + speed : params[i] = params[i] - speed;
value = params[i];
}
that.setData({
...params
})
if (value >= end) {
flag = !flag;
}
}
else{
for (let i in params) {
params[i] > start ?params[i] = params[i] - speed: params[i] = params[i] + speed;
value = params[i];
}
that.setData({
...params
})
if (value <= start) {
flag = !flag;
}
}
}, frame)
};
复制代码
小程序中加载本地图片的速度会很是慢。
解决方案:使用base64(代码太难看了,否决),后台架设图片服务,使用线上图片(虽然仍是有点慢)。小程序
程序中须要引入iconfont图片。
解决方案:小程序可以支持iconfont,甚至能够对此做出封装。但此项目中只是单纯的引入了小程序并未作封装。
将所需的icont图片库下载,拿出里面的iconfont.css以线上的地址替代头部,并对.iconfont作出相应的修改,重命名成.wxss的文件格式,放入util中再须要的css中以 @import "../../utils/iconFont.wxss"引入便可。微信小程序
ui框架层次不如原生组件,再使用中会出现原生组建覆盖再ui框架上的问题。
解决方案:弹出时隐藏一些组件或是干脆重写。react-native
小程序的scroll-view必需要设置高。
解决方案:经过微信api获取可视高度api
wx.getSystemInfo({
success: (res) => {
console.log(res.windowHeight);
this.setData({
height: res.windowHeight - 48,
pageHeight: res.windowHeight
})
}
});
复制代码
拆红包,预测,小游戏等涉及倒接口,setInterval的按钮不加防抖会出现严重的bug 解决方案:加入防抖机制
小程序的入口只有一个,可每每须要不一样参数来判断跳转的页面。
解决方案:再首页加入一个loading页面判断完毕后跳转倒各自的页面。
小程序没法像react-native那样再navigator中附带对象等参数。
解决方案:使用app等全局变量。
小程序的全局变量wx.setStorage()后产生的缓存不会由于小程序的删除而清除。
解决方案:使用api中的wx.clearStorage()来清楚缓存。
getList(params) {
console.log(params)
getPageList(params)
.then(res => {
console.log(res.data.data.data)
const data = res.data.data.data.map((item, key) => {
return {
...item,
modifyTime: moment(item.endTime).format('YYYY.MM.DD'),
// department_name: item.projectDockingDeaprtmentList.map(item => item.department_name).join(' ')
departmentsinfo: item.departments.map(item=>(`@${item.departmentName}`)).join(' ')||'@All',
};
});
// 按照页面赋值
if (this.pageNo === 1) {
this.setData({
dashboard: data
});
} else {
this.setData({
dashboard: this.data.dashboard.concat(data)
});
}
this.setData({
loadStateType: 'text',
loadStateText: '上拉加载更多',
});
if (data.length < this.data.params.pageSize) {
this.setData({
loadStateType: 'text',
loadStateText: '暂无更多数据',
});
}
})
},
复制代码
微信的wx.getUserInfo是没法获取倒用户的微信号的,只能获取倒用户的openid
解决方案:能够经过wx.getUserInfo接口中是否能获取UnionID来判断
本项目中未使用组件化的思路,须要改进。
解决方案:微信小程序组件化
后台接口域名必须谁用https,而且在微信平台中作过设置。
上线能够选择关闭不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书这个选项
以上是我的在项目中的一些经历,可能观念有误欢迎指正,随着开发的进行研究的深刻会继续补充修正,感谢各位大佬的阅读。