Благодаря примеру @Tholle я понял, что qoute «Функция, возвращаемая из функции useEffect, будет вызвана every time it is run again
, и при размонтировании, как вы говорите», и придумал это решение:
import React, { useState, useContext, useEffect, useRef } from 'react'
export function TagsAdd() {
const [searchTerm, searchTermSet] = useState('')
const isFirstRun = useRef(true)
useEffect(() => {
//skip first run on component mount
if (isFirstRun.current) {
isFirstRun.current = false
return
}
const timeout = setTimeout(() => {
tagSearch(searchTerm)
}, 2000) //2000 - timeout to execute this function if timeout will be not cleared
return () => clearTimeout(timeout) //clear timeout (delete function execution)
}, [searchTerm])
// API call only one time in 2 seconds for the last value! Yeeeee
async function tagSearch(value) {
let res = await fetch('api/tag_seatch/' + value)
res = await res.json()
console.log(res)
}
//handle input change
function handleInput(e) {
searchTermSet(e.target.value)
}
return (
<div>
<input value={searchTerm} onChange={handleInput} />
</div>
)
}