javascript - React hooks 回调接收过时状态

标签 javascript reactjs react-hooks

在简单的搜索组件上尝试 react Hook 。这个想法很简单:用户输入符号,每个输入的符号都会启动 api 查询。
为了实现这一点,我有 useStateuseCallback Hook ,如下面的代码所示:


const Search = () => {
  const [query, setQuery] = useState("");
  const sendRequest = useCallback(() => {
    console.log('sendRequest ', query);
  }, [query]);

  return (
    <div>
      <input
        type="text"
        value={query}
        placeholder="Search"
        onChange={e => {
          console.log('onChange ', e.target.value);
          setQuery(e.target.value);
          sendRequest();
        }}
      />
    </div>
}

结果是 sendRequest 方法始终获取 query 的先前版本。

onChange q
sendRequest 
onChange qu
sendRequest q
onChange que
sendRequest qu

这是为什么呢?我认为这不是钩子(Hook)应该如何使用的,但我无法从 documentation 中弄清楚这一点。 .

最佳答案

setState 是异步的! 在发送 sendRequest 时,本地状态不会更新,因为它是异步的,需要一些时间来设置。

您应该将字符串作为参数提供给函数或 useEffect 并监听查询的更改。

将 useCallback 与 useEffect 交换并删除 onChange 中的调用应该可以工作。

const Search = () => {
  const [query, setQuery] = useState("");

  useEffect(() => {
    console.log('sendRequest ', query);
  }, [query]);

  return (
    <div>
      <input
        type="text"
        value={query}
        placeholder="Search"
        onChange={e => {
          setQuery(e.target.value);
        }}
      />
    </div>
}

关于javascript - React hooks 回调接收过时状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57441477/

相关文章:

javascript - 无法在 JavaScript 中获取单选按钮值

javascript - 好的 jQuery Autocomplete 不是 jQuery UI 的一部分?

Javascript 批量缩小并从文件夹中连接

javascript - react-pdf 从磁盘加载文件而不是 url

node.js - 我需要将用户输入作为获取请求的一部分提交给 unsplash 服务器

javascript - TypeError : repos. 映射不是函数

reactjs - 我无法获取 localStorage 数据,我正在使用 useEffect Hook

javascript - 如何从 useEffect 访问组件的当前状态而不使其成为依赖项?

javascript - 为什么我不能使用此 AJAX 响应的一部分?

javascript - React 向下传递钩子(Hook)会导致重新渲染并失去对输入的关注