Slide 1

Slide 1 text

React Components Playing simple and easy Henrique Alves
 Front-end at @FathomLondon #TechTuesday @healves82

Slide 2

Slide 2 text

Play simple football is hard @healves82 #TechTuesday

Slide 3

Slide 3 text

React embraces modularity. @healves82 #TechTuesday

Slide 4

Slide 4 text

Pillars of FP 
 – Pure functions
 – Immutability
 – Composition @healves82 #TechTuesday

Slide 5

Slide 5 text

Low level components 
 They represent the HTML element in your document. @healves82 #TechTuesday // layout/image.js // e.g. const Image = ({...props }) => ( );

Slide 6

Slide 6 text

Low level components @healves82 #TechTuesday /* const CoverImage = ({title, src}) => ( `Front ); */ const CoverImage = ({title, src}) => ( `Book );

Slide 7

Slide 7 text

Low level components @healves82 #TechTuesday // layout/image.js const Image = ({...props }) => ( ); // components/cover-image.js const CoverImage = ({title, src}) => ( `Book );

Slide 8

Slide 8 text

Low level components @healves82 #TechTuesday // image.js const Image = ({...props }) => { const style = { borderStyle: 'none' }; const styles = Object.assign({}, style, props.style ); return };

Slide 9

Slide 9 text

You know what the component does by looking at its propTypes. @healves82 #TechTuesday

Slide 10

Slide 10 text

PropTypes @healves82 #TechTuesday BookItem.propTypes = { coverImage: React.PropTypes.element.isRequired, title: React.PropTypes.string.isRequired, author: React.PropTypes.string.isRequired, description: React.PropTypes.string, price: React.PropTypes.number.isRequired };

Slide 11

Slide 11 text

Type checking with Flow @healves82 #TechTuesday type Props = { coverImage: CoverImage, title: string, author: string, price: number }; const BookItem = ({coverImage, title, author, price, ...props}: Props) => ( ... );

Slide 12

Slide 12 text

Any styling logic is added into the component not in the CSS. @healves82 #TechTuesday

Slide 13

Slide 13 text

Styling @healves82 #TechTuesday /* button.css */ .root { composes: bolder from 'typography'; }

Slide 14

Slide 14 text

I don’t compose CSS. @healves82 #TechTuesday

Slide 15

Slide 15 text

Styling @healves82 #TechTuesday const Button = () => (
Button
);

Slide 16

Slide 16 text

Atomic CSS Modules Michele Bertoli suggested an interesting approach combining Atomic CSS with CSS Modules. @healves82 #TechTuesday .tabs { composes: width-100 from 'size'; composes: reset from 'list'; composes: flex from 'display'; /* tablet and up */ composes: block from 'display/tablet'; }

Slide 17

Slide 17 text

Helpers for inline styles @healves82 #TechTuesday // gradient.js // You can find some useful helpers at 
 // https://github.com/kitze/stylz export const linear = (fromColor, toColor) => ({ background: `linear-gradient(to bottom, ${fromColor}, ${toColor})` }); // button.js import {linear} from '../helpers/gradient.js'; const styles = { padding: 8, linear('#eee','#ddd') };

Slide 18

Slide 18 text

Don’t be religious. Don’t knock it without try. Pick the one that works better for your team. @healves82 #TechTuesday

Slide 19

Slide 19 text

Thanks @healves82