传递类名以响应组件

IT技术 javascript reactjs
2021-04-13 23:10:23

我正在尝试将类名传递给 react 组件以更改其样式,但似乎无法正常工作:

class Pill extends React.Component {

  render() {

    return (
      <button className="pill {this.props.styleName}">{this.props.children}</button>
    );
  }

}

<Pill styleName="skill">Business</Pill>

我试图通过传入具有相应样式的类的名称来更改药丸的样式。我是 React 的新手,所以也许我没有以正确的方式做这件事。谢谢

6个回答

在 React 中,当你想传递一个解释表达式时,你必须打开一对花括号。尝试:

render () {
  return (
    <button className={`pill ${ this.props.styleName }`}>
      {this.props.children}
    </button>
  );
}

使用类名npm 包

import classnames from 'classnames';

render() {
  return (
    <button className={classnames('pill', this.props.styleName)}>
      {this.props.children}
    </button>
  );
}
需要注意的重要事项:如果props.styleName是可选的并且您省略它,您将undefined在您的class列表中。所以{`pill ${ this.props.styleName }`}不是那么好。最后,您还将有多余的空白。
2021-05-22 23:10:23
为什么更好:性能?可读性?其他的 ?文字字符串(你的第一个例子)是 ES6 的一部分,所以它是一个标准。它减少了代码并避免了导入。感觉对我好,但其他的解决方案可能有争论。
2021-05-27 23:10:23
{} 大括号、[] 方括号、() 圆括号 - 您不需要说“花括号”,因为根据定义,大括号是大括号。
2021-06-09 23:10:23
在上面的例子中你是完全正确的,最好使用 ES6 字符串。当您必须处理条件时,我会说类名在可读性和 DRY 方面更好,就像在类名自述文件中显示github.com/JedWatson/classnames#usage-with-reactjs 一样
2021-06-16 23:10:23

仅供参考,对于无状态组件:

// ParentComponent.js
import React from 'react';
import { ChildComponent } from '../child/ChildComponent';

export const ParentComponent = () =>
  <div className="parent-component">
    <ChildComponent className="parent-component__child">
      ...
    </ChildComponent>
  </div>

// ChildComponent.js
import React from 'react';

export const ChildComponent = ({ className, children }) =>
  <div className={`some-css-className ${className}`}>
    {children}
  </div>

将呈现:

<div class="parent-component">
  <div class="some-css-className parent-component__child">
    ...
  </div>
</div>
不应该将 className 属性添加到 React 组件中,将该 className 传递给第一个容器元素,而不是将其作为 name 属性传递吗?
2021-06-11 23:10:23
@theSereneRebel 不,它没有。在此处查看示例:codesandbox.io/s/clever-knuth-enyju
2021-06-11 23:10:23
@theSereneRebel 这是否是一件好事是另一个话题。
2021-06-15 23:10:23

pill ${this.props.styleName} 当你不设置props时会得到“pill undefined”

我更喜欢

className={ "pill " + ( this.props.styleName || "") }

或者

className={ "pill " + ( this.props.styleName ? this.props.styleName : "") }
最后你仍然会有一个多余的空格。并不是说它改变了什么,但仍然如此。
2021-06-13 23:10:23
我停止了这样的空白区域: className={props.styleName ? "药丸" + props.styleName : "药丸" }
2021-06-13 23:10:23

对于任何感兴趣的人,我在使用css modulesreact css modules时遇到了同样的问题

大多数组件都有一个关联的 css module样式,在这个例子中,我的Button有自己的 css 文件,Promo父组件也是如此。但我想将一些额外的样式Promo传递给Button

所以style能够按钮看起来像这样:

按钮.js

import React, { Component } from 'react'
import CSSModules from 'react-css-modules'
import styles from './Button.css'

class Button extends Component {

  render() {

    let button = null,
        className = ''

    if(this.props.className !== undefined){
        className = this.props.className
    }

    button = (
      <button className={className} styleName='button'>
        {this.props.children}
      </button>
    )

    return (
        button
    );
  }
};

export default CSSModules(Button, styles, {allowMultiple: true} )

在上面的 Button 组件中,Button.css样式处理常见的按钮样式。在这个例子中只是一个.button

然后在我想使用Button 的组件中,我还想修改按钮的位置等内容,我可以设置额外的样式Promo.css并作为classNameprops传递在这个例子中再次调用.button类。我可以称之为任何东西,例如promoButton

当然,对于 css module,此类将是,.Promo__button___2MVMD而按钮将是类似的.Button__button___3972N

促销.js

import React, { Component } from 'react';
import CSSModules from 'react-css-modules';
import styles from './Promo.css';

import Button from './Button/Button'

class Promo extends Component {

  render() {

    return (
        <div styleName='promo' >
          <h1>Testing the button</h1>
          <Button className={styles.button} >
            <span>Hello button</span>
          </Button>
        </div>
      </Block>
    );
  }
};

export default CSSModules(Promo, styles, {allowMultiple: true} );
2018 年更新:使用propTypesdefaultProps处理属性可能存在或不存在的情况更干净,更受欢迎
2021-06-16 23:10:23

正如其他人所说,使用带花括号的解释表达式。

但不要忘记设置默认值。
其他人建议使用 OR 语句来设置空字符串 if undefined

但最好是声明你的 Props。

完整示例:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

class Pill extends Component {

  render() {

    return (
      <button className={`pill ${ this.props.className }`}>{this.props.children}</button>
    );
  }

}

Pill.propTypes = {
  className: PropTypes.string,
};

Pill.defaultProps = {
  className: '',
};