Кнопки не имеют равномерного заполнения

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

Компонент безголовых вкладок пользовательского интерфейса:

                    <Tab.List className="flex sm:flex-col">
                    <Tab>
                    {({ selected }) => (
                        <button 
                        className={`px-6 py-4 ${selected ? 'bg-white text-black' : 'bg-red-600 text-white'}`}
                        >
                          Frontend
                        </button>
                      )}
                    </Tab>
                    <Tab>
                    {({ selected }) => (
                        <button
                        className={`px-6 py-4 ${selected ? 'bg-white text-black' : 'bg-red-600 text-white'}`}
                        >
                          Backend
                        </button>
                    )}
                    </Tab>
                    <Tab>
                    {({ selected }) => (
                        <button
                        className={`px-6 py-4 ${selected ? 'bg-white text-black' : 'bg-red-600 text-white'}`}
                        >
                          Multimedia
                        </button>
                    )}
                    </Tab>
                </Tab.List>

Результат:

Возможная причина:

Отрисовка кнопок выполняется дважды безголовым пользовательским интерфейсом, в противном случае сама кнопка имеет требуемые отступы.

Также, если это может помочь, я добавил .babelrc.js и обновил _document.js для работы двойного макроса:

.babelrc.js

      module.exports = {
    presets: [['next/babel', { 'preset-react': { runtime: 'automatic' } }]],
    plugins: ['babel-plugin-macros', ['styled-components', { ssr: true }]],
  }

_document.js

      import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage
    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: App => props => sheet.collectStyles(<App {...props} />),
        })
      const initialProps = await Document.getInitialProps(ctx)

      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      }
    } finally {
      sheet.seal()
    }
  }
}

Любая помощь или предложение приветствуются

РЕДАКТИРОВАТЬ: изменение кнопки на div решило проблему. Я все еще не совсем уверен, как это решено, хотя

1 ответ

Решение

сам рендерит a. Итак, чтобы предотвратить вложение button элемент внутри другого, вам нужно использовать as опора на Tab составная часть:

      <Tab.List className="flex sm:flex-col">
  <Tab as={Fragment}>
    {({ selected }) => (
      <button
        className={`px-6 py-4 ${
          selected ? 'bg-white text-black' : 'bg-red-600 text-white'
        }`}
      >
        Frontend
      </button>
    )}
  </Tab>

  {/*...*/}
</Tab.List>

Вы также можете:

      <Tab.List className="flex sm:flex-col">
  <Tab
    className={({ selected }) =>
      `px-6 py-4 ${selected ? 'bg-white text-black' : 'bg-red-600 text-white'}`
    }
  >
    Frontend
  </Tab>

  {/*...*/}
</Tab.List>

Ссылка: https://headlessui.dev/react/tabs#styling-the-selected-tab

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