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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions