当前位置: 首页 > news >正文

React中实现插槽效果的方案

文章目录

    • React实现插槽
      • children实现插槽
      • props实现插槽

React实现插槽

在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素

我们应该让使用者可以决定某一块区域到底存放什么内容

在这里插入图片描述

这种需求在Vue当中有一个固定的做法是通过slot来完成的,React呢?

在React中是没有插槽的概念的, 或者说在React中是不需要插槽的, 因为React对于这种需要插槽的情况非常灵活,有两种方案可以实现

组件的children子元素;

props属性传递React元素;

children实现插槽

每个组件都可以获取到 props.children:它包含组件的开始标签和结束标签之间的内容

例如我们实现一个navbar, 要求左边, 中间, 右边的内容是不固定的, 由使用者来决定到底放什么

  • 在父组件的子组件标签中写入要插入到子组件的元素
import React, { Component } from 'react'
import NavBar from './c-cpns/NavBar'

export class App extends Component {
  render() {
    return (
      <div>
        {/* 父组件将要插入到子组件的元素写到组件标签中 */}
        <NavBar>
          <button>按钮</button>
          <h2>标题</h2>
          <i>斜体</i>
        </NavBar>
      </div>
    )
  }
}

export default App
  • 在子组件中通过this.props可以获取到一个children属性, 该属性中包含子组件标签开始到结束之间的内容
import React, { Component } from 'react'
import './style.css'

export class NavBar extends Component {
  render() {
    // 在子组件通过props中的children, 获取到要插入的元素
    const { children } = this.props
    return (
      <div className='nav-bar'>
        <div className='left'>
          {children[0]}
        </div>
        <div className='center'>
          {children[1]}
        </div>
        <div className='right'>
          {children[2]}
        </div>
      </div>
    )
  }
}

export default NavBar

注意: 如果children中有多个元素, 那么children是一个数组, 数组中存放着所有内容; 如果只插入一个元素到子组件中, 那么children本身就是插入的该元素, 如下:

父组件中只插入了一个元素

return (
  <div>
    {/* 父组件将要插入到子组件的元素写到组件标签中 */}
    <NavBar>
      <button>按钮</button>
    </NavBar>
  </div>
)

子组件直接使用children即可

render() {
  // 在子组件通过props中的children, 获取到要插入的元素
  const { children } = this.props
  return (
    <div className='nav-bar'>
      <div className='left'>
        {children}
      </div>
    </div>
  )
}

props实现插槽

通过children实现的方案虽然可行,但是有一个弊端:通过索引值获取传入的元素很容易出错,不能精准的获取传入的原生

而且对顺序有严格的要求

另外一个种方案就是使用 props 实现(这个方案也是开发中使用的比较多的方案, 个人更推荐)

我们之间通过具体的属性名,可以让我们在传入和获取时更加的精准;

首先在父组件通过props的方式将要插入的元素传入到子组件中

import React, { Component } from 'react'
import NavBarTwo from './c-cpns/NavBarTwo'

export class App extends Component {

  render() {
    // 定义要传入到子组件的元素
    const leftSlot = <button>按钮</button>
    const centerSlot = <h2>标题</h2>
    const rightSlot = <i>斜体</i>

    return (
      <div>
        {/* 将插入的元素通过props的方式传入到子组件 */}
        <NavBarTwo
          leftSlot={leftSlot}
          centerSlot={centerSlot}
          rightSlot={rightSlot}
        />
      </div>
    )
  }
}

export default App

再在子组件中获取到传递的数据进行展示

import React, { Component } from 'react'

export class NavBarTow extends Component {
  render() {
    // 在子组件中获取到父组件传递过来的数据
    const { leftSlot, centerSlot, rightSlot } = this.props

    return (
      <div className='nav-bar'>
        {/* 将传递过来的数据进行展示 */}
        <div className='left'>
          {leftSlot}
        </div>
        <div className='center'>
          {centerSlot}
        </div>
        <div className='right'>
          {rightSlot}
        </div>
      </div>
    )
  }
}

export default NavBarTow

相关文章:

  • 一起Talk Android吧(第三百八十九回:介绍两种实现倒计时的方法)
  • SystemVerilog——线程以及线程之间的通信
  • Node.js 应用开发详解开篇词 Node.j 从工程化工具到后端服务应用的转变
  • 【Android】Android Binder进程间通信AIDL示例与源码分析
  • ARM学习(12)基于arm架构的嵌入式操作系统理解
  • pytorch利用hook【钩子】获取torch网络每层结构【附代码】
  • 快速了解Nginx的基本介绍
  • 字符串统计:strlen函数的讲解,及其模拟实现
  • Linux——什么是环境变量?
  • 关于软件定时器的一些讨论
  • 睿智的目标检测60——Pytorch搭建YoloV7目标检测平台
  • Vue教程-监听路由ve-router变化,命名视图,路由嵌套,路由参数,路由高亮,router-link,redirect,创建路由,
  • 知识点杂记
  • 微信小程序入门与实战之rpx响应式单位与flex布局
  • @RequestMapping用法详解
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • create-react-app做的留言板
  • go语言学习初探(一)
  • JS+CSS实现数字滚动
  • Mac转Windows的拯救指南
  • Python爬虫--- 1.3 BS4库的解析器
  • Rancher-k8s加速安装文档
  • React-flux杂记
  • React组件设计模式(一)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 编写符合Python风格的对象
  • 如何用vue打造一个移动端音乐播放器
  • 思否第一天
  • 小程序测试方案初探
  • 智能合约开发环境搭建及Hello World合约
  • 终端用户监控:真实用户监控还是模拟监控?
  • ​学习一下,什么是预包装食品?​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #162 (Div. 2)
  • #pragma once与条件编译
  • #stm32整理(一)flash读写
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (AngularJS)Angular 控制器之间通信初探
  • (Forward) Music Player: From UI Proposal to Code
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (LeetCode 49)Anagrams
  • (SpringBoot)第二章:Spring创建和使用
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三)Honghu Cloud云架构一定时调度平台
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)关于多人操作数据的处理策略
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 解决重复提交问题
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @RequestMapping用法详解