import React from 'react'; function Button({ size, skin, children }) { return ( <button className={`button${size ? ` button_size_${size}` : ''}${skin ? ` button_skin_${skin}` : '' }`}> {children} </button> ); }
import React from 'react'; import classNames from 'classnames'; const SIZE_CLASSES = { small: 'button_size_small', medium: 'button_size_medium', large: 'button_size_large', }; const SKIN_CLASSES = { accent: 'button_skin_accent', primary: 'button_skin_primary', }; function Button({ size, skin, children }) { return ( <button className={classNames( 'button', SIZE_CLASSES[size], SKIN_CLASSES[skin], )} > {children} </button> ); }
import React from 'react'; const RESULT_IMAGES = { 1: '/img/medal_gold.svg', 2: '/img/medal_silver.svg', 3: '/img/medal_bronze.svg', }; function Result({ position }) { return ( <div> <img src={RESULT_IMAGES[position]} /> <h2>! {position} !</h2> </div> ); }
<button />
tag or an <a />
tag.React.cloneElement
. For example: import React from 'react'; function Button({ container, href, type, children }) { let resultContainer = null; if (React.isValidElement(container)) { resultContainer = container; } else if (href) { resultContainer = <a href={href} /> } else { resultContainer = <button type={type} /> } return React.cloneElement( resultContainer, { className: 'button' }, children, ); } Button.defaultProps = { container: null, href: null, type: null, };
import React from 'react'; function Button({ container, href, type, children }) { let Tag = null; if (React.isValidElement(container)) { Tag = container; } else if (href) { Tag = 'a'; } else { Tag = 'button'; } return ( <Tag href={href} type={type} className="button"> {children} </Tag> ); } Button.defaultProps = { container: null, href: null, type: null, };
direction
parameter. import React from 'react'; function Player({ avatar, name, direction }) { let pref = null; let posf = null; if (direction === 'ltr') { pref = <img class="player__avatar" src={avatar} alt="Player avatar" />; posf = <span class="player__name">{name}</span>; } else { pref = <span class="player__name">{name}</span>; posf = <img class="player__avatar" src={avatar} alt="Player avatar" />; } return ( <div className="player"> {pref} {posf} </div> ); } Player.defaultProps = { direction: 'ltr', };
import React from 'react'; function Player({ avatar, name, direction }) { const arrayOfPlayerItem = [ <img key="avatar" class="player__avatar" src={avatar} alt="Player avatar" />, <span key="name" class="player__name">{name}</span>, ]; if (direction === 'rtl') { arrayOfPlayerItem.reverse(); } return ( <div className="player"> {arrayOfPlayerItem} </div> ); } Player.defaultProps = { direction: 'ltr', };
import React from 'react'; import classNames from 'classnames'; const DIRECTION_CLASSES = { ltr: 'player_direction_ltr', rtl: 'player_direction_rtl', }; function Player({ avatar, name, direction }) { return ( <div className={classNames( 'player', DIRECTION_CLASSES[direction], )} > <img class="player__avatar" src={avatar} alt="Player avatar" /> <span class="player__name">{name}</span> </div> ); } Player.defaultProps = { direction: 'ltr', };
// 1. flexbox .player { display: flex; } .player_direction_rtl .player__avatar { order: 1; } .player_direction_rtl .player__name { order: 0; } // 2. direction .player, .player__avatar, .player__name { display: inline-block; } .player_direction_rtl { direction: rtl; } // 3. float .player { display: inline-block; } .player_direction_rtl .player__avatar, .player_direction_rtl .player__name { float: right; }
import React, { Component } from 'react'; class Banner extends Component { componentDidMount() { if (this.DOM.root) { this.DOM.root.addEventListener('transitionend', ...); } } handleRefOfRoot = (node) => { this.DOM.root = node; }; DOM = { root: null, }; render() { return ( <div className="banner" ref={this.handleRefOfRoot}> {this.props.children} </div> ); } }
ref
, I bring it to a method. Due to this, when rendering, a new function is not created, and the creation of an arrow function eliminates the need to bind the context through the bind
method. Important: you should do this only if you are sure that your component will be called several times in a short period of time, otherwise it is better to use the ref={(node) => { this.DOM.<node_name> = node; }}
ref={(node) => { this.DOM.<node_name> = node; }}
so that the page memory is not loaded again.refs
field of a stateful component. Conveniently, when everything is stored in one place.null
.Source: https://habr.com/ru/post/354056/
All Articles