localeConsumer.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import React, { Component } from 'react';
  2. import { Locale as dateFns } from 'date-fns';
  3. import PropTypes from 'prop-types';
  4. import { get } from 'lodash';
  5. import LocaleContext from './context';
  6. import ConfigContext from '../configProvider/context';
  7. import DefaultLocale from './source/zh_CN';
  8. import { Locale } from './interface';
  9. type ChildrenRender<T> = (componentLocal: T, localeCode: string, dateFnsLocale: dateFns) => React.ReactNode;
  10. export interface LocaleConsumerProps<T> {
  11. componentName: string;
  12. children?: ChildrenRender<T>
  13. }
  14. export default class LocaleConsumer<T> extends Component<LocaleConsumerProps<T>> {
  15. static propTypes = {
  16. componentName: PropTypes.string.isRequired,
  17. children: PropTypes.any,
  18. };
  19. static defaultProps = {
  20. componentName: '',
  21. };
  22. renderChildren(localeData: Locale, children: ChildrenRender<T>) {
  23. const { componentName } = this.props;
  24. let locale = localeData;
  25. if (!localeData?.code) {
  26. locale = DefaultLocale;
  27. }
  28. /**
  29. * dateFnsLocale is used to format the date into a local date
  30. * example:
  31. * import { zhCN } from "date-fns/locale";
  32. * format(new Date("2021-04-29"), "yyyy-MM-dd EEEE")
  33. * => '2021-04-29 Thursday' (默认 locale 为 en-US)
  34. * format(new Date('2021-04-29'), "yyyy-MM-dd EEEE", { locale: zhCN })
  35. * => '2021-04-29 星期四'
  36. */
  37. const defaultFnsLocale = get(DefaultLocale, 'dateFnsLocale');
  38. const dateFnsLocale = get(locale, 'dateFnsLocale', defaultFnsLocale);
  39. return children(locale[componentName], locale.code, dateFnsLocale);
  40. }
  41. render() {
  42. const { children } = this.props;
  43. return (
  44. <ConfigContext.Consumer>
  45. {({ locale }) => (
  46. <LocaleContext.Consumer>
  47. {localeData => this.renderChildren(locale || localeData, children)}
  48. </LocaleContext.Consumer>
  49. )}
  50. </ConfigContext.Consumer>
  51. );
  52. }
  53. }