React-
It's long to navigate to the location of my component in my app after making a change
What if my visual change break other components?
I wasn't aware that this component was even existing
How can I enable people to quickly contribute to my component?
I'd like to have a visual documentation of my component
react-storybook
A Development and Testing environment that displays your components
Installation (React.js)
npm i -g @storybook/cli
cd my-react-app
getstorybook
Installation (React.js)
- Add @storybook dependency to your package.json
- Create .storybook with config files (~4 lines)
- Create a stories folder with index.js (the entry point) and an example story.
This will:
Installation (React Native)
npm i -g @storybook/cli
cd my-react-native-app
getstorybook
Installation (React Native)
- Add @storybook  dependency to your package.json
- Create storybook with config files (~4 lines)
- Create storybook/stories folder with index.js (the entry point) and an example story.
This will:
I got warnings and had to manually add react-dom to package.json
🤔
Write stories
import React from 'react';
import { storiesOf } from '@storybook/react';
storiesOf('SearchBar', module)
.add('default', () => (
<SearchBar
value="Blabla"
hint="Enter your search keyword"
/>
));
storiesOf('SearchBar', module)
.add('default', () => ...)
.add('display an error', () => (
<SearchBar error="No internet connection"/>
));
Log actions
//...
import { action } from '@storybook/addon-actions';
storiesOf('SearchBar', module)
.add('default', () => (
<SearchBar
value="Blabla"
onSearch={action('search launched')}
/>
));
Decorators
// Decorator to allow material-ui components
// to read the app theme
const muiDecorator = (story) => (
<MuiThemeProvider muiTheme={defaultTheme}>
{story()}
</MuiThemeProvider>
)
// Add you decorator to any story using material-ui
storiesOf('AboutDialog', module)
.addDecorator(muiDecorator)
.add('default', () => <AboutDialog open />);
Or just components
// You can create a helper component and reuse it:
const Serializer = props => (
<div>{props.children} {JSON.stringify(props.object)}</div>
);
storiesOf('ProfilePage', module).add('default', () => (
<Serializer object={profile}>
<ProfilePage profile={profile} />
</Serializer>
));
storiesOf('CartItemsList', module).add('default', () => (
<Serializer object={items}>
<CartItemsList items={items} />
</Serializer>
));
Fixtures/mocking data
// Create fixtures, or better, share them with your unit tests :)
import complexFakeData from './fixtures/my-complex-data.json';
storiesOf('Dashboard', module)
.add('default', () => <Dashboard data={complexFakeData} />);
When
to use it?
Visual test cases
Living styleguide to improve consistency
Allow your product owner to validate design
Advantages over a home-made solution
- 10min installation from zero to a component exposed
- Ecosystem of addons
knob
Edit props dynamically
storyshots
Snapshot testing of your stories for free
time
DEMO
Shortcomings?
Introduction to react-storybook
By Florian Rival
Introduction to react-storybook
Internal training at BAM and Renault Digital about react-storybook. Based on examples like https://github.com/4ian/GD
- 2,853