2021SC@SDUSC
一、组件结构
1、ant代码结构
2、组件结构
ant中Comment的index.tsx中引入了config-provider。
二、antd组件调用关系
1、index.tsx
导入相应模块以及相应的ICON图标
import * as React from 'react'; import classNames from 'classnames'; import { ConfigContext } from '../config-provider';
声明CommentProps接口
export interface CommentProps { /** List of action items rendered below the comment content */ actions?: Array<React.ReactNode>; /** The element to display as the comment author. */ author?: React.ReactNode; /** The element to display as the comment avatar - generally an antd Avatar */ avatar?: React.ReactNode; /** ClassName of comment */ className?: string; /** The main content of the comment */ content: React.ReactNode; /** Nested comments should be provided as children of the Comment */ children?: React.ReactNode; /** Comment prefix defaults to '.ant-comment' */ prefixCls?: string; /** Additional style for the comment */ style?: React.CSSProperties; /** A datetime element containing the time to be displayed */ datetime?: React.ReactNode; }
actions:在评论内容下面呈现的操作项列表,类型为Array
author:要显示为注释作者的元素,类型为ReactNode
avatar:要显示为评论头像的元素 - 通常是 antd Avatar 或者 src,类型为ReactNode
children:嵌套注释应作为注释的子项提供,类型为ReactNode
content:评论的主要内容,类型为ReactNode
datetime:展示时间描述,类型为ReactNode
const Comment: React.FC<CommentProps> = ({ actions, author, avatar, children, className, content, prefixCls: customizePrefixCls, datetime, ...otherProps }) => {
const { getPrefixCls, direction } = React.useContext(ConfigContext); const renderNested = (prefixCls: string, nestedChildren: any) => ( <div className={classNames(`${prefixCls}-nested`)}>{nestedChildren}</div> ); const prefixCls = getPrefixCls('comment', customizePrefixCls); const avatarDom = avatar ? ( <div className={`${prefixCls}-avatar`}> {typeof avatar === 'string' ? <img src={avatar} alt="comment-avatar" /> : avatar} </div> ) : null;
const actionDom = actions && actions.length ? ( <ul className={`${prefixCls}-actions`}> {actions.map((action, index) => ( <li key={`action-${index}`}>{action}</li> // eslint-disable-line react/no-array-index-key ))} </ul> ) : null; const authorContent = (author || datetime) && ( <div className={`${prefixCls}-content-author`}> {author && <span className={`${prefixCls}-content-author-name`}>{author}</span>} {datetime && <span className={`${prefixCls}-content-author-time`}>{datetime}</span>} </div> );
const contentDom = ( <div className={`${prefixCls}-content`}> {authorContent} <div className={`${prefixCls}-content-detail`}>{content}</div> {actionDom} </div> ); const cls = classNames( prefixCls, { [`${prefixCls}-rtl`]: direction === 'rtl', }, className, );
return ( <div {...otherProps} className={cls}> <div className={`${prefixCls}-inner`}> {avatarDom} {contentDom} </div> {children ? renderNested(prefixCls, children) : null} </div> ); };