react rsf函数式组件 useEffect实现组件的生命周期
第二个Hook useEffect
第一个参数是回调函数
第二个参数是数组,想要监控哪个数据更新,就把哪个变量填到数组中;
使用技巧
如果要监控页面上所有的变量更新,要么把所有的变量都填到数组里,或者不要写第二个参数,即不要在useEffect里写数组这个参数
如果不想监控任何一个变量,可以通过填一个空数组来实现
变量的声明必须写在useEffect之前
useEffect函数可以写多个;
函数式组件离不开hook,没有hook,函数式组件就没有多大意义了;
监控所有数据或者某一个数据或者不监控任何一个数据
let [num,setNum] = useState(0);let [num2,setNum2] = useState(0);useEffect(()=>{//一般在这里做ajax的请求,向后台请求数据;console.log("组件创建完成")//},[num,num2]); //把所有的变量都列出来,任一个变量变化都会触发useEffect;//}); //不写第二个参数,任一个变量变化都会触发useEffect;//},[num]); //把所有的变量都列出来,只有num这个变量变化了,才会触发useEffect},[]); //不监控组件里的任何一个变量,只在组件第一次加载时触发
实现 vue beforeDestory的效果,在组件销毁前调用
import {useState,useEffect} from 'react';//useEffect 在组件创建时 执行//类组件的生命周期// vue的生命周期 mount 相当于vue created 做数据请求 》 updated 》 beforeDestroy 卸载前做垃圾回收function UseEffect01(props) {let [num,setNum] = useState(0);let [num2,setNum2] = useState(0);useEffect(()=>{//一般在这里做ajax的请求,向后台请求数据;console.log("组件创建完成")//},[num,num2]); //把所有的变量都列出来,任一个变量变化都会触发useEffect;//}); //不写第二个参数,任一个变量变化都会触发useEffect;},[num]); //把所有的变量都列出来,只有num这个变量变化了,才会触发useEffect//},[]); //不监控组件里的任何一个变量,useEffect(()=>{/*** 在这个阶段做垃圾回收,数据还原等操作,比如组件初始化时,某个变量是100,在组件使用过程中,对这个数据进行了修改,需求要让组件在销毁前将该数据还原,* 可以在此操作*/return () => {console.log("组件销毁前调用");}});const fnUpdateNum = () => {setNum(num+=1);}const fnUpdateNum2 = () => {setNum2(num2+=1);}return (<><h1>{num}</h1><button onClick={fnUpdateNum}>fnUpdateNum</button><br/><h1>{num}</h1><button onClick={fnUpdateNum2}>fnUpdateNum2</button><hr/></>);}export default UseEffect01;
在入口文件里写一个定时器,3秒后将组件替换,实现组件的销毁,看useEffect有没有变化;
import ReactDom from "react-dom"import App from './UseEffect01'ReactDom.render(<App />,document.getElementById('root'))setTimeout(()=>{ReactDom.render(<input type="text" />,document.getElementById('root'))},3000); //设置一个定时器,三秒后,将App替换成input
效果
