vueでのジッタ防止関数コンポーネントの使用
15452 ワード
初級
1、手ブレ防止関数を書く
2、そして使用するセットに
3、コンポーネントメソッドでの使用
template:
上級
上の書き方で問題は解決していますが、なんだか見栄えがしません.ネットで検索してみると、ある兄たちがブレ防止を一つのコンポーネントにパッケージしているのを見て、やはり私が思ったのと同じです.しかし、この兄弟たちは直接コンテキストをパラメータとして伝達し、私がインスタンス全体を伝達するよりも上手で、私はこの基礎の上でimmediateの機能を追加し、デフォルトのeventパラメータを伝達しない場合の処理を追加しました.
debounce.jsファイル:
使用方法:
1、debounce.jsファイルの導入
2、テンプレートに使う.ここでtimeは必須パラメータです.eventパラメータとimmediateパラメータはオプションです.コンポーネントの下に複数のイベントバインドがある場合、eventはジッタ防止処理が必要なイベントをカスタマイズできます.すぐに実行する必要がある場合は、immediateパラメータをtrueに設定できます.
これでDebounceコンポーネントのパッケージが完成しました.
参照先:
最後にこの兄たちの原帖を添付します.https://juejin.im/post/5c2dc7a9e51d4573c8491e77
1、手ブレ防止関数を書く
/**
* @desc
* @param { } func
* @param { } wait
* @param { } immediate
*/
export function debounce(func, wait, immediate) {
let timeout
return function(...args) {
let context = this
if (timeout) clearTimeout(timeout)
if (immediate) {
let callNow = !timeout
timeout = setTimeout(function() {
timeout = null
}, wait)
if (callNow) func.apply(context, args)
} else {
timeout = setTimeout(function() {
func.apply(context, args)
}, wait)
}
}
}
2、そして使用するセットに
import
が入ってくるimport { debounce } from 'xxx'
export default {
data: {
return {
vm: this
}
},
methods: {
toDoSth: debounce((vm) => {
//
// 、
// , , 。
},
500,
true
)
}
}
3、コンポーネントメソッドでの使用
template:
<div @click="toDoSth(vm)">div>
上級
上の書き方で問題は解決していますが、なんだか見栄えがしません.ネットで検索してみると、ある兄たちがブレ防止を一つのコンポーネントにパッケージしているのを見て、やはり私が思ったのと同じです.しかし、この兄弟たちは直接コンテキストをパラメータとして伝達し、私がインスタンス全体を伝達するよりも上手で、私はこの基礎の上でimmediateの機能を追加し、デフォルトのeventパラメータを伝達しない場合の処理を追加しました.
debounce.jsファイル:
import Vue from 'vue'
const debounce = (func, time, ctx, immediate) => {
let timer
const rtn = (...params) => {
clearTimeout(timer)
if (immediate) {
let callNow = !timer
timer = setTimeout(() => {
timer = null
}, time)
if (callNow) func.apply(ctx, params)
} else {
timer = setTimeout(() => {
func.apply(ctx, params)
}, time)
}
}
return rtn
}
Vue.component('Debounce', {
abstract: true,
props: ['time', 'events', 'immediate'],
created() {
this.eventKeys = this.events && this.events.split(',')
},
render() {
const vnode = this.$slots.default[0]
// events,
if (!this.eventKeys) {
this.eventKeys = Object.keys(vnode.data.on)
}
this.eventKeys.forEach(key => {
vnode.data.on[key] = debounce(
vnode.data.on[key],
this.time,
vnode,
this.immediate
)
})
return vnode
}
})
使用方法:
1、debounce.jsファイルの導入
import 'xxx/debounce.js'
export default {
methods: {
toDoSth(e) {
//
}
}
}
2、テンプレートに使う.ここでtimeは必須パラメータです.eventパラメータとimmediateパラメータはオプションです.コンポーネントの下に複数のイベントバインドがある場合、eventはジッタ防止処理が必要なイベントをカスタマイズできます.すぐに実行する必要がある場合は、immediateパラメータをtrueに設定できます.
<Debounce :time="500" event="click" :immediate="true">
<button @click="toDoSth($event, 1)">click me</button>
</Debounce>
これでDebounceコンポーネントのパッケージが完成しました.
参照先:
最後にこの兄たちの原帖を添付します.https://juejin.im/post/5c2dc7a9e51d4573c8491e77