问题描述
我有一个表单组件,我想在输入时执行一个API请求。我想对此进行反跳,这样我就不会向服务器发送垃圾邮件。这是我的代码:
export default function MyItem ({ id,name }) {
const debouncePatch = (name) => {
debounce(patchItem.bind(this,id,name),500)
}
return (
<div>
<form
type='text'
value={name}
onChange={(evt) => debouncePatch(evt.target.value)}
/>
</div>
)
}
修补程序项对服务器进行了简单的修补程序调用,以便该项的名称在我输入时更新。看起来像这样:
export default function patchItem (id,name,) {
return axios.patch(`${MY_BASE_URL}/${id}`,{ name })
}
使用反跳功能根本无法正常工作。永远不会调用patchItem
函数。我该如何解决?
解决方法
您每次对debounce
进行更改时都会调用input
,但是每次都会创建一个新的去抖动功能。您需要创建一个防反跳功能,然后将其用作事件处理程序。像这样:
function MyItem({ id,name }) {
let debouncePatch = debounce((id,name) => {
patchItem(id,name);
},500);
// OR SIMPLER
let debouncePatch = _.debounce(patchItem,500);
return (
<div>
<input
type="text"
defaultValue={name}
onChange={(event) => debouncePatch(id,event.target.value)}
/>
</div>
);
}
还要确保输入得到的是defaultValue
而不是value
,以便可以对其进行编辑。
这里有2个问题。首先,对返回函数进行反跳操作,因此您需要调用该函数。
第二,如果您不记住去抖动功能,那么它将无法正常工作,因为每次重新渲染都会创建一个新的去抖动功能,因此无法达到去抖动的目的。
尝试这样的事情:
&global
,
使您的输入可控, 并且您可以使用简单的工具 use-debounce
import { useDebounce } from 'use-debounce';
export default function MyItem ({ id,name }) {
const [value,setValue] = useState('')
const [debouncedValue] = useDebounce(value,1000);
const handleChange = useCallback((e) => {setValue(e.target.value)},[])
useEffect(() => {
console.log(debouncedValue);
*// here you can place any code what you need. **console.log** will be displayed every second,or any time that you may change in hook above.*
},[debouncedValue])
return (
<div>
<form
type='text'
value={name}
onChange={handleChange}
/>
</div>
)
}
ps。您不必一定在示例中使用bind。而且我不确定您可以将onChange事件应用于表单