Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用React useState获取数据出错_Javascript_Reactjs_Api - Fatal编程技术网

Javascript 使用React useState获取数据出错

Javascript 使用React useState获取数据出错,javascript,reactjs,api,Javascript,Reactjs,Api,我的代码有问题,你能帮我解决吗? 我已经创建了一个id状态来从API获取id,因为我需要这个id来进行另一次获取 const [id, setId] = useState([]) useEffect(() => { async function fetchData() { await fetch('https://cors-anywhere.herokuapp.com/https://dashboard.meraki.com/api/v0/organizations'

我的代码有问题,你能帮我解决吗? 我已经创建了一个id状态来从API获取id,因为我需要这个id来进行另一次获取

const [id, setId] = useState([])

useEffect(() => {
    async function fetchData() {
      await fetch('https://cors-anywhere.herokuapp.com/https://dashboard.meraki.com/api/v0/organizations', requestOptions)
        .then(response => response.json())
        .then(result =>
          setId(...id, result)
        )
        .catch(error => console.log('error', error))
    }
    fetchData()
  }, [])
所以这里我有一个ID数组,我将在下一次获取中使用它

const [data, setData] = useState([])
const [isLoading, setIsLoading] = useState(false)

useEffect(() => {
        setIsLoading(true)
        id.map(companyId => {
            async function fetchData() {
                await fetch(`https://cors-anywhere.herokuapp.com/https://dashboard.meraki.com/api/v0/organizations/${companyId.id}/licenses`, requestOptions)
                    .then(response => response.json())
                    .then(result =>
                        setData([...data, { company: companyId.name, results: result}]))
                    .catch(error => console.log('error', error))
            }
            setIsLoading(false)
            fetchData()
        })
    }, [id])
这里的问题是。。。我为每个id获取一个新的“数据”,因此它会更改每次获取,我知道这是因为我在useState结束时使用了[id],但我需要为每个id获取一个新的“数据”,这怎么可能

当我尝试在useState末尾使用空数组渲染它时,它只返回一个空数组,因为它只渲染一次。如何为第一次获取时在“ID”数组中获得的每个ID获取一个包含第二次获取的所有结果的数据


PS:requestOptions由于API键而被隐藏。…

如果要在以前的状态中添加一个元素,可以将一个函数传递给
setData()
,该函数允许您更新旧状态,而不是替换它。 在您的示例中,我将通过返回包含旧状态和新元素的新数组来更改
setData
调用。使用spread运算符而不是.push()方法很重要,这样状态就不会直接发生变化。
setData(prevState=>[…prevState,{company:companyId.name,results:result}])

这两个钩子是如何连接的?你能提供更多的上下文吗?第一个useEffect是一个API请求,获取一个数组,该数组给我每个公司的ID,因为第二次获取“/${companyId.ID}/licenses”时我需要这个ID。假设两个钩子在同一个脚本(App.js)上,在第一个钩子上得到这个“[id]”之后,我需要将它用于第二个钩子,以获得每个id(公司)的所有数据。我遇到的问题是,每次我在第二个钩子上“setData()”时,它只会删除我获取的过去的数据,并给我一个新的数据(因为我在useEffect末尾使用[id]。我想存储每个id的所有数据。