我有這個程式碼:
const ChatsPage = () => { let username = "" let secret = "" useEffect(() => { axios .post('http://localhost:3001/authenticate') .then((response) => { username = response.data.username secret = response.data.secret }) .catch((error) => { console.log(error); }); }, []); let chatProps = useMultiChatLogic('xxxxx-xxx-xxx-xxx-xxx', username, secret); return ( <div style={{ height: '100vh' }}> <MultiChatSocket {...chatProps} /> <MultiChatWindow {...chatProps} style={{ height: '100vh' }} /> </div> ); }
問題在於 let chatProps = useMultiChatLogic('xxxx-xx-x-xx-xxx', username, Secret);
在 useEffect
完成之前執行。我嘗試將其移至 .then 內部,但它給出了鉤子錯誤和其他一些東西,但沒有任何效果。
我認為您缺少對 React 的基本了解。查看有關狀態、
useEffect
和一般控制流程的教學。useEffect
是異步的-首次渲染後以及每當設定依賴項陣列中捕獲的變數時,React 都會執行回呼。您的依賴項陣列為空,因此此useEffect
在元件的生命週期中(在第一次渲染之後)執行一次。我不知道 Multi 是什麼,但你可以嘗試這樣的東西:
在這裡,在第一次渲染時,我們知道請求尚未完成,因為
username
和secret
仍然是預設的空字串,因此我們渲染一條載入訊息。渲染後,useEffect
運行並啟動請求。過了一會兒,回應到達,我們為
username
和secret
設定狀態,這會觸發另一個渲染。在此渲染上,回應中的username
和secret
值可用(我假設它們保證在回應中為非空字串),因此不會渲染載入訊息。相反,我們渲染ChatsPage
元件,該元件接受帶有回應資料的 props。額外的元件是必要的,因為像
useMultiChatLogic
這樣的鉤子必須在任何條件之上聲明.如果這不是一個鉤子,那麼呼叫可以發生在if
之後的元件函數體中,不需要額外的元件。React 的黃金法則是狀態是不可變的,因此如果任何資料從一個渲染到下一個渲染發生更改,則必須透過
setState
來完成,而不是=
。