React实现类似于Vue中的插槽的效果

最近刚开始接触React,感觉React比Vue更灵活一些,但是感觉代码确实维护的时候可读性也没有Vue好(可能是因为我太菜了),Vue中很多都是自己的API, 看到这个api就知道想要实现的是什么功能,但是react 需要自己去读一下代码或者有好的代码注释习惯更好。

比如 Vue 中有一个插槽的概念,可以任意放置内容,那么灵活的 React要怎么实现这个功能呢,这篇文章主要就是记录一下“React实现类似于Vue中的插槽的效果”

搭建项目

// 创建项目
npx create-react-app my-app --template typescript

// 运行项目
yarn start
  1. 首先,我们需要将代码中的一些无用代码都删除掉,只留下index.tsx 和 App.tsx 即可;

  2. 新建 react-slot 文件夹,文件夹内新建 index.tsx;

  3. 新建 NavBar 组件和 navbar.css 样式文件;

    完成之后,结构如下:

    image.png

实现方式1

使用 props.children

// NavBar.tsx

import React from 'react'
import './navbar.css'

type Props = {
  children: any[]
}
const NavBar = (props:Props) => {
  return (
    <div className='navbar-container'>
      <div className='navbar-left'>
        {props.children[0]}
      </div>
      <div className='navbar-center'>
        {props.children[1]}
      </div>
      <div className='navbar-right'>
        {props.children[2]}
      </div>
    </div>
  )
}

export default NavBar
// index.tsx

import React from 'react'
import NavBar from './NavBar'

const ReactSlot = () => {
  return (
    <div>
      <NavBar>
        <div>left---这里内容可以随意填充</div>
        <div>center---这里内容可以随意填充</div>
        <div>right---这里内容可以随意填充</div>
      </NavBar>
    </div>
  )
}

export default ReactSlot

实现方式2

实现方式1比较好理解,但是存在一个缺陷——三个子元素缺1不可,并且顺序不可以错误,代码不宜读;

实现方式2则是通过传值的方式,将 jsx 代码传递过去,可以一一对应,并且使用 leftSlot 等语义化的词使得功能更易理解;

// NavBar.tsx

import React, { ReactNode } from 'react'
import './navbar.css'

type Props = {
  leftSlot: ReactNode
  centerSlot: ReactNode
  rightSlot: ReactNode
}
const NavBar = (props:Props) => {
  return (
    <div className='navbar-container'>
      <div className='navbar-left'>
        {props.leftSlot}
      </div>
      <div className='navbar-center'>
        {props.centerSlot}
      </div>
      <div className='navbar-right'>
        {props.rightSlot}
      </div>
    </div>
  )
}

export default NavBar
// index.tsx

import React from 'react'
import NavBar from './NavBar'

const ReactSlot = () => {
  return (
    <div>
      <NavBar 
        leftSlot={<div>left---这里内容可以随意填充</div>}
        centerSlot={<div>center---这里内容可以随意填充</div>}
        rightSlot={<div>right---这里内容可以随意填充</div>}
      ></NavBar>
    </div>
  )
}

export default ReactSlot

最终效果展示

上面两种实现方式都是使用这份 css 样式

// navbar.css

.navbar-container {
  display: flex;
  height: 50px;
  flex-direction: row;
  text-align: center;
  line-height: 50px;
}

.navbar-left {
  width: 20%;
  background-color: plum;
}

.navbar-center {
  width: 60%;
  background-color: bisque;
}
.navbar-right {
  width: 20%;
  background-color: lavender;
}

两种实现方式的页面效果都一样,如下图所示:
image.png

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React没有内置的TabPane组件缓存功能类似Vue的keep-alive。但是我们可以通过以下方法来实现类似的缓存效果。 一种方法是利用React的状态管理机制,结合条件渲染来实现TabPane的缓存。具体步骤如下: 1. 在TabPane组件的父组件,创建一个状态变量用于标识当前选择的Tab。 2. 在TabPane组件,根据该状态变量的值来决定是否渲染该Tab内容。 3. 当切换Tab时,只修改状态变量的值而不重新渲染TabPane组件,以达到缓存的效果。 示例代码如下: ```jsx import React, { useState } from 'react'; const App = () => { const [currentTab, setCurrentTab] = useState(0); const handleTabChange = (index) => { setCurrentTab(index); }; return ( <div> <ul> <li onClick={() => handleTabChange(0)}>Tab 1</li> <li onClick={() => handleTabChange(1)}>Tab 2</li> <li onClick={() => handleTabChange(2)}>Tab 3</li> </ul> <div> {currentTab === 0 && <TabContent1 />} {currentTab === 1 && <TabContent2 />} {currentTab === 2 && <TabContent3 />} </div> </div> ); }; const TabContent1 = () => { return <div>Tab 1 Content</div>; }; const TabContent2 = () => { return <div>Tab 2 Content</div>; }; const TabContent3 = () => { return <div>Tab 3 Content</div>; }; export default App; ``` 通过上述方法,只有当前选择的Tab内容会被渲染,而其他Tab的内容则会被缓存,达到类似Vue的keep-alive的效果。 另外,还可以使用第三方库如`react-tabs`或`react-router`等来实现类似的Tab缓存功能,这些库提供了更丰富的Tab组件并且内置了缓存功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值