1.6.7 • Published 3 years ago

react-simple-bem v1.6.7

Weekly downloads
2
License
MIT
Repository
github
Last release
3 years ago

react-simple-bem

Build Status Coverage Status All download License

Library for easier use of BEM methodology in React JS

Install

npm i react-simple-bem --save

How to use

import React from 'react';
import {Block, Element} from 'react-simple-bem';

const SomeComponent = () => (
    <Block bemName="header" bemMod="dark" className="not-bem-class">
        <Element bemName="logo">
            [...]
        </Element>
        <Element bemName="menu" bemMod={['special', 'awesome']} tagName="nav">
            [...]
        </Element>
    </Block>
);

output :

The Element component automatically retrieves the name of its block.

<div class="header header--dark not-bem-class">
    <div class="header__logo">
        [...]
    </div>
    <nav class="header__menu header__menu--special header__menu--awesome">
        [...]
    </nav>
</div>

Correct values for props bemName and bemMod

TypeReact (JSX)Output (HTML)
string<Block bemName="header" bemMod="dark" /><div class="header header--dark">
string with space<Block bemName="header" bemMod="dark big" /><div class="header header--dark header--big">
array<Block bemName="header" bemMod={['dark', 'big']} /><div class="header header--dark header--big">
object (recommended for conditions)<Block bemName="header" bemMod={{'dark': true, 'big': false}} /><div class="header header--dark">
object with function as value<Block bemName="header" bemMod={{'dark': () => true, 'big': () => false}} /><div class="header header--dark">

Using with modules styles loader

import React from 'react';
import {Block, Element, BemStyles} from 'react-simple-bem';
import modulesStyles from 'style.scss'; // {header : 'header_08c6a5', header__logo : 'header__logo_08c6a5'}

const SomeComponent = () => (
    <BemStyles styles={modulesStyles}>
        <Block bemName="header">
            <Element bemName="logo" />
        </Block>
    </BemStyles>
);

output :

<div class="header_08c6a5">
    <div class="header__logo_08c6a5"></div>
</div>

Settings

NameTypeDefault
elementDelimiterstring__
modifierDelimiterstring--
bemIndicationModRegEx/:element\(([a-z]*)\)/gi
bemIndicationElementRegEx/:block\(([a-z]*)\)/gi
bemIndicationSeparatorstring:

Change setting with BemSetting Component

import React from 'react';
import {Block, Element, BemSetting} from 'react-simple-bem';

const setting = {
    modifierDelimiter: '-mod-',
    elementDelimiter: '_ele_'
}

const SomeComponent = () => (
    <BemSetting bemSetting={setting}>
        <Block bemName="header" bemMod="dark">
            <Element bemName="logo" bemMod="big" />
        </Block>
    </BemSetting>
);

output :

<div class="header header-mod-dark">
    <div class="header_ele_logo header_ele_logo-mod-big"></div>
</div>

Using ref

If you want to get HTMLElement use forwardedRef properties.

import React from 'react';
import {Block, Element} from 'react-simple-bem';

const SomeComponent = () => (
    <Block 
        bemName="header" 
        forwardedRef={ref => console.log('header ref is', ref)} 
    >
        <Element 
            bemName="logo" 
            forwardedRef={ref => console.log('logo ref is', ref)} 
        />
    </Block>
);

Mixed block name and modifiers

import React from 'react';
import {Block, Element} from 'react-simple-bem';

const SomeComponent = () => (
    <Block bemName="header body">
        <Element bemName="logo" bemBlock="some other"/>
        <Element bemName="nav" bemMod="dark"/>
        <Element bemName="nav" bemMod="dark:block(header)"/>
        <Element
            bemName="logo:block(header) link:block(body)"
            bemBlock="hover:element(link) other:element(logo)"
        />
    </Block>
);

output :

<div class="header">
    <div class="some__logo other__logo"></div>
    <div class="header__nav body__nav header__nav--dark body__nav--dark"></div>
    <div class="some__logo other__logo header__nav--dark"></div>
    <div class="header__logo body__link body__link--hover header__logo--other"></div>
</div>

Custom component

You can create your own component of a <Block> or <Element>. To do this you must use the function bemElementDecorator() or bemBlockDecorator().

import React from 'react';
import {Element, bemBlockDecorator} from 'react-simple-bem';

const CustomBlockComponent = (props) => (
    <h1 className={props.className}>
        <Element bemName="icon" />{props.title}
    </h1>
);

export const CustomBlock = bemBlockDecorator(CustomBlockComponent);

using :

import React from 'react';
import { CustomBlock } from './CustomBlock';

const SomeComponent = () => (
    <CustomBlock bemName="header" bemMod="dark" title="some title"/>
);

output :

<h1 class="header header--dark">
    <div class="header__icon"></div>some title
</h1>
1.6.7

3 years ago

1.6.6

3 years ago

1.6.5

3 years ago

1.6.4

6 years ago

1.6.3

6 years ago

1.6.2

6 years ago

1.6.1

6 years ago

1.6.0

6 years ago

1.5.2

6 years ago

1.5.1

6 years ago

1.5.0

6 years ago

1.4.0

6 years ago

1.3.1

7 years ago

1.3.0

7 years ago

1.2.0

7 years ago

1.1.0

7 years ago

1.0.0

7 years ago

0.9.9

7 years ago

0.9.8

7 years ago

0.9.7

7 years ago

0.9.6

7 years ago

0.9.5-alpha

7 years ago

0.9.4-alpha

7 years ago

0.9.3-alpha

7 years ago

0.9.2-alpha

7 years ago

0.9.1-alpha

7 years ago

0.9.0-alpha

7 years ago