likes
comments
collection
share

如何使用 Ts+react自定义面包屑导航

作者站长头像
站长
· 阅读数 34

功能示例展示:

官方示例:

如何使用 Ts+react自定义面包屑导航

封装完成的示例:

如何使用 Ts+react自定义面包屑导航

技术栈:JS+TS+React+React节点克隆+React组件通信

面包屑导航作用就是标识当前在那个路由页面

面包屑导航使用方法如下:


import Breadcrumb from '@/components/Breadcrumb'

const Article = () => {
  return <div>
    // separator:分隔符 
    <Breadcrumb separator='/'>
      <Breadcrumb.Item>首页</Breadcrumb.Item>
      <Breadcrumb.Item>内容管理</Breadcrumb.Item>
    </Breadcrumb>
  </div >
}
export default Article

自定义面包屑导航Breadcrumb的代码


import React from 'react'
import BreadcrumbItem from '../BreadcrumbItem'
interface PropsType {
  children: JSX.Element | JSX.Element[]
  separator?: string
}

const Breadcrumb = (props: PropsType): JSX.Element => {
  const { separator, children } = props
  /* 
      为什么要克隆children?
         如果不克隆children,那么separator是Breadcrumb组件属性的话,是无法
         传递给BreadcrumbItem组件,导致BreadcrumbItem没有分隔符
 */
  //  React.Children.map用来遍历 ReactNode元素
  //  将所有childred遍历,将element克隆,并且给新的element加上separator( 分隔符 ) 
  //  React.Children.map返回一个新的ReactNode数组,将新的渲染
  const BreadcrumbItemList = React.Children.map(children, ((element, index) => {
    if (children instanceof Array) {
      if ((children.length - 1) === index) {
        return React.cloneElement(element)
      }
      return React.cloneElement(element, {
        separator: separator ? separator : '>'
      })
    }
  }))


  return <div className='breadcrumb'>
    {BreadcrumbItemList}
  </div>
}

Breadcrumb.Item = BreadcrumbItem
export default Breadcrumb

面包屑导航BreadcrumbItem的代码

interface ItemType {
  className?: string
  href?: string
  onClick?(): void
  children: any
  title?: string,
  separator?: string
}

const BreadcrumbItem = ({ className, href, onClick, children, title, separator }: ItemType) => {
  const click = () => {
    href && navigate(`${href}`)
  }
  return (
    <div
      className={classNames([className, 'breadcrumb-item'])}
      onClick={onClick || click}
    >
      {title}
      {children}
      // 除了最后一个item,其他的都有separator分隔符,这样就实现了面包屑导航栏
      {separator}
    </div>
  )
}
export default BreadcrumbItem
转载自:https://segmentfault.com/a/1190000041711538
评论
请登录