一文详解如何React中实现插槽

 更新时间:2023年03月27日 11:35:22   作者:_聪明勇敢有力气  
这篇文章主要为大家详细介绍了如何在React中实现插槽,文中的示例代码讲解详细,对我们的学习或工作具有一定的借鉴价值,需要的可以了解一下

React中实现插槽

设计插槽

在React中实现插槽需要我们自己来实现 主要用到props.children

我们以跟组件作为父组件

创建子组件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都变为数组形式

因为传递进来的插槽信息 都是编译为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插槽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React中useEffect 与 useLayoutEffect的区别

    React中useEffect 与 useLayoutEffect的区别

    本文主要介绍了React中useEffect与useLayoutEffect的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 浅谈React + Webpack 构建打包优化

    浅谈React + Webpack 构建打包优化

    本篇文章主要介绍了浅谈React + Webpack 构建打包优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 解决React报错Cannot find namespace context

    解决React报错Cannot find namespace context

    这篇文章主要为大家介绍了React报错Cannot find namespace context分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 详解React中的this指向

    详解React中的this指向

    这篇文章主要介绍了React中的this指向的相关资料,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下
    2021-04-04
  • react组件从搭建脚手架到在npm发布的步骤实现

    react组件从搭建脚手架到在npm发布的步骤实现

    这篇文章主要介绍了react组件从搭建脚手架到在npm发布的步骤实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 在 React 项目中使用 Auth0 并集成到后端服务的配置步骤详解

    在 React 项目中使用 Auth0 并集成到后端服务的配置步骤详解

    这篇文章主要介绍了在 React 项目中使用 Auth0 并集成到后端服务的配置步骤详解,通过本文详细步骤,您可以将 Auth0 集成到 React 项目并与后端服务交互,需要的朋友可以参考下
    2024-07-07
  • Vite搭建React项目的方法步骤

    Vite搭建React项目的方法步骤

    这篇文章主要介绍了Vite搭建React项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Suspense对React的意义及作用解析

    Suspense对React的意义及作用解析

    这篇文章主要为大家介绍了Suspense对React的意义及作用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解React中的todo-list

    详解React中的todo-list

    这篇文章主要介绍了React中的todo-list的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • react 项目中引入图片的几种方式

    react 项目中引入图片的几种方式

    本文主要介绍了react 项目中引入图片,本文详细的介绍了几种方法,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06

最新评论