Reactive
programming
in JavaScript with Reactjs
JFokus 3. february 2015
Forget about
Established truths
Everything you thought you knew
about making web apps
Relax
Its going to be okay
Hello, Im Sven
I am a frontend developer from
Inmeta Consulting in Norway
The Problem
How can we build large apps with data
that changes over time?
But: local state that changes over time
is the root of all evil
ModelViewController
The MVC pattern was developed in
1979
It was deviced as a general solution
to the problem of users controlling a
large and complex data set.
Its not 1979 anymore
The MVC problem
Thin views / templates
Models and controllers that grows
and grows
until most of your time is spent
keeping them in sync
We need a better model
React
A JavaScript library for building
composable user interfaces
React gives you
A lightweight virtual DOM
Powerful views without templates
Unidirectional data flow
Explicit mutation
A React app consists of
Reusable components
Components makes code reuse, testing,
and separation of concerns easy.
Not just the V
In the beginning, React was presented
as the V in MVC.
This is at best a huge simplification.
React has state, it handles mapping
from input to state changes, and it
renders components. In this sense, it
does everything that an MVC does.
<NewsFeed>
<NewsItem>
<ItemCover>
<ItemTitle>
<ItemComments>
NewsItem.jsx
NewsItem.jsx
NewsItem.jsx
NewsItem.jsx
JSX
A JavaScript XML based extension
that makes it easy to mix HTML with
JavaScript
Component Life Cycle
Initial
render
Get Initial State
Set initial value of
this.state
Get Default Props
Set initial value of
this.props
Component Will Mount
Render
Component Did Mount
Calling setState here does
not cause a re-render
Return JSX for component
Never update state here
Called immediately after
render
Component Life Cycle
PROPS
Change
NOT called for
initial render
Component will receive props
- Takes nextprops as input
- Previous props available
as this.props
- Calling setState() here does
not trigger re-render
Should component update
Can abort render if you
return false here. If false,
componentWillUpdate and
componentDidUpdate will not
be called.
Component will update
nextProps, nextState available
here
Cannot use setState() here
Render
Component did update
Called immediately after
render
Component Life Cycle
STATE
Change
NOT called for
initial render
Should component update
Can abort render if you
return false here. If false,
componentWillUpdate and
componentDidUpdate will not
be called.
Component will update
nextProps, nextState available
here
Cannot use setState() here
Render
Component did update
Called immediately after
render
Component Life Cycle
Statics
The statics object allows you to define static methods
that can be invoked on the component without creating instances
These methods do not have access to the components props or state
Component Life Cycle
Unmount
Component will unmount
Invoked immediately before
component is unmounted.
For cleanup, invalidating
timers etc.
Virtual DOM
Render
the DOM
Batch execute
all updates
Build a new
Virtual DOM
EACH UPDATE
Compute the minimal
sets of mutation and queue
Diff with
old DOM
State
Props
For interactivity
in the component.
Mutable data
For data passed
to the component
Should be treated as
immutable.
State
Is updated by calling setState()
Every call to setState() triggers a re-render
(except when called within
componentDidMount)
React
Only the changes
are rendered
jQuery
Everything is
re-rendered
Server Rendering
Traditional JavaScript applications
are hard to render on the server. This
makes the app uncrawlable, and you
miss out on SEO.
Server Rendering
Fortunately, React can handle this
with ease.
All you need to do is call
renderToString instead of render
and youve got a SEO ready
component.
Server Rendering
Another option is to call
renderToStaticMarkup.
This is similar to renderToString,
except this doesn't create extra DOM
attributes such as data-react-id which
is useful if you want to use React as a
simple static page generator.
Testing
JEST
Built on top of the Jasmine test
framework, using familiar
expect(value).toBe(other) assertions
JEST
Automatically finds tests to execute in
your repo
JEST
Automatically mocks dependencies
for you when running your tests
JEST
Allows you to test asynchronous code
synchronously
JEST
Runs your tests with a fake DOM
implementation (via jsdom) so that
your tests can run on the command
line
JEST
In short, if you want to test React
code, use JEST.
Practical example
Unclicked State
Clicked State
Routing
React does not have a native router
There are however a few to choose
between
React-router
React-router-component
Monorouter
React-router example
Inline Styles
So inline styles, eh?
Theres actually a good reason for
doing this.
So inline styles, eh?
CSS pollutes the global namespace
At scale, this is bad because it leads to
paralysis and confusion.
Can I add this element, or change this
class? If youre not sure, youre in
trouble.
So inline styles, eh?
Inline styles avoid this, because the
CSS is scoped to the component youre
working with.
How it looks
Not your 80s inline
It's not really "inline". We merely pass a reference
to a rule thats somewhere else in the file, just like
CSS.
Style is actually a much better name than class.
You want to style the element, not class it.
Finally, this is not applying the style directly, this
is using React virtual DOM and is being diff-ed the
same way elements are.
Still.
The goal is not to replace CSS as its done today.
Its simply focusing on the fundamental problem
with CSS and trying to solve it.
You do not have to use it. If you apply a className
tag to your elements, you can use CSS as youve
always done.
Mixins
Basically, pure React components that
can be incorporated in your other
components
Mixins
Components that use mixins inherits
state and props from the mixin
Mixins
Last words
Virtual DOM, a native event system
and other technicalities are nice
But Reacts true strength are actually
none of these
Last words
Reacts true strengths are:
Unidirectional Data Flow
Freedom from Domain Specific
Language (its all JavaScript)
Explicit Mutation
Questions?
Source Code available at
github.com/svenanders/react-tutorial
http://learnreact.robbestad.com