目錄
- 通過 children 屬性結合條件渲染
- 通過 children 和 slot 屬性實現具名插槽
- 通過 props 實現具名插槽
在 React 中,并沒有直接類似于 Vue 中的“插槽”機制(slot)。但是,React 可以通過
props
和
children
來實現類似插槽的功能,允許你將組件的內容進行靈活插入和替換。
通過 children 屬性結合條件渲染
通過 children 來傳遞任意數量的子元素,然后在組件內部通過位置進行條件渲染,從而實現插槽功能。
Layout 組件通過 children
渲染傳遞給它的所有子元素,而這些子元素可以是任何內容,類似于 Vue 中的默認插槽。雖然在某些情況下,children
已經是一個數組(例如多個子元素的情況),但 React.Children.toArray
會確保你始終獲得一個標準化的數組(過濾掉null、undefined
等數據)。
//子組件
const Layout = ({ children }) => {children = React.Children.toArray(children);console.log(children,'children')return (<div className="layout"><header>Header</header><main>{children}</main> {/* 這里的 children 就是父組件傳遞進來的內容 */}<footer>Footer</footer></div>);
};
//父組件
const App = () => {return (<Layout><h1>Hello, React!</h1><p>This is the main content of the page.</p></Layout>);
};
打印出children
,就是父組件標簽里內容編譯成的virtualDOM。
通過 children 和 slot 屬性實現具名插槽
在標簽上加slot
來標記標簽
//父組件
root.render(<><DemoOne title="REACT好好玩哦" x={10}><span slot="footer">我是頁腳</span><span>哈哈哈哈</span><span slot="header">我是頁眉</span></DemoOne></>
);
子組件根據children
屬性中的slot
來區分插槽
//子組件
const DemoOne = function DemoOne(props) {let { title, x, children } = props;children = React.Children.toArray(children);let headerSlot = [],footerSlot = [],defaultSlot = [];children.forEach(child => {// 傳遞進來的插槽信息,都是編譯為virtualDOM后傳遞進來的「而不是傳遞的標簽」let { slot } = child.props;if (slot === 'header') {headerSlot.push(child);} else if (slot === 'footer') {footerSlot.push(child);} else {defaultSlot.push(child);}});return <div className="demo-box">{headerSlot}<br /><h2 className="title">{title}</h2><span>{x}</span><br />{footerSlot}</div>;
};
通過 props 實現具名插槽
顯式傳遞 props 來模擬具名插槽,傳遞不同的內容到特定的插槽位置
const DemoOne = ({ title, x, children, footer, header }) => {return (<div className="demo-box"><h1>{title}</h1><div>{header}</div> {/* 渲染具名插槽 header */}<div>{children}</div> {/* 渲染默認插槽 */}<div>{footer}</div> {/* 渲染具名插槽 footer */}</div>);
};const App = () => {return (<DemoOne title="REACT好好玩哦" x={10} footer={<span>我是頁腳</span>} header={<span>我是頁眉</span>}><span>哈哈哈哈</span></DemoOne>);
};