如何将 setState 值插入 useEffect 挂钩?

Posted

技术标签:

【中文标题】如何将 setState 值插入 useEffect 挂钩?【英文标题】:How to insert setState value into useEffect hook? 【发布时间】:2020-07-24 10:09:51 【问题描述】:

我观看了一个 Youtube 视频,并制作了自己的食谱应用程序。我是 React.js 的初学者,我已经解决了这个问题大约 2 天。似乎我无法将我的状态值传递给 useEffect 挂钩。这是我的代码示例。错误说

“React Hook useEffect 缺少依赖项:'query'。要么包含它,要么删除依赖项数组”,每次我在输入框中键入它都会触发 useEffect 挂钩。谢谢您,非常感谢您的帮助。

const [recipes, setRecipes] = useState([]);
const [search, setSearch] = useState('');
const [query, setQuery] = useState('steak');

const updateSearch = e => 
    setSearch(e.target.value);
    console.log(search)


const getSearch = e => 
    e.preventDefault();
    setQuery(search);


useEffect(() =>    // error Is from the Query variable
    const GetRecipe = async () => 
        const APP_ID = "3834705e";
        const APP_KEY = "c23e9514f82c2440abf54b21edd4c3dc";
        const res = await fetch(`https://api.edamam.com/search?q=$query&app_id=$APP_ID&app_key=$APP_KEY`);
        const data = await res.json();
        setRecipes(data.hits);
      
    GetRecipe();
,[getSearch]) //this triggers everytime I typed in the input box which is not it is supposed to

return(
    <div className='recipelist'>

        <form onSubmit=getSearch>
            <input type="search" onChange=updateSearch/>
            <button type='submit'>submit</button>
        </form> 

【问题讨论】:

【参考方案1】:

正如错误告诉你的那样,当使用 useEffect 钩子时,该钩子可以接收两个参数,第一个是处理程序效果,第二个是包含效果将使用的所有依赖项的数组,所以你是在 http url 中使用查询状态,您需要将该依赖项传递到数组中,所以可能是这样的。

useEffect(() =>    // error Is from the Query variable
    const GetRecipe = async () => 
        const APP_ID = "3834705e";
        const APP_KEY = "c23e9514f82c2440abf54b21edd4c3dc";
        const res = await fetch(`https://api.edamam.com/search?q=$query&app_id=$APP_ID&app_key=$APP_KEY`);
        const data = await res.json();
        setRecipes(data.hits);
      
    GetRecipe();
,[getSearch, query])

所以实际上是在做什么数组依赖,正如 React 文档所说,数组依赖用于检查效果是否应该根据它的依赖再次执行,所以在你的代码中你输入的所有东西,getSearch 方法是重新在内存中一次又一次地创建,所以它会检查它使用的最后一个getSearch 函数并将它与新的函数进行比较,所以它会像 fn1 === fn2 一样检查同样的检查器,所以由于这两个函数都是同样,两者在内存中保持不同的空间,所以都是不同的对象,检查这个docs以了解这个概念。

这里你也有反应docs

【讨论】:

以上是关于如何将 setState 值插入 useEffect 挂钩?的主要内容,如果未能解决你的问题,请参考以下文章

具有一个值的 setState 如何工作?

listview 不使用 setState 更新

react组件初始化接口请求有多个异步依赖参数

除了 setstate 颤振之外,如何在小部件构建中获取值

比较输入值(setState)[重复]

如何在 React 中使用 setState() 来空白/清除数组的值