Breadcrumb组件

Antd的面包屑组件是一个能够结合路由进行跳转页面的组件,其中对于路由的支持是react-router@3以及react-router@4。

一样的我们从组件传入参数开始入手,先弄清楚他接受那些参数,然后才知道这些参数在什么地方有什么作用

  export interface BreadcrumbProps {
    prefixCls?: string; // 样式类的前缀
    routes?: Array<any>; // 路由的数组集合
    params?: Object; // 路由的参数对象集合
    separator?: React.ReactNode; // 每个item之间的分隔符
    itemRender?: (route: any, params: any, routes: Array<any>, paths: Array<string>) => React.ReactNode; // 自定义的渲染item的函数
    style?: React.CSSProperties; // 行内样式
    className?: string; // 自定义样式名
  }

Render()

同样的一个组件的入口点就是他的render函数

  render() {
    let crumbs;
    const {
      separator, prefixCls, style, className, routes, params = {},
      children, itemRender = defaultItemRender,
    } = this.props;
    if (routes && routes.length > 0) {
      // 如果有routes这个参数存在,就需要利用routes来构造item
      const paths: string[] = []; // 定义一个路径数组为空
      // 便利传入的routes,从antd的官网例子上面可以看出在react-router版本是4以下的时候
      // react-router会给传入组件传递一些参数回来,但是到了react-router4版本的时候、
      // 就需要自己构造这些参数了,这里主要使用了routes,params,children
      crumbs = routes.map((route) => {
        // 从官网上的例子中可以看到每一个route下面的对应回传参数如图
        route.path = route.path || '';
        // 将单个item路径按照‘/’分割成对应数组
        let path: string = route.path.replace(/^\//, '');
        Object.keys(params).forEach(key => {
          // 将单个item的path中的对应参数换成传入参数对应的值
          path = path.replace(`:${key}`, params[key]);
        });
        if (path) {
          // 最开始我没看懂这个地方为什么要不断的往paths这个数组之中插入路径,后来看了antd官网的实例
          // 知道了原来传入的routes数组的顺序是依次包含的关系,也就是第一个route是第一层路由,剩下的
          // 依次包含层级,但是这种传回方式仅限于react-router@3
          paths.push(path);
        }
        return (
          // 然后传入itemrender函数进行items的渲染,等会解读这个函数的时候就知道paths的作用了
          <BreadcrumbItem separator={separator} key={route.breadcrumbName || path}>
            {itemRender(route, params, routes, paths)}
          </BreadcrumbItem>
        );
      });
    } else if (children) {
      // 如果是存在孩子节点的时候就渲染孩子节点,使用的方法依旧是React.Children.map+React.cloneElement()
      // 我大胆的推测这段代码是为了适配react-router@4新增的
      crumbs = React.Children.map(children, (element: any, index) => {
        if (!element) {
          return element;
        }
        // 这里的waring函数是antd自身根据https://www.npmjs.com/package/warning
        // 封装了一个浏览器console框打印警告的工具函数
        warning(
          element.type && element.type.__ANT_BREADCRUMB_ITEM,
          'Breadcrumb only accepts Breadcrumb.Item as it\'s children',
        );
        return cloneElement(element, {
          separator,
          key: index,
        });
      });
    }
    return (
      <div className={classNames(className, prefixCls)} style={style}>
        {crumbs}
      </div>
    );
  }
route回传参数

使用react-router@3需要的函数

单独的一个用来编写Breadcrumb的items的组件,我觉得是为了能够在react-router@4上面使用,

因为现在react-router@4是需要自己编写路由层级,所以这样的方式更加灵活

虽然是子组件,但是也还是需要从他的参数开始了解

Render()

render函数比较简单

组件的身份证明

这个组件中有一个东西代表了他的身份

接下来我们就看看他是怎么使用的吧,在上面的Breadcrumb的render代码中有一段代码

Last updated