Не отображаются UI в компонентах React TS
Проблематика: столкнулся с такой проблемой, при размещении двух компонентов в одном перестают отображаться некоторые UI элементы. Пример:
Главный компонент, в который импортируется 2 других компонента:
import Navigate from '../Navigate/Navigate'
import MainPageSlider from '../MainPageSlider/MainPageSlider'
const MainPage = () => {
return (
<>
<Navigate/>
<MainPageSlider/>
</>
)
}
export default MainPage
Компонент Navigate:
import { useState } from 'react'
import NavigateLinks from '../NavigateLinks/NavigateLinks'
import BurgerIcon from '../UI/BurgerIcon/BurgerIcon'
import styles from './Navigate.module.scss'
import logo from '../../assets/imgs/img-logo.jpg'
const Navigate = () => {
const [isOpenMenu, setIsOpenMenu] = useState<boolean>(false)
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
event.preventDefault();
setIsOpenMenu(prevState => !prevState)
}
return (
<>
<section className={styles['section__navigate']}>
<div className={styles['container__logo']}>
<div className={styles['logo']}>
<img src={logo} alt="Логотип компании" width={55} height={55}/>
<span>Казанский ТЮЗ</span>
</div>
<BurgerIcon onClick={handleClick}/>
</div>
<div className={styles['container__navigate']}>
<div className={styles['container__links']}>
<nav>
<ul className={isOpenMenu ? styles['showMenu'] : ''}>
<NavigateLinks/>
</ul>
</nav>
</div>
</div>
</section>
</>
)
}
export default Navigate
Его стили:
@use '../../styles_helper/colors.scss' as *;
.section__navigate {
display: flex;
align-items: center;
padding: 10px 40px;
width: 100%;
.container__logo {
.logo {
display: flex;
align-items: center;
span {
display: none;
font-family: 'SF Pro Display', sans-serif;
font-size: 14px;
color: $color-text;
margin: 0px 0px 0px 25px;
}
}
}
.container__navigate {
display: flex;
align-items: center;
.container__links {
nav {
margin: 0px 0px 0px 35px;
ul {
display: flex;
li {
margin: 0px 35px 0px 0px;
}
}
}
}
}
}
@media screen and (max-width: 700px) {
.section__navigate {
flex-direction: column;
.container__logo {
display: flex;
justify-content: space-between;
width: 100%;
.logo {
span {
display: block;
}
}
}
.container__navigate {
.container__links {
nav {
ul {
display: none;
flex-direction: column;
li {
margin: 10px 0px;
}
}
}
}
}
}
.showMenu {
display: flex !important;
}
}
Компонент MainPageSlider:
import { useEffect, useState } from "react"
import ButtonSlider from "../UI/ButtonSlider/ButtonSlider"
import InfoTheater from "../InfoTheater/InfoTheater"
import { loadImages } from "../../helper/images"
import styles from './MainPageSlider.module.scss'
const MainPageSlider = () => {
const [imagesList, setImagesList] = useState<string[]>([])
const [currentIndexImage, setCurrentIndexImage] = useState<number>(0)
useEffect(() => {
const fetchImages = async () => {
const images = await loadImages()
setImagesList(images)
}
fetchImages()
}, [])
const handleClickRight = (event: React.MouseEvent<HTMLButtonElement>) => {
event.preventDefault()
setCurrentIndexImage((prevIndex => (prevIndex + 1) % imagesList.length))
}
const handleClickLeft = (event: React.MouseEvent<HTMLButtonElement>) => {
event.preventDefault()
setCurrentIndexImage((prevIndex) => (prevIndex - 1 + imagesList.length) % imagesList.length)
}
return (
<>
<div className={styles['images__list']}>
{imagesList.map((item, index) => (
<div
key={index}
className={styles['images']}
style={{
opacity: currentIndexImage === index ? 1 : 0,
visibility: currentIndexImage === index ? 'visible' : 'hidden',
}}
>
<img src={item} alt="" />
</div>
))}
<div className={styles['container-content']}>
<div className={styles['text']}>
<span>Казанский театр <br/>юного зрителя</span>
</div>
<div className={styles['button-slider']}>
<ButtonSlider onClickButtonLeft={handleClickLeft} onClickButtonRight={handleClickRight}/>
</div>
</div>
</div>
<InfoTheater/>
</>
)
}
export default MainPageSlider
Его стили:
@use '../../styles_helper/colors.scss' as *;
.images__list {
display: flex;
justify-content: flex-end;
align-items: flex-end;
width: 100%;
height: 633px;
position: relative;
overflow: hidden;
z-index: 0;
.images {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: opacity 0.3s ease-in-out;
opacity: 0;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.container-content {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
z-index: 1;
.text {
margin: 40px;
span {
font-family: 'SF Pro Display', sans-serif;
font-weight: 700;
font-size: 72px;
color: $color-text-background;
}
}
.button-slider {
display: block;
margin: 100px 40px 0px 0px;
z-index: 2;
}
}
}
@media screen and (max-width: 700px) {
.images__list {
.images {
img {
filter: brightness(40%)
}
}
.container-content {
.text {
span {
font-size: 44px;
}
}
// .button-slider {
// display: none;
// }
}
}
}
Вывод:
Не отображается компонент ButtonSlider:

При этом если не импортировать 2 компонента сразу, а только 1, то он появляется:

Но есть момент, если импортировать 2 компонента сразу и изменять размер экрана, то компонент ButtonSlider все таки появляется:

Сам компонент ButtonSlider:
import React, { FC } from 'react'
import styles from './ButtonSlider.module.scss'
interface IButtonSlider {
onClickButtonLeft: (event: React.MouseEvent<HTMLButtonElement>) => void
onClickButtonRight: (event: React.MouseEvent<HTMLButtonElement>) => void
}
const ButtonSlider: FC<IButtonSlider> = ({onClickButtonLeft, onClickButtonRight}) => {
return (
<>
<div className={styles['group__buttons']}>
<button onClick={onClickButtonLeft} className={styles['button-left']}/>
<button onClick={onClickButtonRight} className={styles['button-right']}/>
</div>
</>
)
}
export default ButtonSlider
Его стили:
@use '../../../styles_helper/colors.scss' as *;
.group__buttons {
display: flex;
align-items: center;
.button-right {
width: 45px;
height: 45px;
background: $color-text-background;
border: 1px solid $color-text-background;
border-radius: 50%;
cursor: pointer;
margin: 0px 0px 0px 10px;
&::after {
content: '>';
font-size: 20px;
color: $color-text;
}
}
.button-left {
width: 45px;
height: 45px;
background: $color-text-background;
border: 1px solid $color-text-background;
border-radius: 50%;
cursor: pointer;
&::after {
content: '<';
font-size: 20px;
color: $color-text;
}
}
}
Прошу помочь с решением проблемы, второй день не могу понять в чём именно проблема. Похожих вопросов не нашел.
Если потребуется дополнительная фактура, то пишите, приложу.
Ответы (1 шт):
Методом исключения выявил корень причины ошибки. Она заключался в компоненте UI элемента BurgerIcon
Стоит обратить внимание на то, как передаются стили. Необходимо указывать className, а не style, ведь style предназначен для inline стилей. В общем то из-за этого и не отображались UI в некоторых компонентах (хоть они и успешно и применялись, но поскольку используется module, то надо ОБЯЗАТЕЛЬНО использовать className={styles['Что-то__ваше']} если хотите стили подтягивать из файла scss)
