react#ReactHTML TypeScript Examples

The following examples show how to use react#ReactHTML. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: react-utils.ts    From utopia with MIT License 7 votes vote down vote up
// Utility function to interact with react. Provides the following advantages:
  // - forces the use of a key
  // - by having key and children as separate properties, the attrs param has the correct shape for the component model
  // - it's shorter than createElement :p

  // DOM Elements
  static create<P extends HTMLAttributes<T>, T extends HTMLElement>(
    type: keyof ReactHTML,
    props?: { key: Key } & ClassAttributes<T> & P,
    ...children: ReactNode[]
  ): DetailedReactHTMLElement<P, T>
Example #2
Source File: dynamicParent.tsx    From apps with GNU Affero General Public License v3.0 5 votes vote down vote up
export default function dynamicParent<P, T = Record<string, unknown>>(
  loader: () => Promise<LoaderResult<P>>,
  placeholder: string | keyof ReactHTML | FunctionComponent<T>,
): React.ComponentType<P & T & { shouldLoad: boolean }> {
  return class DynamicParent extends React.Component<
    P & T & { shouldLoad: boolean },
    { componentClass?: LoaderResult<P> }
  > {
    constructor(props: P & T & { shouldLoad: boolean }) {
      super(props);
      this.state = { componentClass: null };
    }

    async componentDidMount() {
      const { shouldLoad } = this.props;
      if (shouldLoad) {
        await this.loadComponent();
      }
    }

    async componentDidUpdate(prevProps) {
      const { shouldLoad } = this.props;
      if (!prevProps.shouldLoad && shouldLoad) {
        await this.loadComponent();
      }
    }

    async loadComponent() {
      const componentClass = await loader();
      this.setState({ componentClass });
    }

    render() {
      const { componentClass } = this.state;
      const { children } = this.props;
      if (componentClass) {
        return React.createElement(componentClass, this.props, children);
      }
      return React.createElement(placeholder, this.props, children);
    }
  };
}