防抖节流

防抖

  解决页面中的搜索框频繁输入导致频繁发送请求损耗性能的问题;可以设置一个定时器,用下一次的执行来清除上一次的预执行。

clearTimeout(this.TimeId);
    this.TimeId = setTimeout(() => {
      // 4 拼接接口路径
      this.getGoodsBySearch(value);
    }, 1000);

节流

解决页面在触底后频繁发送请求导致损耗性能的问题。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    *{
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    body{
      height: 100vh;
      overflow: auto;
    }
    div{
      height: 50px;
      font-size: 20px;
      padding: 5px;
      /* border-bottom: 1px solid #000; */
      box-shadow: 0 1px 1px 1px red;
    }
  </style>
</head>
<body>
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
  <div>13</div>
  <div>14</div>
  <div>15</div>
  <div>16</div>
  <div>17</div>
  <div>18</div>
  <div>19</div>
  <div>20</div>
  <div>21</div>
  <div>22</div>
  <div>23</div>
  <div>24</div>
  <div>25</div>
  <div>26</div>
  <div>27</div>
  <div>28</div>
  <div>29</div>
  <div>30</div>
  <div>31</div>
  <div>32</div>
  <div>33</div>
  <div>34</div>
  <div>35</div>
  <div>36</div>
  <div>37</div>
  <div>38</div>
  <div>39</div>
  <div>40</div>
</body>
<script>

  // 是否在加载中
  let isLoadding=false;

  // 1 滚动条事件
  document.body.onscroll=function(){
    // 1 获取滚动条距离顶部的距离
    let scrollTop=document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
    // 2 如何判断 滚动条到了底部了 滚动条距离底部 50px 就触发行为 
    // 2.1 先算出来 整个div列表 高度
    let totalDivHeight=document.querySelector("div").clientHeight*document.querySelectorAll("div").length;
    // 2.2 先算出来 整个div列表比 body标签高多少
    let dis=totalDivHeight-document.body.clientHeight;
    // 2.3 当 滚动条距离底部 50px的时候就触发
    if(dis-scrollTop<=50){
      // console.log("触底啦!!!");
      // 发送异步请求的代码 
      // 判断请求是否在加载中
      if(isLoadding){
        // 什么都不做了。。
      }else{
        // 告诉别人 我们正在请求数据
        isLoadding=true;
        console.log("发送异步请求");
        // 异步请求成功了 再打开开关
        setTimeout(() => {
          console.log("数据请求成功");
          isLoadding=false;
        }, 3000);
      }
    }
    
  }
  
</script>
</html>

猜你喜欢

转载自www.cnblogs.com/sauronblog/p/11440882.html