Reactjs Lodash debounce TypeError:应为函数react

Reactjs Lodash debounce TypeError:应为函数react,reactjs,filter,lodash,debounce,debouncing,Reactjs,Filter,Lodash,Debounce,Debouncing,当我在数据表中键入和搜索某些内容时,我试图使用debounce函数来避免多次调用。我现在正在做的是输入 onChange={(e) => { const delayedQuery = useCallback(debounce(this.handleSearch(e.target.value), 500)); return delayedQuery }} 其中handsearch是 handleSearch(filter)

当我在数据表中键入和搜索某些内容时,我试图使用
debounce
函数来避免多次调用。我现在正在做的是输入

onChange={(e) => {
            const delayedQuery = useCallback(debounce(this.handleSearch(e.target.value), 500));
            return delayedQuery
          }}
其中
handsearch

handleSearch(filter) {
      service.getData(filter).subscribe((data) => {console.log(data)})
    }

但是我有一个错误
TypeError:需要一个函数
。服务正在运行,但debounce没有。它在我键入的同时一个字符一个字符地写入,这是不正确的。

不能在类组件或事件处理程序函数中使用挂钩,必须将函数传递给lodash debounce

还有,;如果尝试从事件异步读取
target.value
,则会出现错误

在聊天中,我假设您使用的是来自(promise)
的rxjs
,因此您仍然存在一个问题,即当用户键入并触发异步请求时,他们可能会以不同的顺序解决

请参阅下面一个不完整的示例(快速键入hai并等待2秒钟,它将解析为
ha

//简单的去盎司实现
常数衰减=(fn,延迟=50)=>{
让时间;
返回(…参数)=>{
clearTimeout(时间);
时间=设置超时(()=>fn(…args),延迟);
};
};
//您可以订阅的服务
常量服务=(()=>{
让侦听器=[];
const later=(值,时间=50)=>
新承诺((r)=>
//如果搜索长度为2个字符,它将在很久以后解析
设置超时(
()=>r(值),
value.length==2?2000:时间
)
);
//subscribe返回一个unsubscribe函数
const subScribe=(fn)=>{
推送(fn);
//返回订户对象
//https://rxjs-dev.firebaseapp.com/api/index/class/Subscriber
返回{
取消订阅:()=>
(listeners=listeners.filter(
(侦听器)=>侦听器!==fn
)),
};
};
//通知所有侦听器
const notify=(值)=>
forEach((listener)=>listener(value));
返回{
getData:(值)=>({
订阅:(fn)=>{
const unsub=订阅(fn);
稍后(值)。然后((值)=>通知(值));
遣返不明嫌犯;
},
}),
};
})();
类App扩展了React.PureComponent{
建造师(道具){
超级(道具);
this.state={asyncSearchResult:''};
//使用handleSearch创建其取消公告版本
this.handlesearchdebound=去盎司(
这是我的手感
).bind(this);//您需要将其绑定到正确的上下文
}
渲染=0;
handleSearch=(值)=>
服务
.getData(值)
.订阅((值)=>
this.setState({asyncSearchResult:value})
);
render(){
返回(
this.handleSearchDebound(e.target.value)
}
/>
异步结果:{this.state.asyncSearchResult}
);
}
}
ReactDOM.render(,document.getElementById('root'))


似乎
此.handleSearch(e.target.value)
不生成函数。应该吗?或者您应该将其转换为函数引用吗?handleSearch是我在输入时调用的函数,它实际使用新数据启动服务。不好吗?除了@VLAZ所说的之外,您将不能使用
React。在回调
debounce
中使用回调
debounce
将函数引用作为参数。但是,您提供的是
this.handleSearch(e.target.value)
——调用方法的结果。调用此特定方法的结果是
undefined
,因为您没有显式的
return
语句。因此,您需要更改
handleSearch
以返回函数,或者将该函数调用更改为回调。@End.Game您不能使用
useCallback
hook,因为您不能在类组件中使用任何挂钩。谢谢。我找到你了,现在我的代码运行良好。对不起,我是新来的。这是一个博士后@HMR告诉我如果我错了,如果我不使用bind(这个)handleSearch可以有这个未定义的,例如?我不知道后端实际上是怎样的。我在rendered=0;中有一个意外标记;。它可能吗?同样在handleSearch=(value)中,在=符号中。让我们来看看。