每日技术总结:filter(),Bscroll
前言:
这是一个vue的电商项目,使用express后端提供数据。
1.filter()函数。
事情是这样的。我从数据库拿到了所有分类数据。
分类有三个等级。父类,子类,孙类这样。但它们都在同一张表里。
表是这样的:
我要把这样的表数据变成适合前端使用的数据结构。关键在于parent_id,通过parent_id来衔接上下级关系。
我想了很久,尝试了很多次,才想到一个比较合理的解决办法。
vue,数据,代码如下:
data () {
return {
categoryData: [
{
cat_id: '',
cat_name: '',
cat_logo: '',
children: [
{
cat_id: '',
cat_name: '',
cat_logo: '',
parent_id: '',
children: [
{
cat_id: '',
cat_name: '',
cat_logo: '',
parent_id: ''
}
]
}
]
}
]
}
},
获取接口数据并处理,代码如下:
created() {
this.$ajax.get('http://localhost:3000/category/').then((res) => {
const data = res.data
// 过滤出一级分类
let levelOne = data.filter((item) => {
return item.level === '1'
})
// 过滤出二级分类
levelOne.forEach((e) => {
let levelTwo = data.filter((item) => {
return item.parent_id === e.cat_id
})
e.children = levelTwo
levelTwo.forEach((f) => {
let levelThree = data.filter((item) => {
return item.parent_id === f.cat_id
})
f.children = levelThree
})
})
this.categoryData = levelOne
}).catch(function (error) {
console.log(error)
})
},
刚开始循环数组用的是for循环,一长串的代码,想想实在太low了。于是尝试了forEach()加filter()。
两个forEach(),三个filter()完美实现了三级分类的上下级关系的组织。ou耶!
2.better-scroll
今天遇到的最多的问题是better-scroll
不止第三次使用better-scroll了,每次的坑也都差不多,但为什么每次都掉进去。。。我得好好反思一下
今天的需求是这样的,我要做一个分类,左边是一级菜单,右边是二级和三级菜单。点击一级菜单,右边的容器内容切换成相应的内容。
在vue项目中使用better-scroll 问题总结:
(1)首先,稳妥起见,在dom数据渲染完毕再去初始化better scroll
this.$nextTick(() => {
this.rights = new BScroll(this.$refs.right, {
click: true
})
})
(2)数据(dom)更新后,better-scroll需要使用refresh()重载,查看手册:http://ustbhuangyi.github.io/better-scroll/doc/zh-hans/api.html#refresh
this.$nextTick(() => {
this.rights.refresh()
}
(3)每次点击一级菜单,我发现二三级菜单内容的显示位置都不对,它貌似还停留在上一次的滚动位置。我得让它回到顶部,重新开始。
只要使用scrollToElement()方法,查看手册:http://ustbhuangyi.github.io/better-scroll/doc/zh-hans/api.html#scrolltoelementel-time-offsetx-offsety-easing
代码如下:
this.$nextTick(() => {
this.rights.refresh()
this.rights.scrollToElement(this.$refs.right, 300)
})
(4)最后遇到一个重量级问题。某个分类下面内容高度足够的,但滚动的效果却没有。哦不,有时候有,有时候没有。
举例说明:
当上一个点击的分类内容没有足够高度,并且没有触发滚动效果(这是没问题的,因为高度不够是不会触发滚动的),然后却导致了当前这个有足够高度的内容依然无法滚动。(说起来很绕,不知道有没有人能听懂)。
当上一个点击的分类有足够高度,并正常触发了滚动效果,那么当前这个也是可以的。
我查了很多别人的答案,有人说是没有重载,refresh(),这个可以排除,因为我确实重载过了。
有人说是图片没有加载完成,导致高度计算不准确。我一看图片俩字,我就跳过了。绕来绕去,找不到答案。最后处于无奈,死马当活马医,去尝试了一下这个方法。诶,竟然……
请看代码:
updated() {
// 高度问题
let img = this.$refs.right.getElementsByTagName('img')
let count = 0
let length = img.length
if (length) {
let timer = setInterval(() => {
if (count === length) {
this.rights.refresh()
clearInterval(timer)
} else if (img[count].complete) {
count++
}
}, 100)
}
}
竟然真是这个原因,233333
参考文章:解决better-scroll因为图片没有下载完导致滚动条高度不够
Better-scroll 中文手册: http://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll%20%E6%98%AF%E4%BB%80%E4%B9%88
每日技术总结:filter(),Bscroll的更多相关文章
- 每日技术总结:Better-scroll应用于弹出层内容滚动
一.Better-scroll在项目中的应用 Better-scroll这款滚动插件还是很好用的,通常不会有什么问题.但偶尔总会出点意外.今天再次使用better-scroll,记录一下这次顺利的过程 ...
- 每日技术总结:Toast组件,eslint,white-space,animate,$emit
1.一个优雅的提示是网站必不可少的. 请参考:vue2.0 自定义 提示框(Toast)组件 2.ESLint使用总结 (1)在.eslintrc.js里关闭某条规则, '规则名': 'off'或0 ...
- 每日技术总结:encodeURI,encodeURIComponent,toFixed
1. encodeURI(URIstring) encodeURI()函数可把字符串作为URI进行编码 encodeURI("http://www.w3school.com.cn" ...
- 每日技术总结:fly.js,个位数前补零等
01.FLY.JS 文档:https://wendux.github.io/dist/#/doc/flyio/readme 02.微信小程序组件——input属性之cursor-spacing 属性 ...
- 每日技术总结:Yarn和Npm大PK
今天想用npm安装vue-cli@2.9 npm install --global vue-cli@2.9 卡半天,安装不成功,清空缓存,换taobao源重来,还是一样. 无奈之下换yarn yarn ...
- 每日技术总结:setx,
1.setx命令设置环境变量 设置用户环境变量: setx NAME "XXX" 设置系统环境变量: setx NAME "XXX" /m
- 每日技术总结:jquery datetimepicker,微博QQ好友QQ空间微信等分享接口
前言: 1.jquery datetimepicker 今天遇到一个日期控件格式的问题,默认选中显示的并不是设定的值,而是当天的日期.于是去查了一遍文档. 参考文章:jquery datetimepi ...
- 每日技术总结:setInterval,setTimeout,文本溢出,小程序,wepy
前言: 项目背景:vue,电商,商品详情页 1.倒计时,倒计到0秒时停止 data () { return { n: 10 } }, created () { let int = setInterva ...
- 每日技术总结:vue router传参方式,js获取设备高度
今天貌似没什么问题,23333…… 1.vue router 路由传参的方式 应用情景:从分类页(category.vue)进入商品列表页(list.vue),需要传递商品分类id(catId),商品 ...
随机推荐
- Android webview 运行时不调用系统自带浏览器
WebView mobView = new WebView(this); mobView.loadUrl("http://www.csdn.net"); WebSettings w ...
- java好文章链接
❀Java内存分配全面浅析:http://blog.csdn.net/yangyuankp/article/details/7651251 ❀自定义控件进阶篇1:http://mp.weixin.qq ...
- 多行文本溢出显示...的方法(-webkit-line-clamp)
限制在一个块元素显示的文本的行数. -webkit-line-clamp 是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中. 为了实现该 ...
- celery work logging 问题
celery 的日志里只输出日志 不输入标准打印
- BZOJ——T 1355: [Baltic2009]Radio Transmission
http://www.lydsy.com/JudgeOnline/problem.php?id=1355 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- 洛谷 P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...
- jquery表格简单插件
1.一直对jquery插件感觉非常神奇.今天动手写了一个超级简单的案例. 2.效果 3.体会 a.jquery插件编写能力. 须要具备一定js能力的编写.还有写css样式的运用:希望以后这方面会有提高 ...
- BOM 请给javascript一个说法-------Day33
楼市低迷,业主是不是该要个说法.黄金暴跌,谁来给大妈们一个说法.中国足球,敢不敢给大家一个说法. 给个说法,谁给,给谁,这该是哲学的范畴了吧. 可是,在这里.BOM是真真切切的给javascript一 ...
- 利用js 获取本日 本周 本月时间代码
function showToDay() { var Nowdate=new Date(); M=Number(Nowdate.getMonth())+1 alert(Nowdate.getMonth ...
- Objective-C基础笔记(9)Foundation常用类NSArray
NSArray用来存储对象的有序列表,它是不可变的 NSArray不能存储C语言中的基本数据类型,如int.float.enum.struct,也不能存储nil,nil代表数组元素的结束 // // ...