如何将 CSS 和样式应用到 React 组件

IT技术 html css reactjs
2021-04-22 12:40:10

我一直在寻找,但是,我没有找到任何方法来设置我创建的 React.js 文件的样式,我从标准网页转换它,所以我有原始的 CSS,但是,我不知道如何使用 React 以正确的样式显示页面。

任何帮助,将不胜感激!

var NavBar = React.createClass({
  render: function() {
    return (
      /* NavBar */
      <div className="dark_bg_color">
        <img src="logo.png" />
        <div className="table_center">
          <div>
            <ul>
              <li>daily specials</li>
              <li>gift gallery</li>
              <li>events</li>
              <li><i className="fa fa-search" />&nbsp;search</li>
            </ul>
          </div>
        </div>
        <div className="right_nav">
          <div className="table_center">
            <div>
              <button type="button">Sign Up</button>
              <button type="button">Log In</button>
              <div className="vertical-line">&nbsp;</div>
              <button type="button">Cart</button>
            </div>
          </div>
        </div>
      </div>
    );
  }
});
ReactDOM.render(<NavBar />, document.getElementById('nav'));

var Gallery = React.createClass({
  render: function() {
    return (
      /* Gallery */
      <div >
        <div align="middle">
          <div id="head">
            <img id="pic" align="middle" max-width="100%" src="title_pic.png" />
            <div align="left" className="big">
              <div>
                <span>Dine with the Best</span>
                <div className="words">
                  <span>BonApp connects you with limited-time, exclusive meals and events offered by the city’s best chefs.<br /><br /><br /><button type="button">JOIN BONAPP</button></span>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
});
ReactDOM.render(<Gallery />, document.getElementById("Gallery"));

var WhatsNew = React.createClass({
  render: function() {
    return (
      <div  className="dark_bg_color">
        <h2 style={{marginBottom: 30}}>
          <span>What's New</span>
        </h2>
        <div className="autoplay">
          <img src="whatsnew0.png" />
          <img src="whatsnew1.png" />
          <img src="whatsnew0.png" />
        </div>
      </div>
    );
  }
});
ReactDOM.render(<WhatsNew />, document.getElementById("whatsnew"));

var BonEvents = React.createClass({
  render: function() {
    return (
      /* Events */
      <div id="events" className="dark_bg_color">
        <div className="box">
          <div className="box-text">
            <div className="horizontal-line" />
            <div><div className="horizontal-line" /><p>LES BON CADEAUX</p></div>
            <div className="horizontal-line" />
          </div>
        </div>
        <h2>
          <span>Bon Events</span>
        </h2>
        <div>
        </div>
      </div>
    );
  }
});
ReactDOM.render(<BonEvents />, document.getElementById("events"));

var IOS = React.createClass({
  render: function() {
    /* IOS */
    return (
      <div >
        <h2>
          <span />
        </h2>
      </div>
    );
  }
});
ReactDOM.render(<IOS />, document.getElementById("advertiseApp"));

var Footer = React.createClass({
  render: function() {
    return (
      /* Footer */
      <div>
        <div className="footer_center">
          <div>
            <ul>
              <li>ABOUT</li>
              <li>PRESS</li>
              <li>CONTACT</li>
              <li>SUPPORT</li>
              <li>BONAPP FOR RESTAURANTEURS</li>
            </ul>
          </div>
        </div>
        <div className="legal_center">
          <div>
            <ul>
              <li>Copyright © 2016 BonApp Dining Inc.</li>
              <li>Privacy Policy</li>
              <li>Legal</li>
            </ul>
          </div>
        </div>
      </div>
    );
  }
});
ReactDOM.render(<Footer />, document.getElementById("footer"));
6个回答

第一次阅读您的问题会使您的现有 CSS 在您对网页进行“react”时似乎无法正常工作。

这应该。

如果不是,则还有其他事情需要进一步诊断才能解决。我最近在 React 中重写了我的一个项目,并继续使用完全相同的 CSS 文件,并且效果很好。

但是,如果您要问解决此问题的最佳方法......

正如其他人所说,React 更喜欢内联样式

但是,我没有它很乱,很难改变,而且很容易变得笨拙。

SCSS 或 LESS 是在 React 中设置样式的最佳方式。

但为什么?以下是几个原因:

你的 CSS 是可重用的

如果您使用 React 方式进行内联样式设置,那么它非常适合几个组件。

但是,当这些组件开始堆积时,您开始意识到自己一次又一次地使用相同的样式。这很糟糕。

很容易做出改变

当一个组件需要更新样式时,你不再需要通过你的 React 代码来找到正确的组件(或者它是父组件?)并修复它。

相反,只需像您一直使用的那样使用 CSS。

您不必担心覆盖

在 CSS 的级联部分,内联样式是最后一站它们会覆盖所有内容。

起初,这听起来像是您正在实施的样式的一个很好的解决方案,在宣传册网站中,也许它会很好。但是,当您开始使用更大的应用程序时,您会遇到几乎无法解决的问题。

与其与 CSS 的级联部分作斗争,不如使用它并将您的样式保持在同一位置。

您随处使用 SCSS 和 LESS

对我来说最重要的一点是,如果你在 React 中工作并且你更喜欢内联样式,它们可以很好地工作。

但是当你转向任何其他框架时会发生什么?突然间,那些内联样式不能很好地工作,而您又回到了与我们其他人一起编写“正常”CSS 的状态。那么为什么只为一个框架改变事情呢?

我知道如果你全职在 React 工作并且尝试新的最佳实践是有意义的,但是对于我们大多数人来说,当你只能在一个模型上使用那个轮子时,重新发明轮子是没有意义的车。

如果您想将事情分开,您可以.scss为要设置样式的特定组件创建一个文件,然后将其导入到您的组件文件中。

示例

文件夹结构:

components
|
|--Card
   |
   |--Card.js
   |--Card.scss
   |--index.js
|--Some Other Component Folder 

Card.js:

import React, { Component } from 'react';
import classes from './Card.scss';

export class Card extends Component {

    render () {
        return (
            <div className={`${classes.layout} col`}>
                <div className={`${classes.card} card`}>
                    <div className="card-image">
                        <ProviderImage />
                    </div>
                </div>
            </div>
        );
    }
}

export default Card;

卡片.scss:

.layout {
    img {
        display: block;
        max-width: 372px;
        max-height: 372px;
        height: auto;
        width: auto;
    }
}

.card {
    width: 370px;
    height: 550px;
}

这将保留包含在其各自组件中的样式。

如果我需要在js文件中使用 css怎么办?我也想使用媒体查询
2021-06-05 12:40:10
请问.layout img风格也得到应用?
2021-06-15 12:40:10
我已经多次尝试使此代码正常工作,我将在页面上发布我的一些代码,以便您可以看到我正在使用的内容。
2021-06-18 12:40:10
这工作正常,但你需要确保你有使用 sass 加载器的 Webpack。参见:github.com/jtangelder/sass-loader
2021-06-21 12:40:10

从技术上讲,您可以<head>像使用普通 CSS 文件一样在 HTML 文档中添加CSS。只要您的 React 组件具有相同的类(除了明显应用为classNameno just class),它就会起作用。

如果您正在寻找更现代和面向 Javascript 的东西,您可以查看CSS Modules,并在此处阅读有关它们的更多信息:

https://css-tricks.com/css-modules-part-1-need/

不过,第二种方法显然有更多的学习曲线。

正如 Vijay 提到的,React 更喜欢内联样式

一种常见的模式是每个组件都有一个styles包含该组件中使用的所有样式的单个对象,如下所示:

var styles = {
  navBar: {
    backgroundColor: 'dark blue'
  },
  center: {
    textAlign: 'center'
  },
  rightNav: {
  },
  verticalLine: {
  },
};

var NavBar = React.createClass({
  render: function() {
    return (
      <div style={styles.navBar} >
        <img src="logo.png" />
        <div style={styles.center} >
          <div>
            <ul>
              <li>daily specials</li>
              <li>gift gallery</li>
              <li>events</li>
              <li><i className="fa fa-search" />&nbsp;search</li>
            </ul>
          </div>
        </div>
        <div style={styles.rightNav}>
          <div style={styles.center}>
            <div>
              <button type="button">Sign Up</button>
              <button type="button">Log In</button>
              <div style={styles.verticalLine} >&nbsp;</div>
              <button type="button">Cart</button>
            </div>
          </div>
        </div>
      </div>
    );
  }
});
@PardeepJain 我相信 Radium 增加了对媒体查询的支持
2021-06-06 12:40:10
如果我必须在相同的代码中使用媒体查询怎么办?
2021-06-14 12:40:10

Sass 可以让你嵌套 CSS 选择器,遵循与 HTML 相同的视觉层次结构。请注意,过度嵌套的规则会导致过度限定的 CSS,这可能难以维护,并且通常被认为是不好的做法。让我用一个例子来解释。

英雄.jsx

import "./Hero.scss";

import React, { Component } from "react";

class Hero extends Component {
  render() {
    return (
      <div className="hero-component">
        <span className="hero-header">Scss is awsome.</span>
      </div>
    );
  }
}

export default Hero;

英雄.scss

.hero-component {
    .hero-header {
        <!-- Hero header style goes here -->
    }

    .other-class {}
}