Parent Component?Owner Component?是甚麼東西?
2025-02-121.19Front EndNextjsReact
如果你有在寫 React / Next.js,Parent Component(父元件)這個詞你應該耳熟能詳吧。但你知道還有個叫做「Owner Component」的東西嗎?
這兩個聽起來很像,實際上差很多。尤其當你的應用越寫越大,效能越來越卡,就會開始在意「到底是誰在控制這顆元件」,而不只是「誰包住它」。
先講什麼是 Parent?
Parent 就是最簡單的那種「我在 JSX 裡包住你」的關係。
function ProfilePage() { return ( <div> <h2>個人資料</h2> <UserCard /> </div> ); }
這邊 ProfilePage
是 UserCard
的 Parent,沒什麼問題,它直接把子元件放進自己的 render tree 裡。這樣的結構我們都很熟悉。
Owner 是什麼?有主控權的角色
Owner 指的是那個真的控制這顆元件的人,它決定要不要渲染它,決定它的 props 是什麼,甚至 props 怎麼變也都是它說了算。
我們來看個不一樣的例子:
function App() { const user = { name: "小明", age: 28 }; return ( <ProfilePage> <UserCard user={user} /> </ProfilePage> ); } function ProfilePage({ children }) { return ( <div> <h2>個人資料</h2> {children} </div> ); }
在這邊,App
才是 UserCard
的 Owner。它決定傳什麼 props,要不要顯示這顆元件。而 ProfilePage
只是個容器,包起來,但完全不碰 user
資料,也不知道你傳了什麼。
簡單講就是:
Parent:包住你,但不知道你幹嘛。
Owner:控制你,知道你幹嘛、讓你幹嘛。
為什麼要知道這個?因為 render 卡頓的時候很重要 !
當你的某個 Component 很愛 re-render,但它裡面其實什麼都沒改,那你就要開始懷疑是不是有誰在「牽連它」,讓它不小心也被 re-render 到。
這時候,把元件的 owner 角色切清楚就很有幫助。
比如這樣:
function App() { return ( <ProfileReRenderWrapper> <UserCard /> </ProfileReRenderWrapper > ); }
參考
https://julesblom.com/writing/parents-owners-data-flow
https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns