Условное появление аттрибута работает в React, но не работает в Next.js?

Почему в Next.js отмеченная строка при false отображается в html, как data-text-btn-active="false"? Вместо того, чтобы не отображаться вовсе? Это boolean значение.

Я только что в реакте делал тоже самое и все предсказуемо отрабатывает (атрибут просто не появляется в html). Это же фреймворк на базе реакта? Или я что-то не так делаю?

const TextButton: React.FC<TextButtonProps> = ({ thisSlide, currentSlide }) => {
  const [isActive, setIsActive] = React.useState(false);

  const onTextBtnClick = () => {
    setIsActive((b) => !b);
  };

  return (
    <button
      onClick={onTextBtnClick}
      className={s.textBtn}
      data-text-btn-active={isActive ? true : false} // ЭТА СТРОКА
      aria-label={`Show / hide entire message.`}
      aria-pressed={isActive ? "true" : "false"}></button>
  );
};

Ответы (1 шт):

Автор решения: Akniyet Maratov

В React и Next.js, преобразование значений в атрибутах HTML может происходить несколько иначе, чем в чистом JavaScript или HTML. В данном случае, даже если isActive является булевым значением true или false, React преобразует его в соответствующую строку при рендеринге.

Если вам необходимо, чтобы атрибут вообще не появлялся в HTML, когда isActive равен false, вам следует использовать логический оператор && или условный оператор.

Вот пример, как это можно сделать:

const TextButton: React.FC<TextButtonProps> = ({ thisSlide, currentSlide }) => {
  const [isActive, setIsActive] = React.useState(false);

  const onTextBtnClick = () => {
    setIsActive((prev) => !prev);
  };

  const buttonProps = {
    onClick: onTextBtnClick,
    className: s.textBtn,
    "aria-label": "Show / hide entire message.",
    "aria-pressed": isActive ? "true" : "false",
  };

  if (isActive) {
    buttonProps["data-text-btn-active"] = true;
  }

  return <button {...buttonProps}></button>;
};

В этом примере мы создаем объект buttonProps, который содержит все свойства кнопки. Затем мы проверяем, активно ли состояние (isActive), и если да, добавляем свойство data-text-btn-active к объекту buttonProps. Наконец, мы передаем этот объект как пропсы для кнопки.

→ Ссылка