首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应性钩子(功能)生命周期:在useEffect()代码之前呈现的组件

反应性钩子(功能)生命周期:在useEffect()代码之前呈现的组件
EN

Stack Overflow用户
提问于 2021-04-16 17:14:10
回答 3查看 125关注 0票数 2

我用的是反应功能成分。我熟悉类生命周期,但不熟悉功能生命周期。我的问题是,这个组件是在useEffect().中执行的初始化完成之前呈现的。在我的return()中,我检查状态变量是否为真。

我首先看到了我的非错误布局( Main)

  • In & 2-3秒).屏幕更改为Error布局

处理功能组件的顺序是什么?在对错误条件进行评估之前,我无法显示非错误布局。

代码语言:javascript
复制
function App() {

    const [error, setError] = useState({});
    const [userInfo, setUserInfo] = useState({});

    const fetchUserInfo = async () => {
       const url = 'http://myapp.com/fetchUserInfo';
       try {
          const response = await axios.get(url);
          setUserInfo(response.data);
       }
       catch (error) { 
          setError(error);
       }
    }  

    // On initialization, fetch UserInfo
    useEffect(() => {    
        fetchUserInfo();
    }, []);

    return (
        <div className="App">
            <Router>
                <Header />
                
                {error.message
                    ? 
                        <Error error={error} /> 
                    :
                        <div>
                            <TopNav userInfo={userInfo} />
                            <Main userInfo={userInfo} />
                        </div>
                }
                
                <Footer />
            </Router>
        </div>
  );
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-16 17:22:24

useEffect回调函数是在呈现周期之后调用的,因此,一旦呈现完成,就会进行fetchUserInfo调用,这也是一个异步操作。

相反,您应该拥有一个加载状态,让UI等待,API将提供作为响应来显示适当的UI。

代码语言:javascript
复制
function App() {
    const [isLoading, setIsLoading] = useState(true);
    const [error, setError] = useState({});
    const [userInfo, setUserInfo] = useState({});

    const fetchUserInfo = async () => {
       const url = 'http://myapp.com/fetchUserInfo';
       setIsLoading(true);
       try {
          const response = await axios.get(url);
          setUserInfo(response.data);
       }
       catch (error) { 
          setError(error);
       }
       finally {
           setIsLoading(false);
       }
    }  

    // On initialization, fetch UserInfo
    useEffect(() => {    
        fetchUserInfo();
    }, []);

    return (
        <div className="App">
            <Router>
                <Header />
                
                {isLoading? <Loader />: error.message
                    ? 
                        <Error error={error} /> 
                    :
                        <div>
                            <TopNav userInfo={userInfo} />
                            <Main userInfo={userInfo} />
                        </div>
                }
                
                <Footer />
            </Router>
        </div>
  );
}
票数 2
EN

Stack Overflow用户

发布于 2021-04-16 17:23:08

查看您的代码,只有在异步函数fetchUserInfo被解析/拒绝后,才会得到错误/数据状态。您可以尝试添加第三个状态loading,以表示组件已经挂载,但数据获取正在进行中。

代码语言:javascript
复制
function App() {

  const [error, setError] = useState({});
  const [userInfo, setUserInfo] = useState({});
  const [loading, setLoading] = useState(true)

  const fetchUserInfo = async () => {
    setLoading(true);
    setError({})
    const url = 'http://myapp.com/fetchUserInfo';
    try {
      const response = await axios.get(url);
      setLoading(false);
      setUserInfo(response.data);
    }
    catch (error) {
      setLoading(false)
      setError(error);
    }
  }

  // On initialization, fetch UserInfo
  useEffect(() => {
    fetchUserInfo();
  }, []);

  return (
    <div className="App">
      <Router>
        <Header />

        {error.message && !loading
          ?
          <Error error={error} />
          :
          <div>
            <TopNav userInfo={userInfo} />
            <Main userInfo={userInfo} />
          </div>
        }

        <Footer />
      </Router>
    </div>
  );
}
票数 1
EN

Stack Overflow用户

发布于 2021-04-16 17:26:50

您的代码将按此顺序执行。

由于第一次呈现的rendered.

  • Execute是空的
  1. ,所以TopNav和Main将是useEffect钩子,调用fetchUserInfo函数。该错误或userInfo将被更新。由于状态已更改,
  2. 将再次呈现该页。在您的示例中,它将计算error.message并呈现相应的组件.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67129527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档