亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用反應鉤子 useEffect 反應生命周期

使用反應鉤子 useEffect 反應生命周期

慕森王 2021-11-25 19:43:28
我目前從改變我的應用程序文件class與生命周期事件,如componentDidMount對functions與useEffect掛鉤。對于大多數文件,我沒有看到任何問題,但在下面,我遇到了應用程序凍結的性能問題??刂婆_中的錯誤或警告為零,但我的機器和 Chrome 增加了此選項卡上使用的內存。我錯過了什么?基于舊類的文件代碼listener: any;componentDidMount() {  const { firebase } = this.props;  this.listener = firebase.onAuthUserListener(    (authUser: any) => {      localStorage.setItem('authUser', JSON.stringify(authUser));      this.setState({ authUser });    },    () => {      localStorage.removeItem('authUser');      this.setState({ authUser: null });    }  );}componentWillUnmount() {  this.listener();}新的鉤子(導致性能問題)const listener = () => {  firebase.onAuthUserListener(    (authUser: any) => {      localStorage.setItem('authUser', JSON.stringify(authUser));      setState(authUser);    },    () => {      localStorage.removeItem('authUser');      setState(null);    }  );};useEffect(() => {  listener();  return () => {    listener();  };});可能還值得注意的是,我正在將 TypeScript 與 React 一起使用。
查看完整描述

3 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

onAuthUserListener返回一個取消訂閱的函數。這應該在組件卸載時使用。


在您的代碼中,您沒有返回取消訂閱功能。


const listener = () => {

  firebase.onAuthUserListener(..)    // problem here no return

}

所以在useEffect你應該正確分配它并在useEffect返回時使用它。


const [user, setUser] = React.useState(null);


useEffect(

  () => {

    //             v------ proper assignment.

    const listener = firebase.onAuthUserListener(

      (authUser: any) => {

        localStorage.setItem('authUser', JSON.stringify(authUser));

        setUser(authUser);

      },

      () => {

        localStorage.removeItem('authUser');

        setUser(null);

      }

    );


    return () => listener();

  }

  , [] // no deps

);


查看完整回答
反對 回復 2021-11-25
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

這里可能是錯誤:


useEffect(() => {

  listener();

  return () => {

    listener();  <--- here

  };

});

問題是,為了觸發listener();呼叫,需要改變什么狀態?


我認為這:


const listener = () => {

  firebase.onAuthUserListener(

    (authUser: any) => {

      localStorage.setItem('authUser', JSON.stringify(authUser));

      setState(authUser);

    },

    () => {

      localStorage.removeItem('authUser');

      setState(null);

    }

  );

};

應該轉化為一個 React Hook。干杯!


查看完整回答
反對 回復 2021-11-25
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

useEffect需要一個依賴數組作為第二個參數,否則它會在每次渲染時繼續運行。由于您正在更新狀態,因此只會不斷重復


useEffect(() => {

  listener();

  return () => {

    listener();

  };

}, []);



您可以使用Runaway Effects或 ESLint等工具進行靜態分析,以便事先弄清楚這些。


查看完整回答
反對 回復 2021-11-25
  • 3 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號