Как использовать динамически вычисляемые классы попутного ветра в пользовательском интерфейсе Shadcn с помощью реакции

Я использую NextJS с Shadcn. Я пытаюсь отобразить командный компонент, содержащий динамическое количество элементов из базы данных.

Это фрагмент строки, которая не работает. Жесткое кодирование чисел работает нормально, но использование переменных не влияет на макет.

 <CommandList className = {`min-h-[calc(${favProjects.length * 50}px+${recentProjects.length * 50}px)]`}>

Вот полный код контекста.

import {
    CalendarIcon,
    EnvelopeClosedIcon,
    FaceIcon,
    GearIcon,
    PersonIcon,
    RocketIcon,
} from "@radix-ui/react-icons"

import {
    Command,
    CommandEmpty,
    CommandGroup,
    CommandInput,
    CommandItem,
    CommandList,
    CommandSeparator,
    CommandShortcut,
} from "@/components/ui/command"

export function TopNavMenuProjects() {
    const favProjects = [
        {
            id: 1,
            name: "Project 1",
        },
        {
            id: 2,
            name: "Project 2",
        },
        {
            id: 3,
            name: "Project 3",
        },
    ]

    const recentProjects = [
        {
            id: 4,
            name: "Project 4",
        },
        {
            id: 5,
            name: "Project 5",
        },
        {
            id: 6,
            name: "Project 6",
        },
    ]
    return (
        <Command className = "rounded-lg border shadow-md h-full">
            <CommandInput placeholder = "Search ..." />
            <CommandList className = {`min-h-[calc(${favProjects.length * 50}px+${recentProjects.length * 50}px)]`}>
                <CommandEmpty>No results found.</CommandEmpty>
                <CommandGroup heading = {`Favourites (${favProjects.length})`}>
                    <CommandItem>
                        {/* <CalendarIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 1</span>
                    </CommandItem>
                    <CommandItem>
                        {/* <FaceIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 2</span>
                    </CommandItem>
                    <CommandItem>
                        {/* <RocketIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 3</span>
                    </CommandItem>
                </CommandGroup>
                <CommandSeparator />
                <CommandGroup heading = "Recent">
                    <CommandItem>
                        {/* <PersonIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 4</span>
                        {/* <CommandShortcut>⌘P</CommandShortcut> */}
                    </CommandItem>
                    <CommandItem>
                        {/* <EnvelopeClosedIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 5</span>
                        {/* <CommandShortcut>⌘B</CommandShortcut> */}
                    </CommandItem>
                    <CommandItem>
                        {/* <GearIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project 6</span>
                        {/* <CommandShortcut>⌘S</CommandShortcut> */}
                    </CommandItem>
                </CommandGroup>
                <CommandGroup heading = "More Projects">
                    <CommandItem>
                        {/* <PersonIcon className = "mr-2 h-4 w-4" /> */}
                        <span>Project Dashboard</span>
                        {/* <CommandShortcut>⌘P</CommandShortcut> */}
                    </CommandItem>
                </CommandGroup>
            </CommandList>
        </Command>
    )
}


Я сомневаюсь, что проблема связана именно с shadcn, но я новичок в реагировании, поэтому не хочу ничего исключать.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Причина, по которой это не работает, заключается в том, что попутный ветер включает только те классы, которые он распознал при сканировании вашего кода, поэтому динамически генерируемые классы не включаются.

Из документации попутного ветра:

Не создавайте имена классов динамически:

// BAD
<div class = "text-{{ error ? 'red' : 'green' }}-600"></div>

Вместо этого убедитесь, что все имена классов, которые вы используете, существуют полностью.

// GOOD
<div class = "{{ error ? 'text-red-600' : 'text-green-600' }}"></div>

Функция полезности cn

Если вы установили shadcnui, следуя инструкциям по установке на сайте, в вашем проекте будет файл /lib/utils.ts. Посмотрите здесь. Он экспортирует функцию cn(), которая может помочь применить целые стили попутного ветра на основе переменной.

Например:

<Link
    className = {cn(
        "text-sm hover:text-primary",
        someVariableClass
        route.active ? "text-black" : "text-muted-foreground",)
    }
>
    Some label here.
</Link>

Имя класса по умолчанию будет этой строкой "text-sm hover:text-primary". Если route.active истинно, то добавляется "text-black" еще "text-muted-foreground".

Обратите внимание, что я использую полные стили. Если вы можете использовать служебную функцию cn() для достижения желаемых результатов, дерзайте.

style реквизит

Если вам действительно нужны динамические стили во время выполнения, вы можете использовать опору style для динамического обновления встроенных реквизитов, передаваемых в ваш компонент. В отличие от попутного ветра, который создает таблицу стилей, свойство style передает встроенные стили, которые немедленно влияют на время выполнения.

Самым важным следствием того, как Tailwind извлекает имена классов, является то, что он находит только те классы, которые существуют в виде полных непрерывных строк в ваших исходных файлах.

Другими словами, вы не можете использовать Tailwind таким образом. Ваш случай будет рассмотрен просто с помощью style:

<CommandList style = {{minHeight: `calc(${favProjects.length * 50}px+${recentProjects.length * 50}px)`}}>

Другие вопросы по теме