Часть 2. Добавьте стиль, чтобы он выглядел как меню — добавление Tailwind CSS и JSON.
В предыдущей статье меню не похоже на обычное меню. В этой статье мы добавим стиль и JSON, чтобы имитировать получение данных из базы данных для создания меню.
Во-первых, добавьте класс к пунктам меню:
<Menu.Items className="focus:outline-none absolute origin-top-left w-56 divide-y divide-gray-100 rounded-md bg-white shadow-lg ">
Используйте ‹div className="p-1›, чтобы обернуть все ‹Menu.Item›.
<Menu.Items className=" absolute origin-top-left w-56 divide-y divide-gray-100 rounded-md bg-white shadow-lg "> <div className="p-1"> <Menu.Item>
Также замените ‹a› на ‹button›.
<Menu.Item> {({ active }) => ( <button className={`${active && 'bg-blue-500'}`} href="/account-settings" > Account settings </button> )}
Добавьте к кнопке следующие классы, чтобы сделать ее округлой и полной ширины:
<Menu.Item> {({ active }) => ( <button className={`${active && 'bg-blue-500'} w-full rounded-md p-2`} href="/account-settings" > Account settings </button> )} </Menu.Item>
Создайте данные элементов, которые содержат имена элементов и отключенные свойства.
const items = [ {name:"account",disabled:false}, {name:"info",disabled:false}, {name:"signout",disabled:true}, {name:"register",disabled:false}]
Мы также добавляем классы в Menu.Items и Menu.Button.
import { Menu } from '@headlessui/react' export default function MyDropdown() { const items = [{name:"account",disabled:false},{name:"info",disabled:false},{name:"signout",disabled:true},{name:"register",disabled:false}] return ( <Menu> <Menu.Button>More</Menu.Button> <Menu.Items className="focus:outline-none absolute w-56 divide-y divide-gray-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5"> {/* Use the `active` render prop to conditionally style the active item. */} {items.map(item=>( <Menu.Item disabled={item.disabled}> {({ active }) => ( <button className={`${active ? 'bg-blue-500 text-white' : ' text-black' } w-full rounded-md px-2 py-2`} href="/account-settings" > {item.name} </button> )} </Menu.Item> ))} </Menu.Items> </Menu> ) }
Перебирать предметы
Мы перебираем элементы и передаем item.disabled и item.name компоненту, чтобы он динамически генерировал элементы, некоторые элементы будут отключены на основе JSON.
import { Menu } from '@headlessui/react' const MyDropdown = () => { const items = [ { name: "account", disabled: false }, { name: "info", disabled: false }, { name: "signout", disabled: true }, { name: "register", disabled: false }] return ( <Menu> <Menu.Button>More</Menu.Button> <Menu.Items className="focus:outline-none absolute origin-top-left w-56 divide-y divide-gray-100 rounded-md bg-white shadow-lg "> <div className="p-1"> {items.map(item=>( <Menu.Item disabled={item.disabled}> {({ active }) => ( <button className={`${active && 'bg-blue-500'} w-full rounded-md p-2`} href="/account-settings" > {item.name} </button> )} </Menu.Item> ))} </div> </Menu.Items> </Menu> ) } export default MyDropdown
Для отключенной кнопки элемент должен быть отключен для навигации с помощью клавиатуры и целей ARIA.
Если вам понравилась эта история, вам также может быть интересна подписка на Medium. Это всего 5 долларов в месяц (цена чашки кофе!), но это даст вам неограниченный доступ к историям, поддерживая ваших любимых писателей. Если вы зарегистрируетесь по этой ссылке, я получу небольшую комиссию. Спасибо!
Подпишитесь на нас: YouTube, Medium, Udemy, Linkedin, Twitter, Instagram, Gumroad, Quora и Telegram
Присоединяйтесь к партнерам, чтобы зарабатывать деньги:
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.