一文詳解如何React中實現插槽
React中實現插槽
設計插槽
在React中實現插槽需要我們自己來實現 主要用到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="我是標題" 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是什么

如果我們要控制每個位置渲染不一樣的插槽內容
方式一 是使用數組的形式 但是無法保證每次傳入的都是多個插槽值
這時需要使用React.Children 對象中提供的額外方法 對props.children做處理: 其上有count\forEach\map\toArray等方法
在這些方法內部 已經對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;

具名插槽
當我們在父組件中對要插入的內容設置上名字后 想要依據不同的名字 渲染在不同的位置 并且順序也不同時 我們可以采用具名插槽的方式
這里我們設置了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="我是標題" x={10}>
<span slot='footer' >哈哈哈</span>
<span slot='header' >呵呵呵</span>
</DemoOne>
<DemoOne title="嘿嘿嘿">
<span>嘿嘿嘿</span>
</DemoOne>
<DemoOne title="哈哈哈" />
</>
);
我們可以先使用React.Children.toArray() 將children都變?yōu)閿到M形式
因為傳遞進來的插槽信息 都是編譯為virtualDOM后傳遞進來的 而不是傳遞的標簽
所以我們可以直接通過.語法來獲取到props對象的slot屬性
這里定義三個數組用來存放 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) => {
//傳遞進來的插槽信息 都是編譯為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>
);
};
export default DemoOne;
到此這篇關于一文詳解如何React中實現插槽的文章就介紹到這了,更多相關React插槽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在create-react-app中使用css modules的示例代碼
這篇文章主要介紹了在create-react-app中使用css modules的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07

