javascript - 如何在 React 中动态设置 css 属性(背景颜色)?

标签 javascript css reactjs loops jsx

我有一个基于具有其特征的对象数组的幻灯片,其中之一是当前幻灯片的 background-color。我有一个名为 bg 的属性来存储它。这就是我用来设置每个背景颜色的方法,每个图像都会更改,但是我正在使用 inline style 来做到这一点。

我想知道是否有一种方法可以在不使用这种内联样式的情况下做到这一点?

这是我的代码示例:

import React from 'react'
import { Fragment } from 'react'

import classes from './MainPageHeader.module.css'

const MainPageHeader = props => {

    let [minorSlideImg, setMinorSlideImg] = React.useState(0)

    let minorSlides = [
        {
            img: require('../../../assets/images/Header/MinorSlider/imgSolo1-mainpage.png'),
            alt: 'Produto 1',
            linkText: ['PRODUTO 5', '$ 19.99'],
            productId: 5,
            bg: 'rgb(151, 105, 105)'
        },
        {
            img: require('../../../assets/images/Header/MinorSlider/imgSolo2-mainpage.png'),
            alt: 'Produto 2',
            linkText: ['PRODUTO 13', '$ 199.99'],
            productId: 13,
            bg: '#fad3e0'
        },
        {
            img: require('../../../assets/images/Header/MinorSlider/imgSolo3-mainpage.png'),
            alt: 'Produto 3',
            linkText: ['PRODUTO 10', '$ 499.99'],
            productId: 10,
            bg: '#ccc'
        },
        {
            img: require('../../../assets/images/Header/MinorSlider/imgSolo4-mainpage.png'),
            alt: 'Produto 4',
            linkText: ['PRODUTO 11', '$ 999.99'],
            productId: 11,
            bg: 'rgb(238, 225, 183)'
        },
    ]
    
    const passSlideHandler = () => {
        if (minorSlideImg < minorSlides.length - 1) {
            setMinorSlideImg(minorSlideImg + 1)
        } else {
            setMinorSlideImg(0)
        }
    }   
    
    React.useEffect(() => {
        const interval = setTimeout(() => {
            passSlideHandler()
        }, 5000);
        return () => clearTimeout(interval);
    });    


    return (
        <Fragment>
            <div 
                className={classes.MinorSlider_subContainer} 
                style={{backgroundColor: minorSlides[minorSlideImg].bg}} // <= This is what I'd like to remove
            >
                <img 
                    src={minorSlides[minorSlideImg].img}
                    alt={"img-1"} 
                />
            </div>
        </Fragment>
    )
}

export default MainPageHeader

CSS:

.MinorSlider_subContainer {
    height: 65%;
    width: 50%;
    background-color: #ccc;
}

.MinorSlider_subContainer img {
    max-width: 100%;
}

.MinorSlider_subContainer div {
    position: relative;
    background-color: white;
    width: 100%;
    height: 65px;
}

.MinorSlider_subContainer div > *{
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;

    width: 100%;
    height: 100%;
    padding-left: 25px;
    text-decoration: none;
}

.MinorSlider_subContainer div p {
    margin: 0;
    color: rgb(75, 75, 75);
}

可以看出,minorSlides 的索引每五秒更改一次,因此,正在显示的幻灯片也会更改。该索引用于引用当前幻灯片的每个功能。

那么,有没有办法删除这种内联样式并使我的 JSX 更干净?

如果我使用 HTML、CSS 和 JS,我可以使用 JQuery 甚至纯 JS 来做到这一点,但我不知道如何在这里做到这一点。我知道我可以用循环创建元素,但我只想继续更改索引而不是整个元素。

这是幻灯片:

enter image description here

最佳答案

如果您不能为每种颜色创建一个 css 类,另一种选择是添加 style 标签并覆盖 background-color 属性:

const subcontainerBackground = `.${classes.MinorSlider_subContainer} { background-color: ${minorSlides[minorSlideImg].bg}}`
        
return {(
   <Fragment>
      <style>
        {subcontainerBackground}
      </style>
      <div className={classes.MinorSlider_subContainer} >
         //....
      </div>
    </Fragment>
}

编辑

您还可以使用 Document.createElement() 添加样式标签:

  useEffect(() => {
    const content = `.${classes.MinorSlider_subContainer} { background-color: ${minorSlides[minorSlideImg].bg}}`;
    const style = document.createElement("style");
    style.innerHTML = content;
    document.head.appendChild(style);

    return () => document.head.removeChild(style);
  }, [minorSlideImg]);

关于javascript - 如何在 React 中动态设置 css 属性(背景颜色)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65277224/

相关文章:

javascript - 重绘: Bars not displaying on Print Preview with React-Responsive

javascript - 当我在背景图像 div 上应用叠加颜色时,内容会被禁用

html - css height/min-height 100% 窗口

html - 使导航下方的 'width: 100%'图像成为手机上导航栏的背景

javascript - 将剪切的 contenteditable div 的 View 移动到光标位置

reactjs - 在reactjs中重新加载页面时如何修复404

javascript - 自动完成添加额外空格

javascript - 所有字母字符或所有整数的测试字符串

javascript - NodeJS Passport 未知认证策略

reactjs - 如何使用facebook jest测试.jsx文件,找不到模块