廓形仪rn版本-技术调研
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

157 lines
3.5 KiB

import React, { createContext, useMemo, useContext } from 'react';
import {
tableStyle,
tableHeaderStyle,
tableBodyStyle,
tableFooterStyle,
tableHeadStyle,
tableRowStyleStyle,
tableDataStyle,
tableCaptionStyle,
} from './styles';
const TableHeaderContext = createContext<{
isHeaderRow: boolean;
}>({
isHeaderRow: false,
});
const TableFooterContext = createContext<{
isFooterRow: boolean;
}>({
isFooterRow: false,
});
const Table = React.forwardRef<HTMLTableElement, React.ComponentProps<'table'>>(
function Table({ className, ...props }, ref) {
return (
<table
ref={ref}
className={tableStyle({ class: className })}
{...props}
/>
);
}
);
const TableHeader = React.forwardRef<
HTMLTableSectionElement,
React.ComponentProps<'thead'>
>(function TableHeader({ className, ...props }, ref) {
const contextValue = useMemo(() => {
return {
isHeaderRow: true,
};
}, []);
return (
<TableHeaderContext.Provider value={contextValue}>
<thead
ref={ref}
className={tableHeaderStyle({ class: className })}
{...props}
/>
</TableHeaderContext.Provider>
);
});
const TableBody = React.forwardRef<
HTMLTableSectionElement,
React.ComponentProps<'tbody'>
>(function TableBody({ className, ...props }, ref) {
return (
<tbody
ref={ref}
className={tableBodyStyle({ class: className })}
{...props}
/>
);
});
const TableFooter = React.forwardRef<
HTMLTableSectionElement,
React.ComponentProps<'tfoot'>
>(function TableFooter({ className, ...props }, ref) {
const contextValue = useMemo(() => {
return {
isFooterRow: true,
};
}, []);
return (
<TableFooterContext.Provider value={contextValue}>
<tfoot
ref={ref}
className={tableFooterStyle({ class: className })}
{...props}
/>
</TableFooterContext.Provider>
);
});
const TableHead = React.forwardRef<
HTMLTableCellElement,
React.ComponentProps<'th'>
>(function TableHead({ className, ...props }, ref) {
return (
<th ref={ref} className={tableHeadStyle({ class: className })} {...props} />
);
});
const TableRow = React.forwardRef<
HTMLTableRowElement,
React.ComponentProps<'tr'>
>(function TableRow({ className, ...props }, ref) {
const { isHeaderRow } = useContext(TableHeaderContext);
const { isFooterRow } = useContext(TableFooterContext);
return (
<tr
ref={ref}
className={tableRowStyleStyle({
isHeaderRow,
isFooterRow,
class: className,
})}
{...props}
/>
);
});
const TableData = React.forwardRef<
HTMLTableCellElement,
React.ComponentProps<'td'>
>(function TableData({ className, ...props }, ref) {
return (
<td ref={ref} className={tableDataStyle({ class: className })} {...props} />
);
});
const TableCaption = React.forwardRef<
HTMLTableCaptionElement,
React.ComponentProps<'caption'>
>(function TableCaption({ className, ...props }, ref) {
return (
<caption
ref={ref}
className={tableCaptionStyle({ class: className })}
{...props}
/>
);
});
Table.displayName = 'Table';
TableHeader.displayName = 'TableHeader';
TableBody.displayName = 'TableBody';
TableFooter.displayName = 'TableFooter';
TableHead.displayName = 'TableHead';
TableRow.displayName = 'TableRow';
TableData.displayName = 'TableData';
TableCaption.displayName = 'TableCaption';
export {
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableData,
TableCaption,
};