當您使用 react 并擁有同一組件的多個實例時,管理狀態可能會變得很棘手。根據組件需要交互的方式,您需要以不同的方式處理狀態。這是我發現效果很好的方法。
獨立實例:將狀態保留在組件內部
如果您的組件不需要相互通信,最好將它們的狀態保留在組件內。這樣,每個實例都有自己的狀態,其中一個實例的更改不會影響其他實例。
function counter() { const [count, setcount] = usestate(0); return ( <div> <p>count: {count}</p> <button onclick="{()"> setcount(count + 1)}>increment</button> </div> ); } // usage <counter></counter> // instance 1 <counter></counter> // instance 2
登錄后復制
在這里,每個 counter 組件都會跟蹤自己的計數。因此,如果您單擊一個計數器中的按鈕,則不會更改另一個計數器中的計數。
依賴實例:管理父組件中的狀態
但是,如果組件需要共享某些狀態或以協調的方式工作,最好將狀態移至父組件。父級可以管理共享狀態并將其作為 props 傳遞下來。這可確保所有實例保持同步并順利協同工作。
function Parent() { const [sharedCount, setSharedCount] = useState(0); return ( <div> <p>Total Count: {sharedCount}</p> <counter count="{sharedCount}" setcount="{setSharedCount}"></counter><counter count="{sharedCount}" setcount="{setSharedCount}"></counter> </div> ); } function Counter({ count, setCount }) { return ( <div> <p>Count: {count}</p> <button onclick="{()"> setCount(count + 1)}>Increment</button> </div> ); }
登錄后復制
這種方法之所以有效,是因為當狀態位于父組件中時,對該狀態的任何更新都會觸發所有實例的重新渲染,確保它們都顯示最新的 ui。如果將狀態單獨保存在每個實例中,則只有狀態發生更改的實例才會重新渲染,從而導致實例之間的 ui 不一致。
我的項目中的示例
我在構建手風琴組件時發現了這一點。這是我自己工作中的兩個例子:
獨立手風琴實例:示例。在此設置中,每個手風琴實例獨立工作。
依賴的手風琴實例:示例。在此版本中,所有手風琴實例相互依賴并保持同步。
快速回顧
如果組件單獨工作,請將狀態保存在每個組件內。
如果他們需要共享狀態或以協調的方式一起工作,請在父級中管理狀態。
在構建這些手風琴示例時,這種方法對我產生了很大的影響。希望對你也有幫助!