Reactjs 更改输入状态延迟一个字符(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)} />

我正在尝试在我的社交网络中实现对用户配置文件的即时搜索。它似乎在工作,但对输入更改设置状态(使用挂钩)会导致延迟一个字符

我研究了一下,发现这个状态延迟问题可以通过在setState中使用回调函数来解决。但是,useState不支持这一点

这是我的输入元素:


<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

它不是延迟一个字符,它是为这个渲染准备的值,下一个值是为下一个渲染准备的,值得添加的,来自状态的值是为当前渲染,下一个值是为下一个渲染,如果你想在当前渲染中使用下一个值,你需要使用你的代码沙盒不再工作了。