React中實(shí)現(xiàn)插槽效果的方案詳解
React實(shí)現(xiàn)插槽
在開(kāi)發(fā)中,我們抽取了一個(gè)組件,但是為了讓這個(gè)組件具備更強(qiáng)的通用性,我們不能將組件中的內(nèi)容限制為固定的div、span等等這些元素。
我們應(yīng)該讓使用者可以決定某一塊區(qū)域到底存放什么內(nèi)容

這種需求在Vue當(dāng)中有一個(gè)固定的做法是通過(guò)slot來(lái)完成的,React呢?
在React中是沒(méi)有插槽的概念的, 或者說(shuō)在React中是不需要插槽的, 因?yàn)镽eact對(duì)于這種需要插槽的情況非常靈活,有兩種方案可以實(shí)現(xiàn):
組件的children子元素;
props屬性傳遞React元素;
children實(shí)現(xiàn)插槽
每個(gè)組件都可以獲取到 props.children:它包含組件的開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽之間的內(nèi)容。
例如我們實(shí)現(xiàn)一個(gè)navbar, 要求左邊, 中間, 右邊的內(nèi)容是不固定的, 由使用者來(lái)決定到底放什么
在父組件的子組件標(biāo)簽中寫(xiě)入要插入到子組件的元素
import React, { Component } from 'react'
import NavBar from './c-cpns/NavBar'
export class App extends Component {
render() {
return (
<div>
{/* 父組件將要插入到子組件的元素寫(xiě)到組件標(biāo)簽中 */}
<NavBar>
<button>按鈕</button>
<h2>標(biāo)題</h2>
<i>斜體</i>
</NavBar>
</div>
)
}
}
export default App
在子組件中通過(guò)this.props可以獲取到一個(gè)children屬性, 該屬性中包含子組件標(biāo)簽開(kāi)始到結(jié)束之間的內(nèi)容
import React, { Component } from 'react'
import './style.css'
export class NavBar extends Component {
render() {
// 在子組件通過(guò)props中的children, 獲取到要插入的元素
const { children } = this.props
return (
<div className='nav-bar'>
<div className='left'>
{children[0]}
</div>
<div className='center'>
{children[1]}
</div>
<div className='right'>
{children[2]}
</div>
</div>
)
}
}
export default NavBar
注意: 如果children中有多個(gè)元素, 那么children是一個(gè)數(shù)組, 數(shù)組中存放著所有內(nèi)容; 如果只插入一個(gè)元素到子組件中, 那么children本身就是插入的該元素, 如下:
父組件中只插入了一個(gè)元素
return (
<div>
{/* 父組件將要插入到子組件的元素寫(xiě)到組件標(biāo)簽中 */}
<NavBar>
<button>按鈕</button>
</NavBar>
</div>
)
子組件直接使用children即可
render() {
// 在子組件通過(guò)props中的children, 獲取到要插入的元素
const { children } = this.props
return (
<div className='nav-bar'>
<div className='left'>
{children}
</div>
</div>
)
}
props實(shí)現(xiàn)插槽
通過(guò)children實(shí)現(xiàn)的方案雖然可行,但是有一個(gè)弊端:通過(guò)索引值獲取傳入的元素很容易出錯(cuò),不能精準(zhǔn)的獲取傳入的原生;
而且對(duì)順序有嚴(yán)格的要求
另外一個(gè)種方案就是使用 props 實(shí)現(xiàn)(這個(gè)方案也是開(kāi)發(fā)中使用的比較多的方案, 個(gè)人更推薦):
我們之間通過(guò)具體的屬性名,可以讓我們?cè)趥魅牒瞳@取時(shí)更加的精準(zhǔn);
首先在父組件通過(guò)props的方式將要插入的元素傳入到子組件中
render() {
// 在子組件通過(guò)props中的children, 獲取到要插入的元素
const { children } = this.props
return (
<div className='nav-bar'>
<div className='left'>
{children}
</div>
</div>
)
}
再在子組件中獲取到傳遞的數(shù)據(jù)進(jìn)行展示
import React, { Component } from 'react'
export class NavBarTow extends Component {
render() {
// 在子組件中獲取到父組件傳遞過(guò)來(lái)的數(shù)據(jù)
const { leftSlot, centerSlot, rightSlot } = this.props
return (
<div className='nav-bar'>
{/* 將傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行展示 */}
<div className='left'>
{leftSlot}
</div>
<div className='center'>
{centerSlot}
</div>
<div className='right'>
{rightSlot}
</div>
</div>
)
}
}
export default NavBarTow
到此這篇關(guān)于React中實(shí)現(xiàn)插槽效果的方案的文章就介紹到這了,更多相關(guān)React實(shí)現(xiàn)插槽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React 項(xiàng)目中動(dòng)態(tài)設(shè)置環(huán)境變量
本文主要介紹了React 項(xiàng)目中動(dòng)態(tài)設(shè)置環(huán)境變量,本文將介紹兩種常用的方法,使用 dotenv 庫(kù)和通過(guò)命令行參數(shù)傳遞環(huán)境變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
使用React hook實(shí)現(xiàn)remember me功能
相信大家在使用 React 寫(xiě)頁(yè)面的時(shí)候都遇到過(guò)完成 Remember me 的需求吧!本文就將這個(gè)需求封裝在一個(gè) React hook 中以供后續(xù)的使用,覺(jué)得有用的同學(xué)可以收藏起來(lái)以備不時(shí)之需,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-04-04
React中使用axios發(fā)送請(qǐng)求的幾種常用方法
本文主要介紹了React中使用axios發(fā)送請(qǐng)求的幾種常用方法,主要介紹了get和post請(qǐng)求,具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
React?Hooks--useEffect代替常用生命周期函數(shù)方式
這篇文章主要介紹了React?Hooks--useEffect代替常用生命周期函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
react hooks實(shí)現(xiàn)防抖節(jié)流的方法小結(jié)
這篇文章主要介紹了react hooks實(shí)現(xiàn)防抖節(jié)流的幾種方法,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
React Router 5.1.0使用useHistory做頁(yè)面跳轉(zhuǎn)導(dǎo)航的實(shí)現(xiàn)
本文主要介紹了React Router 5.1.0使用useHistory做頁(yè)面跳轉(zhuǎn)導(dǎo)航的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

