【发布时间】:2020-06-19 21:49:45
【问题描述】:
为什么我的 useEffect 反应函数在每次页面加载时都会运行,尽管给它一个带有 query 变量的第二个值数组?
useEffect( () => {
getRecipes();
}, [query]);
它不应该只在query 状态变量更改时运行吗?除了 useEffect 函数,我没有其他使用 getRecipes 函数的功能。
import React, {useEffect, useState} from 'react';
import './App.css';
import Recipes from './components/Recipes/Recipes';
const App = () => {
// Constants
const APP_ID = '111';
const APP_KEY = '111';
const [recipes, setRecipes] = useState([]);
const [search, setSearch] = useState('');
const [query, setQuery] = useState('');
const [showRecipesList, setShowRecipesList] = useState(false);
// Lets
let recipesList = null;
// Functions
useEffect( () => {
getRecipes();
}, [query]);
// Get the recipie list by variables
const getRecipes = async () => {
const response = await fetch(`https://api.edamam.com/search?q=${query}&app_id=${APP_ID}&app_key=${APP_KEY}&from=0&to=3&calories=591-722&health=alcohol-free`);
const data = await response.json();
console.log(data.hits);
setRecipes(data.hits);
}
// Update the search constant
const updateSearch = e => {
console.log(e.target.value);
setSearch(e.target.value);
}
const runQuery = e => {
e.preventDefault();
setQuery(search);
}
// List recipes if ready
if (recipes.length) {
console.log(recipes.length);
recipesList = <Recipes recipesList={recipes} />
}
return (
<div className="App">
<form className='search-app' onSubmit={ runQuery }>
<input
type='text'
className='search-bar'
onChange={ updateSearch }
value={search}/>
<button
type='submit'
className='search-btn' > Search </button>
</form>
<div className='recipesList'>
{recipesList}
</div>
</div>
);
}
export default App;
【问题讨论】:
-
所有 useEffects 在组件挂载时运行一次,然后它们仅在其依赖项之一(在数组中)发生更改时重新运行。
-
如果你只想在查询有一定值的时候调用getRecipes,那么在使用效果里面使用一个if函数。
-
useEffect( () => { if (query) { getRecipes(); }}, [query]); -
@JMadelaine 从技术上讲,
useEffect()不是在render()生命周期中第一次执行吗?componentWillMount(),然后是render(),然后是componentDidMount() -
@Rick Sanchez 我添加了我的 cmets 作为答案以及更多信息。
标签: javascript reactjs react-hooks use-effect use-state