我在网络上收到了无限的请求,这是由于我的useEffect。我知道这个问题是因为我把useEffect函数中的"posts"one_answers"setPost"作为第二个参数放在括号中,但每当我添加新的post时,我都需要呈现页面,所以"post"必须在括号内。
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
正在更改,并且你在useEffect
中添加了posts
作为依赖项,当然它会重新调用,并进入无限循环。请确定何时调用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中您正在更改posts值,因此您进入了递归循环。
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)
})
}, [])