简体   繁体   English

反应原生 useEffect 进入死循环:

[英]react native useEffect run into dead loop:

export default function CreatePage() {
let [state,setState]=useState({})
let flag=true
useEffect(()=>{
    if(flag){
        axios.get('http://192.168.43.151:3001/data').then((res)=>
    {
        console.log(res.data)
        setState({...res.data})
        flag=false
        console.log(false)
      
    }
    ).catch((err)=>{console.log(err)}).finally(()=>{flag=false})

    }

    
})


return (
    <View >
        <Text>hh</Text>
        <Icon name="heart" size={24} color="#4F8EF7" />
        <Text>first page</Text>
        <Text>{state.name}</Text>
        
    </View>
)

} }

after the code is executed,the terminal continues showing:代码执行后,终端继续显示:

    {"age": 25, "name": "connor", "password": "123456"}
 LOG  false
 LOG  {"age": 25, "name": "connor", "password": "123456"}
 LOG  false
 LOG  {"age": 25, "name": "connor", "password": "123456"}
 LOG  false

i have confusion about this,useEffect function should be rendered once.However,it seems continuing to be redered.我对此感到困惑,useEffect function 应该渲染一次。但是,它似乎继续被重新渲染。

to execute useEffect only once you have to add dependency array with no dependency.仅在必须添加没有依赖关系的依赖数组时才执行 useEffect 。 Something like this:像这样的东西:

useEffect(() => {
    // this code will execute only once after first render.
   // some code...
}, [])

You did not add a dependency array to the useEffect function.您没有向 useEffect function 添加依赖项数组。 Therefore, it is bound to be an infinite reRendering.因此,势必是无限次的重新渲染。

And react does not recommend let .并且 react 不推荐let Use the status value.使用状态值。

You can add a dependency array您可以添加一个依赖数组

const [state,setState] = useState({});
const [flag,setFlag] = useState(true);
useEffect(()=>{
    if(flag){
        axios.get('http://192.168.43.151:3001/data').then((res)=>
    {
        console.log(res.data)
        setState({...res.data})
        setFlag(false)
        console.log(false)
      
    }
    ).catch((err)=>{console.log(err)}).finally(()=>{flag=false})

    }

    
},[])


if(flag) {
   return <LoadingElem />
}

...

If you want to run an effect and clean it up only once (on mount and unmount), you can pass an empty array ([]) as a second argument to the useEffect .如果您只想运行一个效果并只清理一次(在挂载和卸载时),您可以将一个空数组 ([]) 作为第二个参数传递给useEffect

useEffect(() => {}, [])

Can you try this?你能试试这个吗? you have to put the flag into a state or else in every render it will be false.您必须将标志放入 state 否则在每次渲染中它将是错误的。

export default function CreatePage() {
    let [state,setState]=useState({})
    let [flag,setFlag]=useState(true)
    useEffect(()=>{
        fetchData()
    },[])
    
    const fetchData = async ()=>{
        if(flag){
                axios.get('http://192.168.43.151:3001/data').then((res)=>
            {
                console.log(res.data)
                setState({...res.data})
                setFlag(false)
                console.log(false)
            
            }
            ).catch((err)=>{console.log(err)}).finally(()=>{setFlag(false)})
        
        }
    }
    
    
    return (
        <View >
            <Text>hh</Text>
            <Icon name="heart" size={24} color="#4F8EF7" />
            <Text>first page</Text>
            <Text>{state.name}</Text>
            
        </View>
    )
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM