antd-Card源码解读

1,170 阅读2分钟

一、认识Card

卡片组件,偏展示型组件,看它的props:

  • actions: 操作区,位于卡片底部
  • cover: 卡片封面
  • activeTabKey、defaultActiveTabKey、tabList、onTabChange: 页签
  • extra: 右上角操作区
  • ... 其他主要是一些样式的配置 tabProps是用来干嘛的呢?等会看源码见分晓 再看看它的子组件
  • Card.Grid 网格
  • Card.Meta 图片描述等

二、找到源码

地址:github.com/ant-design/…
版本:4.8.3
目录path: ant-design/components/card/
所有的组件都放在components目录下,我们使用的时候可以按需引入。 里面文件看名识义,有测试、使用demo、样式、子组件、组件定义、说明
语言是typescript哦

三、认识组件依赖

组件源码核心代码: ant-design/components/card/index.tsx

omit.js

function omit(obj, fields) {
  // eslint-disable-next-line prefer-object-spread
  const shallowCopy = Object.assign({}, obj);
  for (let i = 0; i < fields.length; i += 1) {
    const key = fields[i];
    delete shallowCopy[key];
  }
  return shallowCopy;
}

export default omit;

代码很简单,功能就是得到剔除了一些指定属性的对象

ConfigContext

通过React.createContext创建的一个Context对象

Omit

export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

keyof: 取出所有属性
Exclude: 就是将前面类型与后面类型对比,过滤出前面独有的属性
Pick: 从前面类型取出后面类型的一系列属性
整体理解,Omit,第二个参数必须是第一个参数的部分属性,Omit<T, K extends keyof T>得到的值是:剔除掉部分属性K的T对象

SizeContext

通过React.createContext创建的一个Context对象,主要用于Card组件props中size相关的

Card组件还引用了一些antd的其他组件:Tabs、Row、Col

四、组件源码

类型定义:

组件比较简单,主要是根据props渲染各区域。
看了源码就知道,tabProps就是Tabs组件的props的类型定义,Card组件可以让用户自由配置Tabs

五、子组件Grid

包了一层ConfigConsumer,用来接收父组件通过ConfigContext传递的getPrefixCls。这里没有用Provider,而是直接设置createContext的初始值并使用。

六、子组件Meta

同Grid,不过Meta要渲染的元素更多一些

至此,Card组件我们已经学习完,但本人有一些疑问点:

  • HTMLDivElement可以设置同名属性(addEventListener、removeEventListener)?

  • HTMLDivElement继承自HTMElement,父接口已有的属性为啥子接口还要定义一遍?

  • export interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> 为啥要剔除title

接口尽管支持继承多个接口,但是如果继承的接口中,定义的同名属性的类型不同的话,是不能编译通过的。

  • const divProps = omit(others, ['onTabChange']); 为啥要剔除onTabChange 欢迎回复~~~~~~~~~~~~~~