Error: Too many re-renders. with useState
Error: Too many re-renders. with useState
我知道这个问题很多人问过,但是我试过上面提到的方法,还是不行。
这是我的代码
let tmp:any = {
"title": "Product Set",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
},
"money": {
"type": "string"
}
}
}
const SForm = () => {
const { projectId } = useParams() as { projectId: string }
const [schema , setSchema] = useState(tmp);
async function getData(id: number) {
const { data } = await http.post('/project/testparam', {
project_id: id,
})
return data.data
}
setSchema(getData(+projectId))
return (
<Form schema = {schema as JSONSchema7}
>
</Form>
)
}
很多人说原因是:花括号之间的所有东西都会立即求值。
使用箭头函数。
setSchema(()=> {
getData(+projectId)
})
但是不行
您正在为每个渲染设置架构。调用 setState
挂钩会触发渲染。
具体情况如下:
intialRender -> setSchema -> re-render -> setSchema -> re-render -> ...
您可能只想为一个 projectId 获取一次架构:
const schema = useMemo(() => getData(+projectId), [getData, projectId])
将函数放在 useEffect 函数中,以便它 运行 在渲染时出现一次
useEffect(() => {
setSchema(getData(+projectId))
}, [/* dependencies */])
依赖项框将传递参数,每次参数为 re-rendered
时都会 运行 useEffect
我知道这个问题很多人问过,但是我试过上面提到的方法,还是不行。 这是我的代码
let tmp:any = {
"title": "Product Set",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
},
"money": {
"type": "string"
}
}
}
const SForm = () => {
const { projectId } = useParams() as { projectId: string }
const [schema , setSchema] = useState(tmp);
async function getData(id: number) {
const { data } = await http.post('/project/testparam', {
project_id: id,
})
return data.data
}
setSchema(getData(+projectId))
return (
<Form schema = {schema as JSONSchema7}
>
</Form>
)
}
很多人说原因是:花括号之间的所有东西都会立即求值。 使用箭头函数。
setSchema(()=> {
getData(+projectId)
})
但是不行
您正在为每个渲染设置架构。调用 setState
挂钩会触发渲染。
具体情况如下:
intialRender -> setSchema -> re-render -> setSchema -> re-render -> ...
您可能只想为一个 projectId 获取一次架构:
const schema = useMemo(() => getData(+projectId), [getData, projectId])
将函数放在 useEffect 函数中,以便它 运行 在渲染时出现一次
useEffect(() => {
setSchema(getData(+projectId))
}, [/* dependencies */])
依赖项框将传递参数,每次参数为 re-rendered
时都会 运行 useEffect