新增勾點

已完成

您可以使用效果勾點隨時留意應用程式的狀態,並執行程式碼以回應更新。 我們會使用 useEffect 來註冊想要執行的函式,以回應變更。

案例

我們的應用程式可讓使用者按一下個別項目,並標示為備妥。 如果某些項目尚未準備好,則需要要顯示訊息請繼續切菜。當所有項目都完成時,我們想要顯示準備工作完成!

我們會藉由新增新的狀態物件來設定此行為。 我們將從效果勾點更新物件。

重要

在範例中,我們會修改 useEffect 內部的狀態。 依預設,每當修改「任何」具狀態的物件時,就會執行 useEffect。 此行為可以建立無限迴圈。 在此迴圈中,我們會修改狀態並執行勾點,以修改狀態,進而執行勾點,周而復始。

為了避免無限迴圈,可以使用 useEffect 中的相依性參數來查看一個物件。 可以在建立程式碼時這麼做。

新增新狀態屬性

  1. 開啟 App.jsx 檔案。

  2. 若要新增新的 state 屬性,請將下列程式碼插入至讀取的行下方:TODO: Add new state property

    // TODO: Add new state property
    const [ prepared, setPrepared ] = useState(false);
    

新增效果勾點接聽程式

若要新增效果勾點接聽程式,請將下列程式碼插入至讀取的行下方:TODO: Add the effect hook

// TODO: Add the effect hook
useEffect(() => {
    setPrepared(recipe.ingredients.every(i => i.prepared));
}, [recipe]);

程式碼會使用 setPrepared 更新 prepared。 也會使用 每個方法,根據符合我們所指定準則的每個項目,傳回布林值。 在我們的案例中,會檢查是否每個項目都已準備好。 若沒有,方法會傳回錯誤。

useEffect 中的第二個參數會設為 [recipe]。 這項設定提供相依性,以確保我們的程式碼只有在 recipe 物件變更時「才會」執行。

新增顯示

如果準備工作完成,現在將訊息顯示給使用者。 若要這麼做,在讀取的行之下,新增下列程式碼:TODO: Add the prep work display

{/* TODO: Add the prep work display */}
{ prepared ? <h2>Prep work done!</h2> : <h2>Just keep chopping.</h2>}

現在看看 prepared 物件。 若為 true,則會顯示準備工作完成!否則,我們會顯示請繼續切菜。

測試頁面

  1. 儲存所有檔案。
  2. 回到您的瀏覽器並重新整理頁面。
  3. 選取食材並全部標示為已備妥。 (應該會選取清單中的所有食材。) 頁面底部的文字會更新。