gpt4 book ai didi

reactjs - 使用 SWR 单击时向 API 路由发出请求时出现太多重新呈现错误

转载 作者:行者123 更新时间:2023-12-04 15:07:28 25 4
gpt4 key购买 nike

当我单击组件内的按钮时,我通过函数 const readUrl 向页面发送回 id。现在我正在尝试将客户端 id 发送到 /api/dat/[id].js 路由,其中​​基本上在 mongodb 中搜索该 id 和res.send 将 JSON 结果返回给页面。

因此,通过 SWR,我正在处理客户端的 API 路由,我使用两个 useState 来处理来自按钮点击的 id 和来自 API 的结果,以将其传递给 React DOM。

问题是我得到:

Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.

这是我的api/dat/[id].js:

import { connectToDatabase } from "../../utils/mongodb"

export default async function ({ query: { id } }, res) {
const { db } = await connectToDatabase();
const dataID = id

const foundData = /* query to mongodb.toArray() */

if (foundData.length) {
res.status(200).send({ data: foundData[0] })
} else {
res.status(404).json({ message: `Data ${id} not found.` })
}

res.end()
}

这是我页面中的代码:

const [urlNow, setUrlNow] = useState(null);
const [urlData, setUrlData] = useState(null);

const readUrl = (url) => {
setUrlNow(url)
return true
}

const fetcher = (...args) => fetch(...args).then(res => res.json())
const { data, error } = useSWR(readUrl ? `/api/dat/${urlNow}` : null, fetcher)

// if (error) return <div>{error.message}</div>
// if (!data) return <div>Loading...</div>
if (data) setUrlData(data.data)

return (
...
{urlData
? <Component data={urlData} />
: <ComponentWithButton readUrl={readUrl} />
}

useSWR 正如上面设置的那样,仅当函数 readUrl 返回 true 时才会触发,正如 SWR 文档所说,所以我认为它应该获取仅当按钮被点击时 API 路由,至少是这个想法。

最佳答案

您应该将 useSWR() 中的条件替换为使用 urlNow 而不是 readUrl 函数。

还可以清理一些状态/变量,使代码更简单,并避免 setUrlData(data.data) 导致的无限重新渲染。

const [urlNow, setUrlNow] = useState(null);

const readUrl = (url) => {
setUrlNow(url)
}

const fetcher = (...args) => fetch(...args).then(res => res.json())
const { data, error } = useSWR(urlNow ? `/api/dat/${urlNow}` : null, fetcher)

// if (error) return <div>{error.message}</div>
// if (!data) return <div>Loading...</div>

return (
{data
? <Component data={data} />
: <ComponentWithButton readUrl={readUrl} />
}
//...
)

关于reactjs - 使用 SWR 单击时向 API 路由发出请求时出现太多重新呈现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65848065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com