• useEffect的两个参数


    情况一:

    useEffect需要传递两个参数,第一个参数是逻辑处理函数,第二个参数是一个数组

    1. useEffect(() => {
    2. /** 执行逻辑 */
    3. },[])

    情况二:

    • 第二个参数存放变量,当数组存放变量发生改变时,第一个参数,逻辑处理函数将会被执行
    • 第二个参数可以不传,不会报错,但浏览器会无限循环执行逻辑处理函数。
      代码如下:
      1. useEffect(() => {
      2. /** 执行逻辑 */
      3. })

    情况三:

    • 第二个参数如果只传一个空数组,逻辑处理函数里面的逻辑只会在组件挂载时执行一次 ,等价于 componentDidMount
      代码如下:
      1. useEffect(() => {
      2. /** 执行逻辑 */
      3. },[])

    情况四:

    • 第二个参数如果不为空数组,依赖指定参数触发使用
    • 逻辑处理函数会在组件挂载时执行一次和(a或者b变量在栈中的值发生改变时执行一次) 这是不是相当于componentDidMount 和componentDidUpdate 的结合
    1. const [a, setA] = useState(1);
    2. const [b, setB] = useState(2);
    3. useEffect(() => {
    4. /** 执行逻辑 */
    5. },[a,b])

    特殊情况处理

    useEffect监测不到依赖数组元素的变化。

    只有一种可能,依赖数组元素的地址的值根本就没变,
    原因:因为changeA没有真正的改变a在栈中的值(地址的值),只是改变了a在堆中的值。
    useEffect监测不到堆中值得变化,所有引用类型数据都应该注意这一点。

    1. const [a, setA] = useState({
    2. b: 'dx',
    3. c: '18',
    4. })
    5. const changeA = () => {
    6. setA((old) => {
    7. old.b = 'yx'
    8. return old
    9. })
    10. }
    11. useEffect(() => {
    12. /** 当组件挂载时执行一次changeA */
    13. changeA ()
    14. },[])
    15. /**当changeA执行却没有打印 a*/
    16. useEffect(() => {
    17. /** 执行逻辑 */
    18. console.log(a)
    19. },[a])

    解决的办法 

    1. const [a, setA] = useState({
    2. b: 'dx',
    3. c: '18',
    4. })
    5. const changeA = () => {
    6. setA((old) => {
    7. const newA = {...old}
    8. newA .b = 'yx'
    9. return newA
    10. })
    11. }
    12. useEffect(() => {
    13. /** 当组件挂载时执行一次changeA */
    14. changeA ()
    15. },[])
    16. /**当changeA执行打印 {b:'yx',c:'18'} */
    17. useEffect(() => {
    18. /** 执行逻辑 */
    19. console.log(a)
    20. },[a])

  • 相关阅读:
    Docker安装Elasticsearch与案例
    Docker:创建主从复制的Redis集群
    Mysql基础
    任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现
    在MySQL中使用MD5加密【入门体验】
    Springboot日常总结-@RestController和@Controller的区别
    1107 Social Clusters 甲级 xp_xht123
    小分子PEG CAS:1352814-07-3生物素-PEG6-丙酸叔丁酯
    开源ffmpeg(三)——音频拉流、解码以及重采样
    23、匿名类的排序、Lambda 表达式、方法引用
  • 原文地址:https://blog.csdn.net/m0_49471668/article/details/133815558