React - 插槽


什么是插槽

在 Vue 中专门为我们提供了插槽这样一个概念,不过与 React 的插槽还是有些区别的,其实 React 的插槽很容易理解,我们根据一个例子来引出:我们都知道组件之间通信的时候我们会经常使用 context 方案,那么为什么包裹在 GlobalContext.Provider 中的组件可以正常显示,而下面的这段代码却不能显示呢?

import React, { Component } from "react"

class Son extends Component {
	render() {
		return (
			<section>
				<span>Hello React</span>
			</section>
		)
	}
}

export default class App extends Component {
	render() {
		return (
			<section>
				<Son>
					<span> 🚀 </span>
				</Son>
			</section>
		)
	}
}

// 页面显示 Hello React ,没有显示 Son 组件中包裹的 🚀

这就引出我们的插槽了,使用插槽我们就可以将 Son 子组件中包裹的结构也显示出来了:在子组件中使用 this.props.children 就可以访问到了

import React, { Component } from "react"

class Son extends Component {
	render() {
		return (
			<section>
				<span>Hello React</span>
				{this.props.children}
				{this.props.children}
				{this.props.children}
			</section>
		)
	}
}

export default class App extends Component {
	render() {
		return (
			<section>
				<Son>
					<span> 🚀 </span>
				</Son>
			</section>
		)
	}
}

// 页面显示 Hello React 🚀 🚀 🚀

COOL!! 😀

所以我们应该怎么理解?? 一句话:相当于把这些标签或者说页面结构当成属性一样挂载到了子组件上,子组件通过 props 属性语法即可访问到并插入到我们的子组件页面结构当中

如果我们放置多个标签,想要自己控制内容的排序也很简单,插槽获取到的是一个数组

import React, { Component } from "react"

class Son extends Component {
	render() {
		console.log(this.props.children)
		return (
			<section>
				<span>Hello React</span>
				{this.props.children}
				{this.props.children}
				{this.props.children}
			</section>
		)
	}
}

export default class App extends Component {
	render() {
		return (
			<section>
				<Son>
					<br></br>
					<span> 🚀 1</span>
					<br></br>
					<span> 🚀 2</span>
					<br></br>
					<span> 🚀 3</span>
					<br></br>
				</Son>
			</section>
		)
	}
}

// Hello React
// 🚀 1
// 🚀 2
// 🚀 3

// 🚀 1
// 🚀 2
// 🚀 3

// 🚀 1
// 🚀 2
// 🚀 3

插槽排序

既然它是一个数组,那么排序也就不算一个问题了 😁

import React, { Component } from "react"

class Son extends Component {
	render() {
		console.log(this.props.children)
		return (
			<section>
				<span>Hello React</span>
				{this.props.children[6]}
				{this.props.children[5]}
				{this.props.children[4]}
				{this.props.children[3]}
				{this.props.children[2]}
				{this.props.children[1]}
				{this.props.children[0]}
			</section>
		)
	}
}

export default class App extends Component {
	render() {
		return (
			<section>
				<Son>
					<br></br>
					<span> 🚀 1</span>
					<br></br>
					<span> 🚀 2</span>
					<br></br>
					<span> 🚀 3</span>
					<br></br>
				</Son>
			</section>
		)
	}
}

// Hello React
// 🚀 3
// 🚀 2
// 🚀 1

一句话说明白插槽有什么用处?

尽可能减少父子通信

标签在父组件中可以访问到父组件中的状态,使用插槽把标签显示在页面子组件中,省略了父子通信

  • 缺点:我们不应该过多的使用这种方法,否则会造成父组件的臃肿,这是大忌

省去繁琐的判断 增加复用性

子组件填充插槽开发好空间布局,在父组件中子标签可以随意的书写所需要的结构或者样式,提高复用性,不需要繁琐的进行判断,节省代码量,更易阅读

React 中的插槽抽屉是一种常见的 UI 组件,用于在页面上创建一个可以展开或折叠的侧边栏或底部面板。它通常用于显示额外的内容,例如菜单、设置选项或通知。 在 React 中实现插槽抽屉可以通过以下步骤: 1. 创建一个 React 组件来表示抽屉,并在组件的状态中跟踪抽屉的展开/折叠状态。 2. 在组件的渲染方法中,根据抽屉的状态决定是否渲染抽屉内容。可以使用条件渲染或 CSS 类控制显示/隐藏样式。 3. 在页面的其他部分添加一个触发器,例如按钮或链接,用于切换抽屉的展开/折叠状态。这个触发器可以调用组件中的一个方法来更新状态。 下面是一个简单的示例代码,展示了如何实现一个基本的插槽抽屉: ```jsx import React, { useState } from "react"; const Drawer = () => { const [isOpen, setIsOpen] = useState(false); const toggleDrawer = () => { setIsOpen(!isOpen); }; return ( <div> <button onClick={toggleDrawer}>Toggle Drawer</button> {isOpen && <div className="drawer-content">Drawer Content</div>} </div> ); }; export default Drawer; ``` 在上面的代码中,`isOpen` 状态用于跟踪抽屉的展开/折叠状态。当点击按钮时,`toggleDrawer` 方法会更新 `isOpen` 状态的值,从而控制抽屉的显示与隐藏。根据 `isOpen` 的值,决定是否渲染抽屉内容。 你可以根据自己的需求来扩展这个示例,并添加适当的样式和动画效果。希望这个示例对你有帮助!如果需要更多的信息或代码示例,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Try Tomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值