Reactjs 更改输入状态延迟一个字符(useState挂钩)
我正在尝试在我的社交网络中实现对用户配置文件的即时搜索。它似乎在工作,但对输入更改设置状态(使用挂钩)会导致延迟一个字符 我研究了一下,发现这个状态延迟问题可以通过在setState中使用回调函数来解决。但是,useState不支持这一点 这是我的输入元素:Reactjs 更改输入状态延迟一个字符(useState挂钩),reactjs,input,state,react-hooks,Reactjs,Input,State,React Hooks,我正在尝试在我的社交网络中实现对用户配置文件的即时搜索。它似乎在工作,但对输入更改设置状态(使用挂钩)会导致延迟一个字符 我研究了一下,发现这个状态延迟问题可以通过在setState中使用回调函数来解决。但是,useState不支持这一点 这是我的输入元素: <input type="text" placeholder="Enter your query" name="query" onChange={e => onChange(e)} />
<input
type="text"
placeholder="Enter your query"
name="query"
onChange={e => onChange(e)}
/>
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
您是否尝试过将函数传递给onChange处理程序而不是执行它?大概是这样的:
<input
type="text"
placeholder="Enter your query"
name="query"
onChange={onChange} // Here
/>
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
这样,您就不会在每次呈现组件时都生成新函数,希望它能有所帮助。您是在搜索API以获取此数据,还是在搜索本地数据?在你的代码之外,你似乎在搜索本地数据 每次更改输入时,您都可以使用
useffect
搜索数据。。这样,当前状态将用于查询
它不起作用的原因是,您试图在同一个“操作”中设置状态并使用该状态,但这将不起作用。。该州“落后1个字符”,因为它还没有机会用新结果更新自己。。这就是useffect
所帮助的
另外,在这个场景中,您没有使用onChange={e=>onChange(e)}
,但这不会造成任何伤害。。。您只需执行onChange={onChange}
,事件将作为参数自动传递
像这样的事情应该会有帮助
///向下滚动查看REACT代码
常数apiData=[
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“授权或授权”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:2,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“我不知道该怎么办”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:3,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“福吉亚威尼斯小号”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:4,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“临时工”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:正确
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:5,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“mollitia et enim laboriosam quasi adipisci quia provident illum”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:6,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“全方位的理性”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:7,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“我是一名经验丰富的律师”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:false
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
},
{
用户ID:1,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
id:8,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
标题:“阿迪皮西·埃尼姆·夸姆·乌特·阿布”,
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
已完成:正确
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
}
];
函数搜索器(){
const[search,setSearch]=React.useState(“et”);
const[results,setResults]=React.useState([]);
React.useffect(()=>{
让搜索结果;
如果(搜索){
searchResults=apiData.filter(i=>i.title.includes(search));
}
setResults(searchResults);
},[搜索];
常量handleInput=e=>{
设置搜索(如目标值);
};
返回(
搜索我!
{/*在这个场景中不必使用“e=>handleInput(e)”,但是
不会伤害任何东西…*/}
handleInput(e)}/>
{search}
{search&&results&&results.length==0(
没有找到结果
) : (
useEffect(() => {
console.log(filteredData.query); // not late
console.log(filteredData.filteredProfiles); // same here!
}, [filteredData]);
{JSON.stringify(结果,null,2)}
)}
);
}
render(,document.body)代码>
总是迟到一个字
控制台日志在前一个状态周期内,因此预计会延迟“一个周期”。记住
如果要记录当前更改,请使用useffect
hook
效果挂钩将侦听当前的filteredata
更改并记录它
另外,我建议对事件处理程序使用useCallback
。它不是延迟一个字符,它是为这个渲染准备的值,下一个值是为下一个渲染准备的,值得添加的,来自状态的值是为当前渲染,下一个值是为下一个渲染,如果你想在当前渲染中使用下一个值,你需要使用你的代码沙盒不再工作了。