对于函数式组件,通过Hooks来实现类似于类组件的状态(State)变量的作用。最常用的是const [A,setA] = useState(default)。对于Hooks中的变量A,当其发生变化的时候,会触发其所在函数重新执行一遍。此时,会把变量A的最新的值代入进去,然后重新执行函数。也就是说,函数重新执行的时候,是不会将default的值重新赋值给变量A的。
与类组件不同的是,类组件的状态变量通过setState修改后,会出发render中的代码重新执行。而函数式组件会重新执行函数,包括return语句以外的所有代码都会重新执行。所以,一般不要在函数中调用setA方法,因为调用setA方法后,函数重新执行,然后又会调用setA方法,如此会导致函数一直被执行,耗费内存,尤其是函数中涉及到网络请求的时候,会一直发送网络请求。
如果需要调用setA方法,一般是和button绑定,点击button才会执行setA,这样即便函数重新执行了,只要我们不点击button,就不会再次调用setA方法,陷入死循环。
如果需要在函数中初始化A的值,而这个A的值又不方便通过useState后面的括号来赋值的话,那么可以调用useEffect。这是一个初始化的函数,将setA方法包含在useEffect中,并将A变量绑定到useEffect,这样只有当A变量发生变化了,才会调用useEffect函数。如果不绑定,给一个空变量,那么useState函数只会在函数初始化的时候运行一次,后续都不会再运行了。
useCallback会让内存记住这个函数中的代码,当setA方法调用以后,整个函数重新执行的时候,不会将useCallback内封装的代码重新加载一遍。useMemo和useCallback类似,useMemo返回的是一个函数执行后的结果。