網站首頁 編程語言 正文
React實現插槽
在開發中,我們抽取了一個組件,但是為了讓這個組件具備更強的通用性,我們不能將組件中的內容限制為固定的div、span等等這些元素。
我們應該讓使用者可以決定某一塊區域到底存放什么內容
這種需求在Vue當中有一個固定的做法是通過slot來完成的,React呢?
在React中是沒有插槽的概念的, 或者說在React中是不需要插槽的, 因為React對于這種需要插槽的情況非常靈活,有兩種方案可以實現:
組件的children子元素;
props屬性傳遞React元素;
children實現插槽
每個組件都可以獲取到 props.children
:它包含組件的開始標簽和結束標簽之間的內容
。
例如我們實現一個navbar, 要求左邊, 中間, 右邊的內容是不固定的, 由使用者來決定到底放什么
在父組件的子組件標簽中寫入要插入到子組件的元素
import React, { Component } from 'react' import NavBar from './c-cpns/NavBar' export class App extends Component { render() { return ( <div> {/* 父組件將要插入到子組件的元素寫到組件標簽中 */} <NavBar> <button>按鈕</button> <h2>標題</h2> <i>斜體</i> </NavBar> </div> ) } } export default App
在子組件中通過this.props
可以獲取到一個children
屬性, 該屬性中包含子組件標簽開始到結束之間的內容
import React, { Component } from 'react' import './style.css' export class NavBar extends Component { render() { // 在子組件通過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中有多個元素, 那么children是一個數組, 數組中存放著所有內容; 如果只插入一個元素到子組件中, 那么children本身就是插入的該元素, 如下:
父組件中只插入了一個元素
return ( <div> {/* 父組件將要插入到子組件的元素寫到組件標簽中 */} <NavBar> <button>按鈕</button> </NavBar> </div> )
子組件直接使用children即可
render() { // 在子組件通過props中的children, 獲取到要插入的元素 const { children } = this.props return ( <div className='nav-bar'> <div className='left'> {children} </div> </div> ) }
props實現插槽
通過children實現的方案雖然可行,但是有一個弊端:通過索引值獲取傳入的元素很容易出錯,不能精準的獲取傳入的原生;
而且對順序有嚴格的要求
另外一個種方案就是使用 props 實現(這個方案也是開發中使用的比較多的方案, 個人更推薦):
我們之間通過具體的屬性名,可以讓我們在傳入和獲取時更加的精準;
首先在父組件通過props的方式將要插入的元素傳入到子組件中
render() { // 在子組件通過props中的children, 獲取到要插入的元素 const { children } = this.props return ( <div className='nav-bar'> <div className='left'> {children} </div> </div> ) }
再在子組件中獲取到傳遞的數據進行展示
import React, { Component } from 'react' export class NavBarTow extends Component { render() { // 在子組件中獲取到父組件傳遞過來的數據 const { leftSlot, centerSlot, rightSlot } = this.props return ( <div className='nav-bar'> {/* 將傳遞過來的數據進行展示 */} <div className='left'> {leftSlot} </div> <div className='center'> {centerSlot} </div> <div className='right'> {rightSlot} </div> </div> ) } } export default NavBarTow
原文鏈接:https://blog.csdn.net/m0_71485750/article/details/126634054
相關推薦
- 2022-08-28 failed to configure a datasource: ‘url‘ attribute
- 2022-05-13 C++ 減少臨時字符串對象的產生
- 2022-10-15 C++中?Sort函數詳細解析_C 語言
- 2023-03-22 Python利用模糊哈希實現對比文件相似度_python
- 2022-06-22 Git配置用戶簽名方式的拓展示例實現全面講解_其它綜合
- 2022-11-16 Oracle?刪除大量表記錄操作分析總結_oracle
- 2022-04-20 C語言函數棧幀的創建和銷毀詳解_C 語言
- 2022-04-09 SpringBoot 項目打包成jar包,并執行Jar文件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支