Я использую 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, но я новичок в реагировании, поэтому не хочу ничего исключать.
Причина, по которой это не работает, заключается в том, что попутный ветер включает только те классы, которые он распознал при сканировании вашего кода, поэтому динамически генерируемые классы не включаются.
Из документации попутного ветра:
Не создавайте имена классов динамически:
// BAD <div class = "text-{{ error ? 'red' : 'green' }}-600"></div>
Вместо этого убедитесь, что все имена классов, которые вы используете, существуют полностью.
// GOOD <div class = "{{ error ? 'text-red-600' : 'text-green-600' }}"></div>
Если вы установили 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 таким образом. Ваш случай будет рассмотрен просто с помощью style
:
<CommandList style = {{minHeight: `calc(${favProjects.length * 50}px+${recentProjects.length * 50}px)`}}>