状态更改后 useEffect 不重新渲染
useEffect not re-rendering after state change
我正在构建一个小项目以更熟悉 Hooks,我现在 运行 遇到了一个问题:
该项目是一个天气应用程序,从 API 中提取城市的天气数据。下面的代码是应用程序的简化版本。 \
import React, { useState, useEffect } from "react"
import axios from "axios"
const App: React.FC = () => {
const [weather, setWeather] = useState<any>({})
const [city, setCity] = useState<string>("London")
const [cities, setCities] = useState<string[]>([
"London",
"New York",
"Dubai",
"Berlin",
"Los Angeles",
"Sydney",
])
useEffect(() => {
axios.get(`https://api-url/?query=${city}`)
.then(res => setWeather(res.data))
.catch ...
}, [])
return (
<Drawer>
<nav>
<ul>
{cities.map((c, i) => (
<li key={i} onClick={() => setCity(c)}>
{c}
</li>
))}
</ul>
</nav>
</Drawer>
// more JSX to display weather data for current city
)
}
预期行为:
单击 li
元素将 city
的状态设置为新城市并重新呈现 UI,加载所选城市的天气数据。
实际行为:
已设置状态,但应用不会重新加载数据。
你需要指定city
作为依赖,告诉什么时候重新执行效果。
有关 []
参数的更多详细信息,请参阅 Conditionally firing an effect。
useEffect(() => {
axios.get(`https://api-url/?query=${city}`)
.then(res => setWeather(res.data))
.catch ...
}, [city])
另请参阅 ESLint plugin 了解 Hooks 和 Exhaustive Deps 的规则。
我正在构建一个小项目以更熟悉 Hooks,我现在 运行 遇到了一个问题:
该项目是一个天气应用程序,从 API 中提取城市的天气数据。下面的代码是应用程序的简化版本。 \
import React, { useState, useEffect } from "react"
import axios from "axios"
const App: React.FC = () => {
const [weather, setWeather] = useState<any>({})
const [city, setCity] = useState<string>("London")
const [cities, setCities] = useState<string[]>([
"London",
"New York",
"Dubai",
"Berlin",
"Los Angeles",
"Sydney",
])
useEffect(() => {
axios.get(`https://api-url/?query=${city}`)
.then(res => setWeather(res.data))
.catch ...
}, [])
return (
<Drawer>
<nav>
<ul>
{cities.map((c, i) => (
<li key={i} onClick={() => setCity(c)}>
{c}
</li>
))}
</ul>
</nav>
</Drawer>
// more JSX to display weather data for current city
)
}
预期行为:
单击 li
元素将 city
的状态设置为新城市并重新呈现 UI,加载所选城市的天气数据。
实际行为: 已设置状态,但应用不会重新加载数据。
你需要指定city
作为依赖,告诉什么时候重新执行效果。
有关 []
参数的更多详细信息,请参阅 Conditionally firing an effect。
useEffect(() => {
axios.get(`https://api-url/?query=${city}`)
.then(res => setWeather(res.data))
.catch ...
}, [city])
另请参阅 ESLint plugin 了解 Hooks 和 Exhaustive Deps 的规则。