Skip to content

Support name-based dynamic icon imports #119

@ajmnz

Description

@ajmnz

👋

It could be interesting to introduce a new DynamicIcon that dynamically imports and renders icons based on its name.

const CategoryList: React.FC = () => {
  const { data: categories } = api.categories.list.useQuery();

  return (
    <div>
      {categories?.map((category) => <DynamicIcon name={category.icon} />)}
    </div>
  );
}

Use case

This is useful for scenarios where the icon name is not known ahead of time (i.e. comes from an external source — backend, api, etc.) and does not affect tree-shaking, unlike doing import * as ....

Examples

Implementation

I think Lucide's implementation works quite good. They export a big lookup table of all icons and their respective dynamic import, which will be called when rendering the component.

They also accept a fallback component for when the icon hasn't loaded yet or if the name is invalid. Out of experience, it works quite well.

const dynamicImportMap = {
  "a-arrow-down": () => import('./icons/a-arrow-down.js'),
  "a-arrow-up": () => import('./icons/a-arrow-up.js'),
  // ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions