停止输入 React Js 时调用函数 [重复]

Posted

技术标签:

【中文标题】停止输入 React Js 时调用函数 [重复]【英文标题】:Call function when stop typing React Js [duplicate] 【发布时间】:2021-08-20 00:33:47 【问题描述】:

我在停止打字时尝试做一些事情,我尝试了这段代码但不起作用

const handler=(e)=>
  let time;
  clearTimeout(time);
  time = setTimeout(() => 
     console.log("click");
  , 2000);

<input onChange=handler/>

【问题讨论】:

你到底想做什么? 您想等待2s 触发功能,或者在您刚停止输入后不久 当用户停止输入@isaacsan123 时,我尝试运行一个函数 在停止输入@CrispenGari 后不久 【参考方案1】:

你存储超时ID的变量需要在函数外部定义,否则每次调用handler都会得到一个新的、未定义的变量。

也就是说,you are probably reinventing the wheel。

【讨论】:

你能给我示例代码吗?我尝试了很多教程但还是看不懂 let time;移到函数外。两排。 鉴于这是 React,不会在组件重新渲染时重新声明时间变量,从而使 clearTimeout 没有 id 吗? 会,但处理函数不会触发重新渲染。【参考方案2】:

如果在 2 秒内有更多输入,我假设您想取消计时器。目前,你的 time 变量的作用域是处理函数,所以函数执行完成时值会丢失。

尝试使用状态来跟踪你的计时器:

const [timerID, setTimerID] = useState(null);
  
const handler = (e) => 
  clearTimeout(timerID);
  const id = setTimeout(() => console.log("click"), 2000);
  setTimerID(id)

  
return <input onChange=handler/>

【讨论】:

【参考方案3】:

time 应该在你的函数之外。

var time;
const handler = (cmp) => 
  clearTimeout(time);
  time = setTimeout(() => 
    console.log(`You typed $cmp.value`);
  , 2000);
&lt;input onChange="handler(this)" /&gt;

另外,2 秒似乎有点长。

【讨论】:

【参考方案4】:

我知道有更好的方法,但现在试试这个。

const [typing, setTyping] = useState(true)
useEffect(() =>
if(! typing)
console.log("stop typing")
 
, [typing] ) 
const handleKeyUp =() =>
   setTyping(true) 
     setTimeout(()=>
       setTyping(false) 
, 100) 
 
<input onChange=handler onKeyup=handleKeyUp/>

【讨论】:

【参考方案5】:

您可以使用 ref 来跟踪计时器。这应该保持对重新渲染的引用,并且不会导致组件的额外重新渲染。

const Typing = () => 
  const timer = React.useRef();
  
  const handler = (e) => 
    clearTimeout(timer.current);
    timer.current = setTimeout(() => 
       console.log("Typed: " + e.target.value);
    , 2000);
  
  
  return <input onChange=handler />;
;

const App = () => <Typing />;
ReactDOM.render(<App />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>

【讨论】:

以上是关于停止输入 React Js 时调用函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

调试停止时调用函数

React + redux:连接组件加载时调用调度

使用虚拟继承时调用默认构造函数[重复]

JavaScript:调用外部函数时调用Array.reduce,并且外部函数有参数[重复]

在科尔多瓦的键盘上按下“完成”按钮时调用一个函数[重复]

在 Bootstrap 模式中单击按钮时调用 JS 函数