3 min läsning
Skapa React-komponent för listor med emojis
Använd emojis med hjälp av css attribut och html data-attribut för (kanske) roligare listor
Jag håller just nu på att göra den här sajten lite mer lekfull.
En idé jag fick var att skapa en React-komponent för att skapa listor, alltså ul, ol och li med emojis istället för bullets och siffror. Tanken är att kunna använda den här komponenten i de *.mdx artiklar jag skriver.
Slutresultatet ser ut såhär:
- 🎉 Så här kan det se ut!
- 🤯 Det kan även se ut såhär
- 🚀 Eller såhär?
Men hur gjorde jag då? Jo det ska jag ta och berätta.
Disclaimer: I exemplen under används
stitchessomCSS-in-JSbibliotek men css:en är ändå typ densamma, bara att det skrivs med object-syntax. Tittar man bara på syntaxen så ser man hur det skulle skrivas med vanlig css.
Först skapade jag själva EmojiList komponenten som kan agera ul eller ol:
interface EmojiListProps { as: 'ul' | 'ol'; children: React.ReactNode}
export const EmojiList = ({ as: Component, children }: EmojiListProps) => { return <Component>{children}</Component>;};Därefter skapade jag den komponent som ska agera <li /> elementet. Här nedan är koden för den komponenten, så går vi igenom vad som händer efteråt.
interface EmojiListItemProps { emoji: string; children: React.ReactNode;}
const StyledListItem = styled('li', { listStyle: 'none', paddingInlineStart: '0',
'&::before': { content: 'attr(data-emoji)', paddingRight: '8px', fontSize: '1.2em', },});
const EmojiListItem = ({ emoji, children }: EmojiListItemProps) => { return <StyledListItem data-emoji={emoji}>{children}</StyledListItem>;};Jag har highlight:at några intressanta rader:
listStyle: 'none'tar bort default list style.content: 'attr(data-emoji)'är den rad som egentligen får det hela att fungera.- Här används css
attr()attributet för att kan hämta ett visst attribut från elementet.
- Här används css
data-emojitar emotemojiprop och sätter den som data-attribut. Det är det här attributet som css regeln ovan fångar upp.- Elemetet renderas typ såhär:
<li data-emoji="🤯">Mind blown</li>
- Elemetet renderas typ såhär:
För att det ska bli så enkelt som möjligt att använda de här två komponenterna tillsammans i mdx-filerna så exporteras dom tillsammans på följande vis:
export const EmojiList = () => { // Kod bortplockad från exemplet}const EmojiListItem = () => { // Kod bortplockad från exemplet
}EmojiList.Item = EmojiListItem;Den typen av export gör att det går att använda enklare i *.mdx filer i och med att endast en komponent faktiskt behöver importeras, nämligen EmojiList. EmojiListItem får man på köpet via <EmojiListItem />
Slutresultatet som visades i början på denna artikel ser ut såhär:
<EmojiList as="ul"> <EmojiListItem emoji="🎉">Så här kan det se ut!</EmojiListItem> <EmojiListItem emoji="🤯">Det kan även se ut såhär</EmojiListItem> <EmojiListItem emoji="🚀">Eller **såhär?**</EmojiListItem></EmojiList>Var det superkomplicerat? Nej. Var det revolutionerande? Knappast. Men syftet med den här sajten är delvis att jag ska ha en lättillgänglig yta att experimentera på och de här två komponenterna fyller det syftet.