// 循环日志打印
.wrapper {.content {counter-reset: line-numbering;.line {font-size: 12px;line-height: 14px;&::before {display: inline-block;padding-right: 1em;content: counter(line-numbering);counter-increment: line-numbering;}}}}
import React, { Fragment, PureComponent } from "@alipay/bigfish/react";import { Empty, BackTop } from "@alipay/bigfish/antd";import cs from "@alipay/bigfish/util/classnames";import styles from "./index.less";export interface LogResultProps<T extends any> {className?: string;style?: React.CSSProperties;logRender?: (item: T) => JSX.Element;dataSource?: T[];empty?: JSX.Element;footerRender?: () => JSX.Element;}/*** 1. 动态计算 height* 2. 添加滚动顶部* 3. 添加行数*/class LogResult<T> extends PureComponent<LogResultProps<T>> {domRef: any = React.createRef<HTMLDivElement | null>();static defaultProps: LogResultProps<any> = {empty: <Empty />,dataSource: [],footerRender: () => <Fragment />,};getSnapshotBeforeUpdate(prevProps: LogResultProps<T>) {// @ts-ignoreif (prevProps.dataSource?.length < this.props.dataSource?.length) {const list = this.domRef.current;return list.scrollHeight - list.scrollTop;}return null;}componentDidUpdate(_prevProps: LogResultProps<T>,_prevState: any,snapshot: number) {if (snapshot !== null) {const list = this.domRef.current;list.scrollTop = list.scrollHeight - snapshot;}}goToTop = () => {if (this.domRef.current) {this.domRef.current.scrollTop = 0;}};renderLine = (item: T) => {const { logRender } = this.props;if (typeof logRender === "function") {return logRender(item);}return <span>{JSON.stringify(item)}</span>;};/** 动态计算最大 height */render() {const {className,empty,style,dataSource = [],footerRender,} = this.props;const cls = cs(styles.wrapper, className);return (<div className={cls} style={style} ref={this.domRef}><div className={styles.content}>{dataSource.length ? (<Fragment>{dataSource.map((item, index) => (<Fragment key={index}><div className={styles.line}>{this.renderLine(item)}</div></Fragment>))}<BackToponClick={this.goToTop}target={() => this.domRef.current}visibilityHeight={200}/></Fragment>) : (empty)}<div className="footer">{footerRender?.()}</div></div></div>);}}export default LogResult;
