React中实现插槽效果的方案详解

 更新时间:2022年09月27日 14:36:09   作者:林有酒  
在React中是没有插槽的概念的, 或者说在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的方式将要插入的元素传入到子组件中

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

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

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

到此这篇关于React中实现插槽效果的方案的文章就介绍到这了,更多相关React实现插槽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React组件useReducer的讲解与使用

    React组件useReducer的讲解与使用

    在React函数式组件中,我们可以通过useState()来创建state,这种state创建方式会给我们返回两个东西state和setState()。
    2023-04-04
  • react native带索引的城市列表组件的实例代码

    react native带索引的城市列表组件的实例代码

    本篇文章主要介绍了react-native城市列表组件的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 关于react的代理配置(可配置多个代理)

    关于react的代理配置(可配置多个代理)

    这篇文章主要介绍了关于react的代理配置(可配置多个代理),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • React Hook 四种组件优化总结

    React Hook 四种组件优化总结

    这篇文章主要介绍了React Hook四种组件优化总结,文章围绕主题展开详细的内容介绍,具有一定的参考价孩子,需要的朋友可以参考一下
    2022-07-07
  • React Native 真机断点调试+跨域资源加载出错问题的解决方法

    React Native 真机断点调试+跨域资源加载出错问题的解决方法

    下面小编就为大家分享一篇React Native 真机断点调试+跨域资源加载出错问题的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • react-router-dom v6版本实现Tabs路由缓存切换功能

    react-router-dom v6版本实现Tabs路由缓存切换功能

    今天有人问我怎么实现React-Router-dom类似标签页缓存,很久以前用的是react-router v5那个比较容易实现,v6变化挺大,但了解react的机制和react-router的机制就容易了,本文介绍react-router-dom v6版本实现Tabs路由缓存切换,感兴趣的朋友一起看看吧
    2023-10-10
  • react 定位组件源码解析

    react 定位组件源码解析

    这篇文章主要为大家介绍了react定位组件源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • React-redux 中useSelector使用源码分析

    React-redux 中useSelector使用源码分析

    在一个 action 被分发(dispatch) 后,useSelector() 默认对 select 函数的返回值进行引用比较 ===,并且仅在返回值改变时触发重渲染,,这篇文章主要介绍了React-redux 中useSelector使用,需要的朋友可以参考下
    2023-10-10
  • react-native封装插件swiper的使用方法

    react-native封装插件swiper的使用方法

    这篇文章主要介绍了react-native封装插件swiper的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • React 正确使用useCallback useMemo的方式

    React 正确使用useCallback useMemo的方式

    这篇文章主要介绍了React 正确使用useCallback useMemo的方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08

最新评论