/* eslint-disable max-len */ import React, { useState } from "react" import PropTypes from "prop-types" import classNames from "classnames" import "./style" const prefix = "adui-table" export interface ITableSortProps { onSort?: ((order: "asc" | "desc" | "") => void) | null sortOrder?: null | "" | "asc" | "desc" title?: React.ReactNode sortableAndFilterable?: boolean } /** * 表格排序 */ const TableSort: React.FC = ({ onSort, sortOrder: sortOrderProp, title, sortableAndFilterable, }: ITableSortProps) => { const [sortOrder, setSortOrder] = useState(sortOrderProp) // 相当于生命周期 getDerivedStateFromProps if (sortOrderProp !== null && sortOrder !== sortOrderProp) { setSortOrder(sortOrderProp) } const handleChange = () => { let newOrder: "" | "asc" | "desc" if (sortOrder) { newOrder = sortOrder === "desc" ? "asc" : "" } else { newOrder = "desc" } if (sortOrderProp === null) { setSortOrder(newOrder) } if (onSort) { onSort(newOrder) } } const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key.toUpperCase() === "ENTER") { handleChange() } } return (
{!sortableAndFilterable ? title : null}
{!sortableAndFilterable &&
}
) } TableSort.propTypes = { /** * 排序时的 handler */ onSort: PropTypes.func, /** * 可以从外部控制排序方式 * 没有 sortOrder,则用 "" 空字符串,不要用 null,因为 null 会被组件视为内部驱动 */ sortOrder: PropTypes.oneOf([null, "", "asc", "desc"]), /** * title */ title: PropTypes.node, /** * sortableAndFilterable?: boolean */ sortableAndFilterable: PropTypes.bool, } TableSort.defaultProps = { onSort: null, sortOrder: null, title: null, sortableAndFilterable: false, } export default TableSort