splitButtonGroup.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import classNames from 'classnames';
  4. import { cssClasses } from '@douyinfe/semi-foundation/button/constants';
  5. import '@douyinfe/semi-foundation/button/button.scss';
  6. import BaseComponent, { BaseProps } from '../_base/baseComponent';
  7. const prefixCls = cssClasses.PREFIX;
  8. export interface SplitButtonGroupProps extends BaseProps {
  9. 'aria-label'?: React.AriaAttributes['aria-label']
  10. }
  11. export default class SplitButtonGroup extends BaseComponent<SplitButtonGroupProps> {
  12. containerRef: React.RefObject<HTMLDivElement> = React.createRef();
  13. static propTypes = {
  14. style: PropTypes.object,
  15. className: PropTypes.string,
  16. 'aria-label': PropTypes.string,
  17. };
  18. componentDidMount() {
  19. if (this.containerRef.current) {
  20. const buttons = this.containerRef.current.querySelectorAll('button');
  21. const firstButton = buttons[0];
  22. const lastButton = buttons[buttons.length - 1];
  23. firstButton?.classList.add(`${prefixCls}-first`);
  24. lastButton?.classList.add(`${prefixCls}-last`);
  25. }
  26. }
  27. render() {
  28. const { children, style, className } = this.props;
  29. const cls = classNames(`${prefixCls}-split`, className);
  30. return (
  31. <div ref={this.containerRef} className={cls} style={style} role="group"
  32. aria-label={this.props['aria-label']}>
  33. {children}
  34. </div>
  35. );
  36. }
  37. }