【发布时间】:2021-08-01 02:00:20
【问题描述】:
在用户选择了一个值之后触发函数的最佳方式是什么。例如,用户快速单击数字 10,然后停止,然后触发包含该值的函数。可能类似于控制台日志。 debounce 是正确的方法吗?我在逻辑上遇到了一些问题,非常感谢您的帮助。
在下面的代码中,我可以让addToCart 函数在多次点击后只触发一次,这正是我想要的。但是amount 已经过时了。在代码中,您可以看到amount 可能会发生变化,例如cartAmount 有值时。但是,在去抖动时,它只会将 amount 的值视为 1
这是我的代码
const QuantitySelectorComponent = (props) => {
const {
cartAmount,
} = props;
const [amount, setAmount] = useState(1);
useEffect(() => {
if (cartAmount) {
setAmount(cartAmount);
}
}, [cartAmount]);
const increment = useMemo(() => debounce(() => {
setAmount(amount => amount + 1);
addToCart(amount)
}, 2000), [addToCart]);
const decrement = useMemo(() => debounce(() => {
setAmount(amount => amount - 1);
addToCart(amount)
}, 2000), [addToCart]);
return(
<StyledQuantityWrapper>
<StyledQuantityButton disabled={ amount <= 0 }
onClick={decrement} >
—
</StyledQuantityButton>
<StyledQuantityInput onFocus={onFocus} onBlur={onBlur} className="quantity-input__screen" type="number" value={ amount } />
<StyledQuantityButton disabled={ amount <= 0 }
onClick={increment} >
+
</StyledQuantityButton>
</StyledQuantityWrapper>
)
}
导出默认的QuantitySelectorComponent;
【问题讨论】:
-
你的意思是当用户快速点击 10 次然后记录第 10 次而不是 10 次?就像用户在特定时间后点击然后记录每次点击一样?
-
当然,消除“onChange”回调似乎是合乎逻辑的。如果您要求“X 的最佳方式”,那么我建议您重新措辞,以使其更加客观(相对于主观,即固执己见)。
-
点击一个数字,在本例中为 10。然后触发一个函数,对该数字执行某些操作。我正在构建一个数量选择器,在用户完成选择数字后添加到购物车。现在,每次点击都会触发。这电话太多了。我希望有一个功能在用户完成选择时触发。我以前从未使用过 debounce,现在遇到了一些问题
-
您能否分享一个代码示例在您的问题中,您尝试在函数调用中使用去抖动实用程序?有些库(即 lodash)具有去抖动功能,或者您可以推出自己的简单版本。
-
嗨,是的,很抱歉。我添加了自己的代码并试图澄清情况。我正在使用 lodash 的 debounce
标签: javascript reactjs react-hooks