问题:props和setState引起的组件重新渲染的宏观视图是什么?例如有如下代码:constcomponent=(props)=>{const[a,setA]=useState(true);const[b,setB]=useState(true);constref=useRef(true);constfn=useCallback(()=>{},[a]);constmemo=useMemo(()=>{},[b]);useEffect(()=>{setA(false);},[b]);return(
)}每次重新渲染一个组件,都会有一个链表(假设这个链表叫做link1)依次记录useState->useState->useRef->useCallback->useMemo->useEffect的区别,详细看每一个的分析。这里只简单描述一下deps对函数运行与否的影响。这里的dep会记录在link1中。第二次渲染组件时,会比较deps。如果deps不同,则执行相应的方法。例如,fn=useCallback这里,第一次渲染组件时,将方法赋值给fn,记录[a]的值。组件第二次渲染时,会检查[a]的值是否有更新(示例代码更新,因为useEffect),如果有更新,useCallback中的第一个参数会重新赋值给fn。问题:useMemo和useEffect有什么区别?区别如下:useMemo是在渲染过程中执行的,而useEffect是在渲染之后执行的,并且执行了一个新的渲染队列。因为1,会导致useMemo的第一个参数方法,调用set...State方法会报错。但不是在useEffect中,但是如果你在useEffect中这样做,它会触发重新渲染。如果重新渲染的值在useEffect的deps中,那么就会造成循环渲染,最后会报错。在用法上,useMemo一般直接赋值,因为第一个参数方法会返回一个值。并且useEffect没有返回值。问题:在useCallback、useMemo、useEffect中,如果第一个参数的函数涉及的变量没有出现在第二个参数中,会发生什么情况?分为几种情况。情况一:涉及到的变量都是useState创建的变量。这种情况显然是不能接受的,因为如果我们调用了set...State,deps里面没有更新的数据,那么这三个uses返回的内容将是Notallasexpectedso,no。Case2:涉及的变量是useRef创建的。UseRef的创建意味着这个值永远不会被更新,除非用ref.current强制修改它。但是如果你用ref.current更新,这三个use方法就不会被触发。因此,这个不能放在deps里。情况三:涉及到的变量是直接创建的,比如直接使用consta=initValue;直接创建的变量,每次更新组件时,都会重新初始化变量。原则上不建议这样创建变量。答案是:不要这样创建变量。如果硬要这样创建,答案是每次都会初始化这个变量,以后对这个变量的修改不会触发三个uses的重新创建。