Problem With Conditional Render
Unanswered
VoidPointer posted this in #help-forum
I'm busy with a shacn NavigationMenu, and am trying to avoid showing the little down arrow icon on top level menu items that have no sub-items, and so far I have this:
My items are defined as a TypeScript array:
Yet even for the
{items.map((item) => (
<NavigationMenuItem key={crypto.randomUUID()}>
<NavigationMenuTrigger>{item.text}</NavigationMenuTrigger>
{item.subItems && item.subItems.length > 0 && (
<NavigationMenuContent>
<ul className="grid w-50 gap-4">
<!-- <Link> stuff here -->
</ul>
</NavigationMenuContent>)}
{(!item.subItems || item.subItems.length === 0) && (
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
<Link href={getWorkingUrl(item.url)}>{item.text}</Link>
</NavigationMenuLink>
)}
</NavigationMenuItem>
))}My items are defined as a TypeScript array:
[
{
text: "Contact Us",
subItems: [
{
text: "Request a Quote",
},
...
],
},
{
text: "Sign Up",
url: "/signup",
},
];Yet even for the
/signup item in this case, with no subItems defined, both conditionals get rendered.7 Replies
Haddock
You need to conditioanlly render the trigger itself, not just the content.
Thai
^
Threw this into AI which gave me this:
{items.map((item) => {
const hasSubItems = (item.subItems?.length ?? 0) > 0
return (
<NavigationMenuItem key={item.url ?? item.text}>
{hasSubItems ? (
#Unknown Channel
<NavigationMenuTrigger>{item.text}</NavigationMenuTrigger>
<NavigationMenuContent>
<ul className="grid w-50 gap-4">
{/* <Link> stuff here */}
</ul>
</NavigationMenuContent>
</>
) : (
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
<Link href={getWorkingUrl(item.url)}>{item.text}</Link>
</NavigationMenuLink>
)}
</NavigationMenuItem>
)
})}
{items.map((item) => {
const hasSubItems = (item.subItems?.length ?? 0) > 0
return (
<NavigationMenuItem key={item.url ?? item.text}>
{hasSubItems ? (
#Unknown Channel
<NavigationMenuTrigger>{item.text}</NavigationMenuTrigger>
<NavigationMenuContent>
<ul className="grid w-50 gap-4">
{/* <Link> stuff here */}
</ul>
</NavigationMenuContent>
</>
) : (
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
<Link href={getWorkingUrl(item.url)}>{item.text}</Link>
</NavigationMenuLink>
)}
</NavigationMenuItem>
)
})}
Haddock
{items.map((item) => (
<NavigationMenuItem key={item.text}>
{item.subItems?.length ? (
<>
<NavigationMenuTrigger>
{item.text}
</NavigationMenuTrigger>
<NavigationMenuContent>
<ul className="grid w-50 gap-4">
{/* sub item links */}
</ul>
</NavigationMenuContent>
</>
) : (
<NavigationMenuLink
asChild
className={navigationMenuTriggerStyle()}
>
<Link href={getWorkingUrl(item.url)}>
{item.text}
</Link>
</NavigationMenuLink>
)}
</NavigationMenuItem>
))}Try sth like this.
Great! Thanks so much. I didn't know you could do ternaries in tsx.
@VoidPointer Great! Thanks so much. I didn't know you could do ternaries in tsx.
Haddock
It's my pleasure.