【React知识点扫盲001】如何用React实现插槽

🤔 什么是插槽?

        插槽(slot)是一种用于在组件中插入内容的机制。它允许组件的使用者在组件的标记中插入自定义的内容,从而增强组件的灵活性和可重用性。React中插槽实现的核心就是要用双闭合<Component>...</Component>调用组件。双闭合里传递的内容,都会作为变成虚拟DOM放在组件参数props的children属性中!

        用人话来说,一个萝卜一个坑,插槽就相当于那个坑,你所想要自定义的内容,就是萝卜。

1️⃣ 具名插槽

        具名插槽(named slots)是一种通过给插槽命名的方式来定义插槽的内容。

        用上面的例子来说,就是给这个“坑”取个名字,比如说“A-坑”,那么只有”A-萝卜“才能进入这个坑,反之不能。

2️⃣ 匿名插槽

        匿名插槽(unnamed slots)是指没有被命名的插槽。

        用上面的例子来说,这个“坑”就是所有萝卜都能入驻。

🖥 如何用实现具名插槽?

1️⃣ 实现原理

        因为父组件传递过来的children实际上是个虚拟dom。所以,只要在原来传递的children加上一些props作为标记,然后循环进行判定,就可得出对应的具名插槽。

        ⚠️注意:传过来的虚拟DOM可能只有1个,此时不为数组,这就需要我们去把children转化为数组。

2️⃣ 实现方法

import React from 'react'

/**
 *  ⭐️ 具名插槽 ⭐️ 
 *  实现机制:因为父组件传递过来的children实际上是个虚拟dom。所以,只要在原来传递的children加 
 *  上一些props作为标记,然后循环进行判定,就可得出对应的具名插槽。
 *  ⚠️注意:传过来的虚拟DOM可能只有1个,此时不为数组,这就需要我们去把children转化为数组。
 */
const NamedSlot = (props) => {
    // 获取传递过来的插槽内容
    let children = React.Children.toArray(props?.children)

    // 定义插槽名称
    let firstSlot = [],
        secondSlot = [],
        defaultSlot = []

    children.forEach(child => {
        // 传递过来的插槽内容,都是编译为虚拟DOM,故只要去虚拟DOM里的props拿到对应的标记即可
        let { slotName } = child.props

        // 判断slotName属于哪一个位置
        switch (slotName) {
            case "firstSlot":
                firstSlot.push(child);
                break;
            case "secondSlot":
                secondSlot.push(child);
                break;
            default:
                defaultSlot.push(child);
                break;
        }
    })
    return (
        <React.Fragment>
            <div>
                {/* 这里放first */}
                {
                    firstSlot.map(item => {
                        return item
                    })
                }
            </div>
            <hr/>
            <div>
                {/* 这里放second */}
                {
                    secondSlot.map(item => {
                        return item
                    })
                }
            </div>
            <hr/>
            <div>
                {/* 这里放default */}
                {
                    defaultSlot.map(item => {
                        return item
                    })
                }
            </div>
        </React.Fragment>
    )
}
export default NamedSlot

💻 如何用实现匿名插槽?

1️⃣ 实现原理

        因为父组件传递过来的children实际上是个虚拟dom。所以,只要把原来的虚拟DOM遍历出来就好。

        ⚠️注意:传过来的虚拟DOM可能只有1个,此时不为数组,这就需要我们去把children转化为数组。

2️⃣ 实现方法

import React from 'react'

/**
 *  ⭐️ 匿名插槽 ⭐️ 
 *  实现机制:因为父组件传递过来的children实际上是个虚拟dom。所以,只要把原来的虚拟DOM遍历出来 
 *  就好了。
 *  ⚠️注意:传过来的虚拟DOM可能只有1个,此时不为数组,这就需要我们去把children转化为数组。
 */

const UnnamedSlot = (props) => {
    // 获取传递过来的插槽内容
    let children = React.Children.toArray(props?.children)

    return (
        <React.Fragment>
            {/* 直接遍历就好了 */}
            {
                children.map(item => {
                    return item
                })
            }
        </React.Fragment>
    )
}
export default UnnamedSlot

🧑🏻‍💻 使用效果

1️⃣ 目录结构

2️⃣ 组件使用

import React from 'react'
import NamedSlot from "./slotDemo/namedSlot";
import UnnamedSlot from "./slotDemo/unnamedSlot";

/**
 * 插槽实现的核心就是要用双闭合的方式调用组件,然后把插槽内容传递过去。
 */
const SlotForReact = () => {
    return (
        <React.Fragment>
            {/* 匿名插槽 */}
            <div style={{marginLeft:24}}>
                <h3>这里是匿名插槽</h3>
                <UnnamedSlot>
                    <div>匿名-1</div>
                    <div>匿名-2</div>
                    <div>匿名-3</div>
                    <div>匿名-4</div>
                    <div>匿名-5</div>
                </UnnamedSlot>
            </div>

            <hr/>

            {/* 具名插槽 */}
            <div style={{marginLeft:24}}>
                <h3>这里是具名插槽</h3>
                <NamedSlot>
                    <div slotName='firstSlot'>具名first-1</div>
                    <div slotName>具名default</div>
                    <div slotName='secondSlot'>具名second-1</div>
                    <div slotName='firstSlot'>具名first-2</div>
                    <div slotName='secondSlot'>具名second-2</div>
                </NamedSlot>
            </div>
        </React.Fragment>
    )
}
export default SlotForReact

3️⃣ 效果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是React中常用的一些知识点: 1. 组件:React将用户界面拆分为可重用的组件,组件是构建React应用的基本单元。组件可以是函数组件或者类组件。 2. JSX:JSX是一种类似于HTML的语法扩展,可以在JavaScript代码中编写类似HTML的结构。它允许我们以声明式方式描述UI组件的结构。 3. Props:Props是组件的属性,用于传递数据和配置参数给组件。通过props,我们可以向子组件传递数据并进行组件之间的通信。 4. State:State是用于存储和管理组件内部的数据的对象。当state发生变化时,React会自动重新渲染组件,并更新相应的视图。 5. 生命周期:React组件具有生命周期方法,这些方法在组件的不同阶段被调用,例如组件被创建、更新、卸载等。 6. Hooks:Hooks是React 16.8版本引入的特性,它允许我们在无需编写类组件的情况下使用状态和其他React特性。常用的Hooks包括useState、useEffect、useContext等。 7. 条件渲染:React允许我们根据条件来渲染不同的内容或组件。常用的条件渲染方式包括if语句、三元表达式和逻辑与(&&)运算符等。 8. 列表渲染:React提供了map方法来遍历数组或者列表,动态生成列表项。通过列表渲染,我们可以根据数据动态生成多个相似的组件。 9. 表单处理:React提供了一些事件和处理函数来方便地处理表单的输入和提交。通过onChange事件,我们可以监听表单元素的值变化,并将其保存到组件的state中。 10. 组件通信:React中的组件通信可以通过props、状态提升、上下文(Context)和全局状态管理工具(如Redux)等方式来实现。 这些是React中常用的知识点,当然还有更多深入的内容和特性可以学习和掌握。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值