【问题标题】:Getting useState is lagging when getting input's value from useRef()从 useRef() 获取输入值时获取 useState 是滞后的
【发布时间】:2021-07-05 09:39:54
【问题描述】:

当我使用 inputs ref={inputRef} 并使用 setState 时,state 的值总是落后一步 - 意思是,它拥有之前的 value

当我在输入字段中键入任何字符串时,在第一个按钮中它将有一个空字符串,只有在第二个按钮单击时它才会有我输入的字符串并会触发 console.log('searchString', searchString); TWICE!

我在上一个问题中得到建议,而不是每次我在输入字段中按下一个字母时都调用onChange={(e) => onChangHandler(e)},我可以在单击activeSearch() 的按钮时获取整个值ONE只有时间。

function Header({ setingResults }) {
  const [productsObj, setObjs] = useState([]);
  const [searchString, setString] = useState('');
  const inputRef = useRef();


 // const onChangHandler = (e) => {
 //   setString(e.target.value);
 // };

  const activeSearch = () => {
    setString(inputRef.current.value);
    if (searchString.length > 0) {
      console.log('searchString', searchString);
      setingResults(searchString);
    }
  };
  return (
    <div>
      <header className='header-shop'>
        Welcome to Vitamins Store
        <br />
        <input
          placeholder='Search here'
          ref={inputRef}
          // value={searchString}
          // onChange={(e) => onChangHandler(e)}
        />
        <button onClick={activeSearch}>Search</button>
      </header>
    </div>
  );
}
export default Header;

有人知道这里有什么问题吗?

我会很高兴得到一些帮助。

【问题讨论】:

标签: javascript reactjs input react-hooks


【解决方案1】:

不是 useRef 但 useState 是滞后的。

  const activeSearch = () => {
    setString(inputRef.current.value);
    // here searchString is old value
    if (searchString.length > 0) {
      console.log('searchString', searchString);
      setingResults(searchString);
    }
  };

【讨论】:

  • 您可以 console.log inputRef.current.value 然后您可以看到它没有滞后。并且setString 没有同步运行。
  • 是的,非常感谢,您知道如何同步制作setString 吗?以及为什么滞后?
  • 你可以阅读this post的原因。
【解决方案2】:

如果我正确理解了您的目标,那么执行此操作的首选方法会更简单一些。

function Header({ setResults }) {
  const [searchString, setSearchString] = useState('');
  const activeSearch = () => setResults(searchString);
  const searchChange = (e) => setSearchString(e.target.value);
  return (
    <div>
    <header className='header-shop'>
        Welcome to Vitamins Store
        <br />
        <input
        placeholder='Search here'
        value={searchString}
        onChange={searchChange}
        />
        <button onClick={activeSearch}>Search</button>
    </header>
    </div>
  );
}
export default Header;

在您的输入上设置valueonChange 使其成为"controlled input",每次更改输入值时设置searchString 的值,并将activeSearch 传递给按钮的onClick使用输入的当前值调用您的 setResults 道具。

如果您只需要跟踪输入值,则很少需要refs。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2012-04-21
  • 2019-08-09
  • 1970-01-01
  • 2021-01-07
  • 2020-08-18
  • 2020-07-17
相关资源
最近更新 更多