由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第一部分(高亮)

目录

一、组件结构

antd代码结构

rc-ant代码结构

1、组件树状结构

2、Context使用说明

3、rc-tabs中只在example、test中使用的组件说明

二、Tabs关键组件功能实现

1、Tabs(antd)

2、RcTabs

3、Sentinel哨兵

4、InkTabBarNode

三、Tabs的滚动效果

ScrollableTabBarNode

一、组件组合结构

antd代码目录

rc-tabs代码目录

1、组件树状结构

上图的代码结构可以看出Rc-tab的组件较多,首先梳理组件的树状关系,梳理过程中发现rc-tabs中有一部分组件仅用于example、test中,文章后续章节介绍

注意:

  1. 标有rc-前缀的为rc-tabs中的组件,目前antd组价只有Tabs 和 TabBar
  2. 标注需功能图解的将会在第二部分详细介绍功能实现

下图为仅用于仅用于example、test的组件

2、SentinelContext、SentinelProvider、SentinelConsumer

const SentinelContext = createReactContext({});
export const SentinelProvider = SentinelContext.Provider;
export const SentinelConsumer = SentinelContext.Consumer;

Context 提供了一种在组件之间共享值的方式,而不必显式地通过组件树的逐层传递 props,官方说明 https://react.docschina.org/docs/context.html#api

React.createContext:

const MyContext = React.createContext(defaultValue);
  • React.createContext 这个API 创建一个 Context 对象,包含Provider、Consumer两个属性
  • 当 React 渲染 context 组件 Consumer 时,它将从组件树的上层中最接近的匹配的 Provider 读取当前的 context 值。
  • 如果上层的组件树没有一个匹配的 Provider,那么defaultValue值会生效

 Context.Provider

<MyContext.Provider value={/* 某个值 */}>
  • Provider 接收一个 value 属性,传递给消费组件
  • 当 Provider 的 value 值发生变化时,它内部的所有消费组件都会重新渲染。
  • Provider 及其内部 consumer 组件都不受制于 shouldComponentUpdate 函数

Context.Consumer

<MyContext.Consumer>
{value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>
  • 这里需要使用函数作为子元素(function as a child)的做法。
  • 子元素函数接收当前的 context 值,返回一个 React 节点。

3、回调 Refs

回调Refs,传递一个函数,这个函数中接受 React 组件实例或 HTML DOM 元素作为参数,以使它们能在其他地方被存储和访问。

详细讲解见官方文档  https://react.docschina.org/docs/refs-and-the-dom.html#callback-refs

这里Sentinel哨兵中将 sentinelEnd/start 和 panelSentinelEnd/start分别存储在this.sentinelEnd/start 和 this.panelSentinelEnd/start中

4、rc-tabs中只在example、test中使用的组件说明

待续。。。

antd源码分析之——标签页(tabs 1.组件结构)的更多相关文章

  1. antd源码分析之——标签页(tabs 2.Tabs关键组件功能实现)

    由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第二部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...

  2. antd源码分析之——标签页(tabs 3.Tabs的滚动效果)

    由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第三部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...

  3. 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体? | 开篇致敬鸿蒙内核开发者 | v1.11

    子曰:"见贤思齐焉,见不贤而内自省也."<论语>:里仁篇 百篇博客系列篇.本篇为: v01.xx 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 | 51.c ...

  4. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  5. Vue.js 源码分析(三十一) 高级应用 keep-alive 组件 详解

    当使用is特性切换不同的组件时,每次都会重新生成组件Vue实例并生成对应的VNode进行渲染,这样是比较花费性能的,而且切换重新显示时数据又会初始化,例如: <!DOCTYPE html> ...

  6. Vue.js 源码分析(三十) 高级应用 函数式组件 详解

    函数式组件比较特殊,也非常的灵活,它可以根据传入该组件的内容动态的渲染成任意想要的节点,在一些比较复杂的高级组件里用到,比如Vue-router里的<router-view>组件就是一个函 ...

  7. Vue.js 源码分析(二十七) 高级应用 异步组件 详解

    当我们的项目足够大,使用的组件就会很多,此时如果一次性加载所有的组件是比较花费时间的.一开始就把所有的组件都加载是没必要的一笔开销,此时可以用异步组件来优化一下. 异步组件简单的说就是只有等到在页面里 ...

  8. antd源码分析之——栅格(Grid)

    官方文档 https://ant.design/components/grid-cn/ 目录 一.antd中的Grid 代码目录 1.整体思路 2.less文件结构图(♦♦♦重要) 3.less实现逻 ...

  9. antd源码分析之——折叠面板(collapse)

    官方文档 https://ant.design/components/collapse-cn/ 目录 一.antd中的collapse 代码目录 1.组件结构图(♦♦♦重要) 2.源码节选:antd/ ...

随机推荐

  1. 小程序e.currentTarget与e.target 两个属性的区别

    注册事件是获取小程序组件上面的自定义属性值 e.target是获取当前点击的标签上面的自定义属性 e.currentTarget是获取注册点击事件标签内的自定义属性

  2. Linux学习(一)-安装vm虚拟机以及如何在虚拟机上安装Centos系统

    (一)基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习. 1)安装软件vm12; 2)通过vm12创建一个虚拟机空间; 3)在vm12创建好的 ...

  3. appium-清空输入框的内容后,再次输入内容会回退最后两个字符串

    问题描述 有两个输入框,用户名和密码输入框 调用set_text方法,输入用户名 再次调用set_text方法,输入密码 清空用户名输入框的内容后,再次输入内容会回退最后两个字符串 出问题的代码 de ...

  4. Zabbix4.2Server端部署

    一.安装 1.前期安装准备 前期准备一个大一点的分区准备用于zabbix 数据库的存放,为方便后期扩容,我们在这里选择新加一个磁盘并以LVM的方式进行挂载(此处省略虚拟机添加硬盘等操作) # df - ...

  5. svn中日志不展示解决方法记录

    一,问题:点击svn查看日志时不显示.筛选时间显示为1970 1,猜想可能没有查看日志权限 2,查看linux 下svn版本库 confg 下三个配制文件 authz ,passwd ,svnserv ...

  6. C# 安装WindowsService时弹出设置服务登录窗口的解决方案

    使用SignalR实现消息推送,页面实时刷新,使用WindowsService作为SignalR的宿主,也就是作为一个消息服务器,在使用cmd命令安装的时候弹出设置服务登录的窗口,解决此问题的具体操作 ...

  7. Shell 语法报错记录

    sh: missing ] if 条件语句 “或”多个条件并行时 执行then命令 变量a等于aa且变量b等于bb 或者 变量c等于cc且变量d等于dd 这样的条件成立的话,输出success if ...

  8. Python:出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte问题

    我在导入一个csv文件的时候出现了一个问题 报错的内容是这样的: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in positio ...

  9. PEP8规范 Python

    前言 从很多地方搬运+总结,以后根据这个标准再将python的一些奇技淫巧结合起来,写出更pythonic的代码~ PEP8 编码规范 英文原版请点击这里 以下是@bobo的整理,原文请见PEP8 P ...

  10. 【JOISC2012 / bzoj4388】Invitation

    Description link Solution 可以发现题目在模拟 Prim 算法求最大生成树的过程,树边故答案与起点 \(C\) 无关. 先把所有区间离散化,注意对于一个区间 \([l,r]\) ...