• 每日技术总结: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

  • 相关阅读:
    【转】使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法
    配置Linux系统ssh免密登录
    numpy的随机数组
    numpy.where和numpy.piecewise的用法
    numpy、pandas学习笔记
    数据库行存储和列存储的区别
    pandas对DataFrame对象的基本操作
    pandas中assign方法的使用
    numpy实现快速傅里叶变换
    最小二乘法在线性拟合中的使用
  • 原文地址:https://www.cnblogs.com/cathy1024/p/10234676.html
Copyright © 2020-2023  润新知