React Tailwind Dynamic Div Высота не обновляет расчет поста

У меня есть экран с двумя элементами div: верхняя панель навигации (высота 80 пикселей) и компонент div под панелью навигации (оставшаяся высота экрана).

Поскольку я использую форматирование попутного ветра, это выглядит примерно так:

<div className = "w-screen h-[80px]"> //navbar
</div>
<div className = "w-screen h-screen"> //bottom content div
</div>

Проблема: панель навигации имеет размер 80 пикселей, а нижний контент динамический, но внизу появляется белый пробел. Белый зазор исчезнет при использовании h-экрана (100% vw).

Из-за высоты панели навигации 80 пикселей я должен динамически вычитать нижний div (h-screen-80px), иначе появится вертикальная полоса прокрутки, которую я не хочу. Итак, у меня есть слушатель для обновления высоты окна в зависимости от текущего размера окна (включая события изменения размера окна). Затем я вычитаю эту высоту на 80, составляю строку для попутного ветра и обновляю className. Хотя он работает нормально, и инспектор показывает, что он динамически обновляет высоту div, визуально она не регулируется должным образом.

Новая попытка с прослушивателем событий окна и вычислением. Обратите внимание, что вычисленный heightMinusNavbar корректно обновляется при изменении размера окна, но визуально не

import React from "react";
import Gallery from "../components/gallery/Gallery";
import Navbar from "../components/navbars/Dapp";

class dashboard extends React.Component {
  constructor(props) {
    super(props);
    this.state = { width: 0, height: 0 };
    this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
  }

  componentDidMount() {
    this.updateWindowDimensions();
    window.addEventListener("resize", this.updateWindowDimensions);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.updateWindowDimensions);
  }

  updateWindowDimensions() {
    this.setState({ width: window.innerWidth, height: window.innerHeight });
  }

  // todo: change height to be full screen subtracted by nav height

  render() {
    const heightMinusNavbar = `h-[${(this.state.height - 80).toString()}px]`;
    console.info("heightMinusNavbar " + heightMinusNavbar);

    return (
      <>
        <Navbar />
        <div
          className = {`w-screen text-gray-300 y-full bg-gray-900 ${heightMinusNavbar}`}
        >
          <Gallery />
        </div>
      </>
    );
  }
}

export default dashboard;

Что я делаю неправильно?

Вероятно, потому что это имя динамического класса. tailwindcss.com/docs/content-configuration#dynamic-class-nam‌​es

stickyuser 29.09.2022 16:10

Спасибо что подметил это. Итак, то, что я делаю, кажется антипаттерном для Tailwind CSS. Вы предлагаете мне использовать собственный javascript без попутного ветра для этого конкретного случая и вместо этого применить CSS к компоненту? Я делал это раньше в приложениях в прошлом, но они не реагировали/попутный ветер, и я не уверен, что это лучшая практика.

Potion 29.09.2022 18:54

Неважно, я нашел это решение, в котором говорится об использовании стиля встроенного состояния реакции. Ключ в том, чтобы убедиться, что вы используете состояние, потому что реакция будет повторно отображаться при изменении состояния. stackoverflow.com/questions/50273232/…

Potion 29.09.2022 19:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
238
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если ваша навигационная панель имеет фиксированную высоту 80 пикселей, вы можете просто использовать встроенный класс calc.

<div class = "h-20 bg-slate-300">Navbar</div>
<div class = "h-[calc(100vh-80px)] bg-slate-100">Gallery</div>

https://play.tailwindcss.com/bOun5kbE3O

Только что попробовал это и не кости. Я не думаю, что это сработает. Согласно этой странице (tailwindcss.com/docs/content-configuration#dynamic-class-na‌​mes) «Tailwind на самом деле не оценивает ваш исходный код и может обнаруживать только статические неразрывные строки классов».

Potion 29.09.2022 19:19

Это действующий Tailwind CSS, я даже дал ссылку на рабочий пример. Класс представляет собой полную неразрывную строку.

stickyuser 29.09.2022 19:25

Я вижу, что ваш пример работает, но по какой-то причине он не работает с моим реагирующим приложением. Интересно, могу ли я настроить или что-то еще, конфликтующее с ним.

Potion 29.09.2022 20:56

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

Potion 29.09.2022 20:58

Лично я бы выбрал один класс css, но они очень похожи. Я даже собирался предложить использовать встроенный стиль, пока не понял, что это можно сделать с помощью класса Tailwind.

stickyuser 29.09.2022 22:02

Да, подход с одним CSS чище. Для этого я выберу ваш в качестве подходящего ответа. Спасибо за помощь!

Potion 29.09.2022 23:11

Я нашел решение:

  • Используйте Tailwind для статического стиля (width text-grey-300 y-full bg-gray-900)
  • Используйте стиль Inline-State (height) React, хранящийся в переменной. Обратите внимание, что в приведенном ниже коде я использую style = {{ height: this.state.height - 80 }} для div.

Это связано с тем, что изменения состояния будут повторно отображать идеальный компонент. Таким образом, решение становится таким:

import React from "react";
import WalletConnect from "../components/WalletConnect/WalletConnect";
import fren1 from "../assets/fren/1.png";
import pixel1 from "../assets/fren/pix/1.gif";
import fren5 from "../assets/fren/5.png";
import MenuButton from "../components/buttons/MenuButton";
import { NftNamespace } from "alchemy-sdk";
import { collection } from "firebase/firestore";
import Gallery from "../components/gallery/Gallery";
import Navbar from "../components/navbars/Dapp";

class dashboard extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      width: window.innerWidth,
      height: window.innerHeight,
    };
    this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
  }

  componentDidMount() {
    this.updateWindowDimensions();
    window.addEventListener("resize", this.updateWindowDimensions);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.updateWindowDimensions);
  }

  updateWindowDimensions() {
    this.setState({
      width: window.innerWidth,
      height: window.innerHeight,
    });
  }

  render() {
    return (
      <>
        <Navbar />
        <div
          className = "w-screen text-gray-300 y-full bg-gray-900"
          style = {{ height: this.state.height - 80 }}
        >
          <Gallery />
        </div>
      </>
    );
  }
}

export default dashboard;

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