【问题标题】:React useEffect hook loop, dependency problemReact useEffect hook loop,依赖问题
【发布时间】:2020-08-09 11:49:44
【问题描述】:

效果以无限的重新渲染循环结束,它不断向 url 发出请求。基本上我所拥有的是获取国家/地区的 API 调用。然后基于过滤器输入,它呈现与搜索匹配的国家。如果只有一个结果,还应该获取并显示首都的天气信息。

我想重新渲染天气的唯一时间是国家/地区的值发生变化时。不知怎的,我无法让它工作..

let filtered = countries.filter(country => country.name.toUpperCase().includes(filter.toUpperCase()))

const [weather, setWeather] = useState([])

useEffect(() => {
  if (filtered.length === 1) {
    const country = filtered[0]
    const api_key = process.env.REACT_APP_API_KEY
    const url = `http://api.weatherstack.com/current?access_key=${api_key}&query=${country.capital}`
    axios.get(url)
      .then(response => {
        setWeather(response.data.current)
      })
  }

}, [filtered])

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    每当渲染组件时,都会重新创建filtered(依赖项),这意味着调用useEffect,使API全部设置状态,并导致重新渲染,重新创建filtered...

    为防止这种情况发生,请将filtered 表达式与useMemo 包装起来。 useMemo 块应该依赖于 countriesfilter。只要countriesfilter 不更改filtered 将保持不变,防止循环。如果其中之一发生变化,filtered 将发生变化,useEffect 将使用新数据再次调用 API。

    let filtered = useMemo(() => countries.filter(country =>
      country.name.toUpperCase().includes(filter.toUpperCase()),
    [countries, filter])
    

    另一种选择是使用Array.find() 代替过滤器,并使useEffect() 依赖于找到的国家/地区:

    const country = useMemo(() => countries.find(country =>
      country.name.toUpperCase().includes(filter.toUpperCase())
    ), [countries, filter])
    
    const [weather, setWeather] = useState([])
    
    useEffect(() => {
      if (country) {
        const api_key = process.env.REACT_APP_API_KEY
        const url = `http://api.weatherstack.com/current?access_key=${api_key}&query=${country.capital}`
        axios.get(url)
          .then(response => {
            setWeather(response.data.current)
          })
      }
    
    }, [country])
    

    【讨论】:

    • 您可能希望更新 filtered 的依赖项以包含 filter,因为这对过滤的值有很大影响。
    • 好收获。错过了。更新中。
    • 就是这样!感谢您的精彩解释!
    • @OriDrori 现在已经退出循环,目前它也会在过滤器更新但国家/地区保持不变时进行 API 调用。关于如何解决这个问题的任何想法?
    • Filter 实际上会更改数组,因此无法避免将其用作依赖项。但是,我将添加另一个选项,因为您可以使其依赖于找到的胶囊,而不是整个数组。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 2019-08-09
    • 2020-10-26
    • 2019-10-24
    • 2021-05-11
    • 2020-03-07
    • 2020-02-25
    • 2020-06-11
    相关资源
    最近更新 更多