文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

React中怎么实现插槽

2023-07-05 17: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中怎么实现插槽

如果我们要控制每个位置渲染不一样的插槽内容

方式一 是使用数组的形式 但是无法保证每次传入的都是多个插槽值

这时需要使用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;

React中怎么实现插槽

具名插槽

当我们在父组件中对要插入的内容设置上名字后 想要依据不同的名字 渲染在不同的位置 并且顺序也不同时 我们可以采用具名插槽的方式

这里我们设置了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 /><h3 className="title">{title}</h3><span>{x}</span><br />{footerSlot}</div>);};export default DemoOne;

React中怎么实现插槽

以上就是“React中怎么实现插槽”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯