项目中一些有关优化、性能的问题

一、防抖与节流

正常:事件触发非常频繁,而且每一次的触发,回调函数都要去执行(如果时间很短,而回调函数内部有计算,那么很可能出现浏览器卡顿)

防抖(debounce):前面的所有的触发都被取消,最后一次执行在规定的时间之后才会触发,也就是说如果连续快速的触发,只会执行最后一次

节流(throttle):在规定的间隔时间范围内不会重复触发回调,只有大于这个时间间隔才会触发回调,把频繁触发变为少量触发

可以通过参考lodash官方文档( www.lodashjs.com/ )来查看它们的使用

 <li class="cart-list-con5">
            <a
              href="javascript:void(0)"
              class="mins"
              @click="handler('mins', -1, cart)"
              >-</a
            >
            <input
              autocomplete="off"
              type="text"
              minnum="1"
              class="itxt"
              :value="cart.skuNum"
              @change="handler('change', $event.target.value * 1, cart)"
            />
<!-- $event.target.value * 1  --> 如果是些 a * 1 不合理的数 * 1都会变为NaN
            <a
              href="javascript:void(0)"
              class="plus"
              @click="handler('add', 1, cart)"
              >+</a
            >
</li>
<script>
         //节流
handler: throttle(async function (type, disNum, cart) {
      /*
          type:为了区分是加是减还是直接变化
          disNum:+ 变化量(1) - 变化量(-1) input最终个数(不是变化量)
          cart:点击的是哪一个产品【身上有id】
        */
      switch (type) {
        case "add":
          disNum = 1;
          break;
        case "mins":
          //判断产品的个数大于1,才给服务器传递 -1
          //如果出现产品个数小于等于1,给服务器传递 0
          disNum = cart.skuNum > 1 ? -1 : 0;
          break;
        case "change":
          console.log(disNum);
          //用户如果输入的数据不合理,则给服务器传递0
          if (isNaN(disNum) || disNum < 0) {
            disNum = 0;
          } else {
            //考虑小数的情况
            disNum = parseInt(disNum) - cart.skuNum;
          }
          break;
      }
      //派发action
      try {
        await this.$store.dispatch("addToCart", {
          skuId: cart.skuId,
          skuNum: disNum,
        });
        //将有变动的数据再次整理发送请求
        this.getData();
      } catch (e) {
        alert(e.message);
      }
    }),
<script/>

复制代码

二、路由跳转与传递参数

开发的三级联动业务:

1:当你点击a标签的时候,会进行路由的跳转,将产品的名字与id传递给search模块—-(query) 2:点击搜索按钮的时候,用户输入进来的关键字,点击按钮的时候会通过params参数传递给search模块—–(params) 3:路由跳转(home->search),两个地方,三级联动(typeNav)、Header组件(搜索按钮)

第一种 声明式路由跳转(不推荐使用):

router-link是一个组件:相当于VueComponent类的实例对象,一瞬间 new VueComponent很多实例(1000+),很消耗内存,因此会导致卡顿

第二种编 程式导航跳转(也不推荐使用):

同样需要给每个跳转的DOM对象身上绑定一个事件,个数过多的时候,很消耗内存

第三种编 程式导航+事件委派+自定义属性(推荐!)

自定义属性如果不会使用,建议去查看官方文档说明

      /*
        最好的解决方法:编程式导航 + 事件委派 + 自定义属性
        一个问题:点击a标签的时候,才会进行路由跳转【但怎么确定点击的一定是a标签】
        另一个问题:即使能确定点击的是a标签,但怎么区分是一级、二级还是三级
      */
      //解决第一个问题:给字节点中的a标签加上自定义属性
      let element = e.target;
      //节点中有一个属性dataset,可以获取节点的自定义属性和属性值(都是小写)
      let { categoryname, category1id, category2id, category3id } =
        element.dataset;
      //如果标签上有categoryname的一定是a标签
      if (categoryname) {
        //将传递的参数存好
        let location = { name: "search" };
        let query = { categoryname };
        //一级、二级、三级分类判断
        if (category1id) {
          query.category1id = category1id;
        } else if (category2id) {
          query.category2id = category2id;
        } else {
          query.category3id = category3id;
        }
        location.query = query;
        //合并参数
        if(this.$route.params){
          location.params = this.$route.params
          this.$router.push(location)
        }
      }
复制代码

三、三级联动相关性能优化

1.为什么要优化TypeNav三级联动性能

项目:home切换到search或者search切换到home,你会发现一件事情,组件在频繁的向服务器发请求,来获取三级联动的数据进行展示。

项目中如果频繁的向服务器发请求,很耗性能的,因此咱们需要进行优化。

2.为什么会频繁的向服务器发请求获取三级联动的数据

因为路由跳转的时候,组件会进行销毁的,所以跳转一次,就相当于重新生成一个VueComponet实例,然后就会重新挂载,发送请求

3.解决办法

只需要发一次请求,获取到三级联动的数据即可,不需要多次。 最终解决方案:在App.vue中发送请求

mounted() {
    //派发一个action||获取商品分类的三级列表的数据
    this.$store.dispatch("getCategoryList");
  },
复制代码

4.项目性能优化手段

v-if|v-show选择 按需加载 lodash、ant 防抖与节流 请求次数优化

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享