仅在第二次单击后才反应 useState 挂钩更新

React useState hook updating only after second click

在名为 Cities 的子组件中,我有一个带有 onClick 事件处理程序的按钮,该事件处理程序将 'worldCity' 的状态更新为 'London',然后另一个按钮将状态更新为 'Paris'。问题在于,只有在单击两次按钮时,城市的状态才会更新。我读到这是因为更新状态是异步的,而 useEffect 是解决这个问题的方法。但是我尝试过的结果仍然是仅在单击两次按钮后才更新状态。

在城市子组件中(存在于其自己的单独页面上)

  const [worldCity, setWorldCity] = useState('')

  <button onClick={() => cityProp(setWorldCity('London'))}>
    London
  </button>
  <button onClick={() => cityProp(setWorldCity('Paris'))}>
    London
  </button>

在父组件中:

const Homepage = () => {
  const {
    worldCity,
    setWorldCity,
  } = WeatherState() // WeatherState() here is a context API where the useState hook is available throughout the application

使用更新后的城市调用 api 的函数:

// Fetch City by name API call
  const fetchCity = async (worldCity) => {
    setLoading(true)
    const { data } = await axios.get(WeatherAPI(worldCity, days))

    setWeather(data)
    setLoading(false)

    console.log('fetchCity called and city is:', worldCity)
  }

使用效果钩子(驻留在父组件中):

  useEffect(() => {
    console.log('World city updated', worldCity)
  }, [worldCity])

以及使用子组件中原始按钮单击的 'worldCity' 变量调用 fetchCity 函数的子组件。

<CityWeather cityProp={() => fetchCity(worldCity)} />

你是对的。 setState 是异步的,您正在尝试获取天气而不等待 setState 完成。


  <button onClick={() => {
cityProp("london")
 setWorldCity("london") //<--- Will resolve later, useEffect with catch the result.
}>

您也可以这样做:

  <button onClick={() => {
const newCity = "london" //<--- newCity is now the current city. Use this inside of this function as worldCity will be stale until this function finishes.
cityProp(newCity)
 setWorldCity(newCity) 
}>