qodunpob
@qodunpob
Look at my code, my code is amazing!

Возможно ли в react-компонентах использовать микс классов по БЭМ?

Согласно БЭМ, для модификации стилей какого-либо блока, при его нахождении внутри другого блока используется микс стилей блока и элемента. Возможен ли такой подход, если вложенный блок представлен react-компонентом? Например:
class Avatar extends React.Component {
  render() {
    return (
      <img className="avatar" src={this.props.user.avatarUrl} alt={this.props.user.name} />
    );
  }
}

class UserInfo extends React.Component {
  render() {
    return (
      <div className="user-info">
        <Avatar user={this.props.user} /> 
        <div className="user-info__name">{this.props.user.name}</div>
      </div>
    );
  }
}


Возможно ли, чтобы у компонента Avatar внутри компонента UserInfo был микс классов avatar и user-info__avatar?
  • Вопрос задан
  • 407 просмотров
Решения вопроса 1
Если я вас правильно понял:

class Avatar extends React.Component {
  render() {
    const finalClassName = 'avatar ' + (this.props.className || '')
    return (
      <img className={finalClassName} src={this.props.user.avatarUrl} alt={this.props.user.name} />
    );
  }
}


class UserInfo extends React.Component {
  render() {
    return (
      <div className="user-info">
        <Avatar className="user-info__avatar" user={this.props.user} /> 
        <div className="user-info__name">{this.props.user.name}</div>
      </div>
    );
  }
}


Т.е. просто передавайте className как props компоненту Avatar, затем объединяйте в один классНейм:
// выражение в скобочках нужно, чтобы не получилось 'avatar undefined', когда className не передан.
// Я рекомендую указать className, равное '', в defaultProps компонента Avatar
const finalClassName = 'avatar ' + (this.props.className || '')


Также в npm есть удобный пакет https://www.npmjs.com/package/classnames , который позволяет формировать строку с классами. Ваш пример выглядел бы так:

const finalClassName = classnames({
  'avatar': true,
  [this.props.className]: !!this.props.className,
  'some-other-class': someCondition
})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы