Vue 2.x-手ぶれ防止と流れの例


utils:

//   
export const debounce = (func, wait = 3000, immediate = true) => {
 let timeout = null;
 return function() {
  let context = this;
  let args = arguments;
  if (timeout) clearTimeout(timeout);
  if (immediate) {
   var callNow = !timeout; //      true          false           
   timeout = setTimeout(() => {
    timeout = null;
   }, wait); //   ID
   if (callNow) func.apply(context, args);
  } else {
   timeout = setTimeout(function() {
    func.apply(context, args);
   }, wait);
  }
 };
};
//      
export const throttleTime = (fn, wait = 2000) => {
 var pre = Date.now();
 return function() {
  var context = this;
  var args = arguments;
  var now = Date.now();
  if (now - pre >= wait) {
   fn.apply(context, args);
   pre = Date.now();
  }
 };
};
//      
export const throttleSetTimeout = (fn, wait = 3000) => {
 var timer = null;
 return function() {
  var context = this;
  var args = arguments;
  if (!timer) {
   timer = setTimeout(function() {
    fn.apply(context, args);
    timer = null;
   }, wait);
  }
 };
};
vueで使用する:

<template>
 <div class="main">
  <p>      </p>
  <button @click="click1">  </button>

  <br />

  <p>       </p>
  <button @click="click2">  </button>

  <br />

  <p>       </p>
  <button @click="click3">  </button>

  <br />

  <p>       </p>
  <button @click="click4">  </button>
 </div>
</template>

<script>
import { debounce, throttleTime, throttleSetTimeout } from './utils';
export default {
 methods: {
  click1: debounce(
   function() {
    console.log('      ');
   },
   2000,
   true
  ),
  click2: debounce(
   function() {
    console.log('       ');
   },
   2000,
   false
  ),
  click3: throttleTime(function() {
   console.log('       ');
  }),
  click4: throttleSetTimeout(function() {
   console.log('       ');
  })
 },
};
</script>

<style scoped lang="scss">
* {
 margin: 0;
 font-size: 20px;
 user-select: none;
}
.main {
 position: absolute;
 left: 50%;
 transform: translateX(-50%);
 width: 500px;
}
button {
 margin-bottom: 100px;
}
</style>
説明:
手ブレ補正:
直ちにバージョンを実行します:immediateはtrueで、第1回をクリックして実行して、更にクリックして実行しないで、wait時間が終わった後に、更にクリックして発効して、つまり一回だけ実行します。
原理:
一回目はtimeoutIDが存在しないで、calNowをtrueとすると、すぐに目標コードを実行し、二回目をクリックした時にtimeoutIDが存在し、calNowをfalseとするので、目標コードを実行しないで、wait時間が終わったら、timeoutIDをnullに設定して、すぐに論理を実行し始める。
直ちに版を実行しません:immediateはfalseで、第1回をクリックして実行しないで、wait時間が終わった後に、やっと発効して、つまり何回をクリックしても最後のクリックイベントだけ実行します。
原理:
setTimeout遅延を使用してイベントを実行し、複数のトリガがある場合、前回実行したコードをclearTimeoutで計算を再開し、タイミング中にイベントをトリガしない場合、ターゲットコードを実行します。
スロットル:
連続トリガイベントの場合は、wait周波数でターゲットコードを実行します。
効果:

以上がVue 2.x-手ぶれ防止と節流の例を使った詳細な内容です。Vueの手ぶれ防止と節流に関する資料は他の関連記事に注目してください。