问题描述
我的网络上收到无数个请求,这是由于我的useEffect所致。我知道问题是因为我在useEffect函数中将“ posts”和“ setPost”作为第二个参数放在括号中,但是每当我添加新帖子时我都需要呈现页面,因此“ posts”必须在括号内。
function Home() {
const {userData,setUserData} = useContext(userContext)
const [posts,setPost] = useState([])
const [createPost,setCreatePost] = useState('')
const handletoken = () => {
localStorage.removeItem('auth-token')
}
const token = localStorage.getItem("auth-token");
const handleOnSubmit = (e) => {
e.preventDefault()
axios.post('http://localhost:5000/posts',{textOfThePost: createPost},{
headers: { 'auth-token': token },})
.then((res) => {setCreatePost("")})
axios.get('http://localhost:5000/posts')
.then(res => {
setPost(res.data)
})
}
useEffect(() => {
},[posts])
解决方法
如果您在useEffect中进行setPost
的操作,我假设posts
被更改了,并且您在posts
中添加了useEffect
作为依赖项,那么当然调用,它进入无限循环。确定何时要调用posts
API。
const [posts,setPost] = useState([])
useEffect(() => {
axios.get('http://localhost:5000/posts')
.then(res => {
setPost(res.data) // Which will change `posts`
})
},[posts]) // this will trigger useEffect and It goes infinite loop
// Change it to
useEffect(() => {
axios.get('http://localhost:5000/posts')
.then(res => {
setPost(res.data) // Which will change `posts`
})
},[]) -> Which call only one time
,
每次posts
更改时都会调用此useEffects,并且在useEffect内更改了帖子的值,因此您进入了递归循环。
useEffect(() => {
axios.get('http://localhost:5000/posts')
.then(res => {
setPost(res.data)
})
},[posts])
如果只希望它被调用一次,则应保留效果为空的数组,这样,在装入组件时,它将仅被调用一次。
useEffect(() => {
axios.get('http://localhost:5000/posts')
.then(res => {
setPost(res.data)
})
},[])