【发布时间】:2020-12-11 23:27:20
【问题描述】:
我正在学习反应钩子。我有模拟数据 js 调用“MockFireBase.js”如下:
const userIngredientsList = [];
export const Get = () => {
return userIngredientsList;
}
export const Post = (ingredient) => {
ingredient.id = userIngredientsList.length + 1;
userIngredientsList.push(ingredient);
return ingredient;
}
然后我的反应钩子组件“Ingredients.js”将调用这个模拟实用程序,详细信息如下:
const Ingredients = () => {
const [userIngredients, setUserIngredients] = useState([]);
// only load one time
useEffect(() => { setUserIngredients(Get()); }, []);
const addIngredienHandler = ingredient => {
let responsData = Post(ingredient);
setUserIngredients(preIngredients => {
return [...preIngredients, responsData]
});
}
return (
<div className="App">
<IngredientForm onAddIngredient={addIngredienHandler} />
<section>
<IngredientList ingredients={userIngredients} />
</section>
</div>
);
)
}
当我添加第一个成分时,它添加了两个(当然我在 console.log 中遇到了相同的关键问题)。然后我添加了第二种成分就可以了。
如果我删除下面的 useEffect 代码,它会很好用。
// only load one time
useEffect(() => { setUserIngredients(loadedIngredients); }, []);
如果我使用 useEffect,我想知道我在上面做错了什么
【问题讨论】:
-
变量
userIngredientsList将作为引用传递。因此,在addIngredienHandler中,Post()函数将其直接添加到原始变量userIngredientsList中,而setState参数preIngredients仍在使用原始引用(通过帖子添加了该项目)。使用效果应该散布数组setUserIngredients([...Get()])。
标签: javascript reactjs react-hooks use-effect use-state