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

一、防抖与节流

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

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

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

可以通过参考lodash官方文档( Lodash 简介 | Lodash 中文文档 | Lodash 中文网 )来查看它们的使用

 <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

防抖与节流

请求次数优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三年ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值