几种不同的技术来设计一些简单的React元素

66 阅读4分钟

设计你的React组件是创造有用和有意义的用户体验的一个重要部分。此外,这些构件决定了一个产品或品牌的感觉和外观。在React中,就像在大多数Web开发中一样,有更多的方法来解决这个挑战。我们将看看两个简单的方法来处理React组件的样式问题,然而,你可能会发现更符合你的喜好的方法。现在让我们为React中的几个元素设置样式。


用className添加样式

在JSX里面,我们可以给元素应用一个样式。然而,由于JSX编译成JavaScript,你不能使用常规的class关键字作为属性。相反,你需要使用className作为一个属性来为JSX中的任何元素设置样式。JavaScript已经有自己的class关键字,所以如果你试图使用它,你会得到错误。因此,让我们给我们的span元素添加一个简单的徽章样式。我们将选择badge badge-info来为span样式。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 0
  };

  render() {
    return (
      <React.Fragment>
        <span className="badge badge-info m-1">{this.styleCount()}</span>
        <button>Increment</button>
      </React.Fragment>
    );
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

我们还使用m-1添加了一丝边距,以获得一个漂亮的效果。
react className example

既然如此,让我们再一次在按钮元素上使用className属性,让它看起来更漂亮。让我们试试btn btn-primary,看看它看起来如何。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 0
  };

  render() {
    return (
      <React.Fragment>
        <span className="badge badge-info m-1">{this.styleCount()}</span>
        <button className="btn btn-primary">Increment</button>
      </React.Fragment>
    );
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

react className btn


类与样式

现在我们知道了如何使用className属性在JSX中为一个元素应用类。对于性能和易用性来说,这是一个好方法。另一个选择是使用JSX中的style属性,它接受一个普通的JavaScript对象作为值。这意味着你不使用CSS语法,而是使用CSS语法的Camel-cased JavaScript版本。这可以在内联中完成,也可以用一个不同的对象。让我们来看看这两种方法。


内联样式

注意,对于样式属性,有双大括号**{{ }}。这不是特殊的语法。外侧的大括号告诉JSX,即将到来的是动态内容。如果它是静态的,可以使用双引号""**。内部大括号是JavaScript对象的语法。该对象有键值对来表示要使用的样式。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 0
  };

  render() {
    return (
      <React.Fragment>
        <span
          style={{ border: "7px solid lightgray" }}
          className="badge badge-info m-1"
        >
          {this.styleCount()}
        </span>
        <button className="btn btn-primary">Increment</button>
      </React.Fragment>
    );
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

react inline style example


使用JavaScript对象的样式

就像我们在组件中创建了一个状态对象,我们也可以创建一个样式属性来填充JavaScript样式。当你可能有几个键值对时,这是一个很好的方法。内联的方法会变得很乱,很难推理。下面是一个增加了一些样式的例子。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 0
  };

  styles = {
    border: "7px solid lightgray",
    fontSize: 15,
    fontStyle: "italic"
  };

  render() {
    return (
      <React.Fragment>
        <span style={this.styles} className="badge badge-info m-1">
          {this.styleCount()}
        </span>
        <button className="btn btn-primary">Increment</button>
      </React.Fragment>
    );
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

react style object example


在React中动态地应用类

随着状态的变化,你经常想改变页面上某个元素的视觉风格。这样你就可以用简单的逻辑来选择是否应用一个或另一个类。所以我们在这里要做的是看count变量中的值。如果count的值为0,那么我们将应用黄色的徽章,否则,我们将对徽章应用一种信息色。下面是如何做到这一点的。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 10
  };

  render() {
    let classes = "badge m-3 badge-";
    classes += this.state.count === 0 ? "warning" : "info";

    return (
      <React.Fragment>
        <span className={classes}>{this.styleCount()}</span>
        <button className="btn btn-primary">Increment</button>
      </React.Fragment>
    );
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

当计数为10时,我们就得到了徽章的信息颜色。
react render classes dynamically

把这个计数设为0,我们就能看到另一种样式。酷!"。

  state = {
    count: 0
  };

react render classes dynamically example


将逻辑提取到一个方法中

上面的代码是有效的,但让我们把它清理一下。我们想把逻辑从render()方法中移除,并把它放在Item类中自己的方法中。在visual studio代码中,我们可以通过高亮显示我们想要重构的行,右键点击,然后选择 "重构... "来自动完成。
visual studio code refactor

在重构过程中,你可以为新方法选择一个名称。下面是我们完成这一步骤后得到的结果。

import React, { Component } from "react";

class Item extends Component {
  state = {
    count: 0
  };

  render() {
    return (
      <React.Fragment>
        <span className={this.styleBadge()}>{this.styleCount()}</span>
        <button className="btn btn-primary">Increment</button>
      </React.Fragment>
    );
  }

  styleBadge() {
    let classes = "badge m-3 badge-";
    classes += this.state.count === 0 ? "warning" : "info";
    return classes;
  }

  styleCount() {
    const { count } = this.state;
    return count === 0 ? "No Items" : count;
  }
}

export default Item;

这样可以保持render()方法的简洁,使代码更容易阅读。


React元素的简单样式设计技术总结

在本教程中,我们看了如何使用几种不同的技术来设计一些简单的React元素。最简单的方法是简单地包含一个伟大的CSS框架,如Bootstrap或Foundation,并使用这些类与className属性相结合。另一个选择是结合使用style属性和包含特定样式键值对的JavaScript对象。