关于javascript:如何使用-Tsreact自定义面包屑导航

性能示例展现:

官网示例:

封装实现的示例:

技术栈: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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理