我现在还很陌生,现在我有了一个函数,该函数正在useEffect Hook 中获取一些数据,使用加载状态来管理组件渲染,然后使用该数据加载状态组件,一切正常。
但是现在我必须实现另一个函数来获取其他数据。
如何以最佳方式实现这一点?我是否需要为另一个提取函数创建另一个useEffect
这是我的代码:

export default function Home() {
  const [ageOptions, setAgeOptions] = useState([])
  const [age, setAge] = useState('')
  const [loading, setLoading] = useState(false)

  // get age option from API
   useEffect(() => {
    setLoading(true)
    const fetchAgeOptions = () => {
     // transform the data to load properly in my react-select component
      function transform(data) {
        const options = data.map(function (row) {
          return { value: row.id, label: row.description, startAge: row.startAge, endAge: row.endAge }
        })
        setAgeOptions(options)
        setLoading(false)
      }
      api.get('someurl.com').then(response =>
        Object.values(response.data.rows)).then(data => transform(data))
    }
    fetchAgeOptions()
  }, [])


  return loading ? <div>Loading...</div> :
    <>
      <label>Age level</label>
      <Select
        value={age}
        options={ageOptions}
        placeholder="All"
        onChange={val => {
          setAge(val)
        }}
      />
    </>
}

最佳答案

您当前的useEffect将仅在mount上运行(因为您在use效果[]的末尾添加了空括号)。如果您打算仅一次调用此函数(在挂载时),则可以将其置于相同的useEffect中。如果您希望每次状态更新时都调用一个函数,那么您要做的就是单独创建一个useEffect,并将状态作为依赖项。

useEffect(() => {

  }, ['variable-here-on-update-will-call-whatever-is-in-the-useEffect'])

这是我的一个例子:
//will run on componentDidMount
useEffect(() => {
  setError(false);
}, []);

//will run if error is updated in parent component
useEffect(() => {
  if (error && error.body) {
    setError(true);
  }
}, [error]);

无论如何,我也建议从useEffect中取出“fetchAgeOptions”函数(并在上面添加)。这样,它不是useEffect的私有(private)函数,它将看起来更干净。

关于javascript - ReactJS-如何使用useEffect获取多个数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59969599/

10-13 01:36