一文詳解如何React中實(shí)現(xiàn)插槽
React中實(shí)現(xiàn)插槽
設(shè)計(jì)插槽
在React中實(shí)現(xiàn)插槽需要我們自己來(lái)實(shí)現(xiàn) 主要用到props.children
我們以跟組件作為父組件
創(chuàng)建子組件DemoOne組件
import React from "react";
import ReactDOM from "react-dom/client";
import DemoOne from "./views/DemoOne";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<>
<DemoOne title="我是標(biāo)題" x={10}>
<span>哈哈哈</span>
<span>呵呵呵</span>
</DemoOne>
<DemoOne title="嘿嘿嘿">
<span>嘿嘿嘿</span>
</DemoOne>
<DemoOne title="哈哈哈" />
</>
);
import React from "react";
const DemoOne = function DemoOne(props) {
let {title, x, children } = props;
console.log(children);
return (
<div className="demo-BOX">
{children}
</div>
);
};
DemoOne.propTypes = {
title: PropTypes.string.isRequired,
x: PropTypes.number,
y: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),
};
export default DemoOne;
這里我們引入了三次子組件
我們先看看子組件中返回的children是什么

如果我們要控制每個(gè)位置渲染不一樣的插槽內(nèi)容
方式一 是使用數(shù)組的形式 但是無(wú)法保證每次傳入的都是多個(gè)插槽值
這時(shí)需要使用React.Children 對(duì)象中提供的額外方法 對(duì)props.children做處理: 其上有count\forEach\map\toArray等方法
在這些方法內(nèi)部 已經(jīng)對(duì)children做了各種形式的處理
我們可以直接使用
import React from "react";
const DemoOne = function DemoOne(props) {
let { title, x, children } = props;
if (!children) {
children = [];
} else if (!Array.isArray(children)) {
children = [children];
}
console.log(children);
return (
<div className="demo-BOX">
{children[0]}
{children[1]}
</div>
);
};
export default DemoOne;

具名插槽
當(dāng)我們?cè)诟附M件中對(duì)要插入的內(nèi)容設(shè)置上名字后 想要依據(jù)不同的名字 渲染在不同的位置 并且順序也不同時(shí) 我們可以采用具名插槽的方式
這里我們?cè)O(shè)置了footer與header
import React from "react";
import ReactDOM from "react-dom/client";
import DemoOne from "./views/DemoOne";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<>
<DemoOne title="我是標(biāo)題" x={10}>
<span slot='footer' >哈哈哈</span>
<span slot='header' >呵呵呵</span>
</DemoOne>
<DemoOne title="嘿嘿嘿">
<span>嘿嘿嘿</span>
</DemoOne>
<DemoOne title="哈哈哈" />
</>
);
我們可以先使用React.Children.toArray() 將children都變?yōu)閿?shù)組形式
因?yàn)閭鬟f進(jìn)來(lái)的插槽信息 都是編譯為virtualDOM后傳遞進(jìn)來(lái)的 而不是傳遞的標(biāo)簽
所以我們可以直接通過(guò).語(yǔ)法來(lái)獲取到props對(duì)象的slot屬性
這里定義三個(gè)數(shù)組用來(lái)存放 header footer 與 default
import React from "react";
const DemoOne = function DemoOne(props) {
let { title, x, children } = props;
children = React.Children.toArray(children);
let headerSlot = [],
footerSlot = [],
defaultSlot = [];
children.forEach((child) => {
//傳遞進(jìn)來(lái)的插槽信息 都是編譯為virtualDOM后傳遞進(jìn)來(lái)的 而不是傳遞的標(biāo)簽
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>
);
};
export default DemoOne;
到此這篇關(guān)于一文詳解如何React中實(shí)現(xiàn)插槽的文章就介紹到這了,更多相關(guān)React插槽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React?中hooks之?React.memo?和?useMemo用法示例總結(jié)
React.memo是一個(gè)高階組件,用于優(yōu)化函數(shù)組件的性能,通過(guò)記憶組件渲染結(jié)果來(lái)避免不必要的重新渲染,合理使用React.memo和useMemo可以顯著提升React應(yīng)用的性能,本文介紹React?中hooks之?React.memo?和?useMemo用法總結(jié),感興趣的朋友一起看看吧2025-01-01
React?Native項(xiàng)目設(shè)置路徑別名示例
這篇文章主要為大家介紹了React?Native項(xiàng)目設(shè)置路徑別名實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
原生實(shí)現(xiàn)一個(gè)react-redux的代碼示例
這篇文章主要介紹了原生實(shí)現(xiàn)一個(gè)react-redux的代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
React router cache route實(shí)現(xiàn)緩存頁(yè)面流程介紹
react-router自身沒(méi)有路由緩存的特性,在5.x版本之前,我們可以基于react-router-cache-route來(lái)實(shí)現(xiàn)路由緩存功能。但是react-router 6.x在實(shí)現(xiàn)上做了比較大的變化,react-router-cache-route沒(méi)有提供相應(yīng)的支持2023-01-01
React倒計(jì)時(shí)功能實(shí)現(xiàn)代碼——解耦通用
這篇文章主要介紹了React倒計(jì)時(shí)功能實(shí)現(xiàn)——解耦通用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
React路由參數(shù)傳遞與嵌套路由的實(shí)現(xiàn)詳細(xì)講解
這篇文章主要介紹了React路由參數(shù)傳遞與嵌套路由的實(shí)現(xiàn),嵌套路由原則是可以無(wú)限嵌套,但是必須要讓使用二級(jí)路由的一級(jí)路由匹配到,否則不顯示,需要的朋友可以參考一下2022-09-09
react+antd select下拉框?qū)崿F(xiàn)模糊搜索匹配的示例代碼
我們?cè)陂_(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)出現(xiàn)下拉框數(shù)據(jù)很多得情況,本文主要介紹了react+antd select下拉框?qū)崿F(xiàn)模糊搜索匹配的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
關(guān)于React中使用window.print()出現(xiàn)頁(yè)面無(wú)響應(yīng)問(wèn)題解決記錄
這篇文章主要介紹了React中使用window.print()出現(xiàn)頁(yè)面無(wú)響應(yīng)問(wèn)題解決記錄,首先問(wèn)題原因可能是操作了document但是并未進(jìn)行銷毀(可能是),具體問(wèn)題解決思路參考下本文吧2021-11-11

