vlambda博客
学习文章列表

react rsf函数式组件 useEffect实现组件的生命周期

第二个Hook  useEffect

第一个参数是回调函数

第二个参数是数组,想要监控哪个数据更新,就把哪个变量填到数组中;

使用技巧

  1. 如果要监控页面上所有的变量更新,要么把所有的变量都填到数组里,或者不要写第二个参数,即不要在useEffect里写数组这个参数

  2. 如果不想监控任何一个变量,可以通过填一个空数组来实现

  3. 变量的声明必须写在useEffect之前

  4. useEffect函数可以写多个;

  5. 函数式组件离不开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

效果