唐河做網(wǎng)站網(wǎng)站推廣鄭州
通常,您將通過 props 將信息從父組件傳遞到子組件。但是,如果必須將道具傳遞到中間的許多組件,或者應用中的許多組件需要相同的信息,則傳遞道具可能會變得冗長且不方便。Context 允許父組件將一些信息提供給其下樹中的任何組件(無論其深度如何),而無需通過 prop 顯式傳遞它。
傳遞道具的問題
傳遞道具是將數(shù)據(jù)通過 UI 樹顯式傳遞到使用它的組件的好方法。
但是,當您需要將一些道具深入樹中傳遞時,或者如果許多組件需要相同的道具時,傳遞道具可能會變得冗長和不方便。最接近的共同祖先可能與需要數(shù)據(jù)的組件相距甚遠,將狀態(tài)提升到如此高的水平可能會導致一種稱為“支柱鉆孔”的情況。
如果有一種方法可以在不傳遞道具的情況下將數(shù)據(jù)“傳送”到樹中需要它的組件,那不是很好嗎?有了 React 的上下文功能,就有了!
上下文:傳遞道具的替代方案
Context 允許父組件向其下的整個樹提供數(shù)據(jù)。上下文有很多用途。下面是一個例子??紤]以下接受 a 大小的組件:Heading
level
import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section><Heading level={1}>Title</Heading><Heading level={2}>Heading</Heading><Heading level={3}>Sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading><Heading level={5}>Sub-sub-sub-heading</Heading><Heading level={6}>Sub-sub-sub-sub-heading</Heading></Section>);
}
export default function Section({ children }) {return (<section className="section">{children}</section>);
}
export default function Heading({ level, children }) {switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw Error('Unknown level: ' + level);}
}
假設您希望同一標題中的多個標題始終具有相同的大小:Section
import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section><Heading level={1}>Title</Heading><Section><Heading level={2}>Heading</Heading><Heading level={2}>Heading</Heading><Heading level={2}>Heading</Heading><Section><Heading level={3}>Sub-heading</Heading><Heading level={3}>Sub-heading</Heading><Heading level={3}>Sub-heading</Heading><Section><Heading level={4}>Sub-sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading></Section></Section></Section></Section>);
}
export default function Section({ children }) {return (<section className="section">{children}</section>);
}
export default function Heading({ level, children }) {switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw Error('Unknown level: ' + level);}
}
目前,您將 prop 分別傳遞給每個:level
<Heading>
<Section>
<Heading level={3}>About</Heading>
<Heading level={3}>Photos</Heading>
<Heading level={3}>Videos</Heading>
</Section>
如果您可以將 prop 傳遞給組件并將其從 .這樣,您可以強制同一部分中的所有標題都具有相同的大小:level
<Section>
<Heading>
<Section level={3}>
<Heading>About</Heading>
<Heading>Photos</Heading>
<Heading>Videos</Heading>
</Section>