gpt4 book ai didi

javascript - 如何在 'lodash' 函数(去抖动)回调函数中传递参数?

转载 作者:行者123 更新时间:2023-11-30 20:21:46 25 4
gpt4 key购买 nike

我一直在制作一个具有两个事件的组件 (react.js):onClick 事件和 onDoubleClick 事件。

根据 W3C 的 DOM 规范,无法区分单击事件和导致 dblclick 事件的单击事件。

所以我一直在制作一个具有条件语句的事件。

这是我的内部类组件的功能代码。

    handleClick = (e) => {
if(!this._delayedClick) {
this._delayedClick = _.debounce(this.onChangeTargetLabel, 200)
}
if(this.clickedOnce) {
this._delayedClick.cancel()
this.clickedOnce = false
this.editLabel()
console.log('doubleClick')
} else {
this._delayedClick(e)
this.clickedOnce = true
console.log('Click')
}
}

onChangeTargetLabel = (e) => { // click label event
console.log(e)
this.clickedOnce = undefined
const { label } = this.props
label.onChangeTargetLabel(e.target.value)
}

editLabel = () => { // doubleClick label event
const { label } = this.props
label.editLabel()
}

这段代码的问题在于,一旦执行了handleClick函数,200ms后,执行了debounce回调函数,而回调函数function(this.onChangeTargetLabel)没有任何参数。

我想绑定(bind)handleClicks 参数和this.onChangeTargetlabel 的参数。

我该怎么做?谢谢。

最佳答案

异步使用事件不是一个好主意,因此您可以在 handleClick 函数中取出 value 并将其提供给 onChangeTargetLabel 相反。

handleClick = e => {
if (!this._delayedClick) {
const { value } = event.target;
this._delayedClick = _.debounce(this.onChangeTargetLabel.bind(this, value), 200);
}

// ...
};

onChangeTargetLabel = value => {
this.clickedOnce = undefined;
label.onChangeTargetLabel(value);
};

如果您愿意,您也可以使用 setTimeout 而不是去抖函数:

class App extends React.Component {
timeout = null;

onClick = event => {
if (this.timeout) {
console.log("Double click!");
clearTimeout(this.timeout);
this.timeout = null;
} else {
console.log("click");
this.timeout = setTimeout(() => {
this.timeout = null;
}, 200);
}
};

render() {
return <button onClick={this.onClick}>Click me</button>;
}
}

关于javascript - 如何在 'lodash' 函数(去抖动)回调函数中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com