自定义hook死循环问题

来源:14-16 Hooks使用中的几个注意事项

勤奋好学小提莫

2021-06-23

双越老师,我最近在搭一个开发环境,在处理用户信息的时候遇到了一个死循环的问题,我能想通为啥会出现死循环,但是不知道怎样优化最为合适,能给些建议吗?
Header组件:

import React from 'react';
import { Layout, Popover } from 'antd';
import { getToday } from '@/assets/js/transform';
import useUserInfo from './useUserInfo';
import styles from './Header.less';

function Header() {
  // 写了一个hook获取用户信息
  const userInfo = useUserInfo();
  console.log('userInfo = ', userInfo)
  return (
    <Layout.Header className={styles.container}>
      <div className={styles.userInfo}>
        <Popover
          content={userInfoContent}
          className={styles.user}
        >
          {`${userInfo.userName || '游客'},${meridiem}好!`}
        </Popover>
      </div>
    </Layout.Header>
  );
}

export default Header

Hook

import { useState } from 'react';
import { JSONParse, JSONStringify } from '@/assets/js/utils';
import { CACHE_USER_INFO } from '@/assets/js/constant';
import { getUserInfo } from '@/service/login/login';

function useUserInfo() {
  const [userInfo, setUserInfo] = useState({});
  const cacheUserInfo = JSONParse(window.localStorage.getItem(CACHE_USER_INFO));
  /**
   * 从缓存中拿,或者通过接口拿
   */
  if (cacheUserInfo) {
    setUserInfo(cacheUserInfo);
  } else {
    getUserInfo().then(({ success, data }) => {
      if (success) {
        setUserInfo(data);
        window.localStorage.setItem(CACHE_USER_INFO, JSONStringify(data));
      }
    })
  }
  return userInfo;
}

export default useUserInfo;
写回答

2回答

双越

2021-06-23

你写的 useUserInfo 中,怎么没有用到 useEffect 呢?

参考课程里的 useAxios 写就行

//img.mukewang.com/szimg/60d2fe0b091075b511081250.jpg

1
1
勤奋好学小提莫
谢谢老师,刚想通此事,脑子秀逗了...
2021-06-23
共1条回复

勤奋好学小提莫

提问者

2021-06-23

我想应该是 useUserInfo 中 需要使用 useState 会触发组件更新,然后组件更新的时候又会触发useUserInfo的执行。目前想到的解决方案是使用 useEffect 控制执行次数。

0
0

2024版 前端框架及项目面试 聚焦Vue3/React/Webpack

面向1-3年前端的框架及项目面试“刚需内容”

4664 学习 · 1644 问题

查看课程