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
Set initial value of
render Get Initial State this.state
Set initial value of
Get Default Props this.props
Calling setState here does
Component Will Mount not cause a re-render
Return JSX for component
Render Never update state here
Called immediately after
Component Did Mount render
Component Life Cycle
- Takes nextprops as input
PROPS - Previous props available
as this.props
Change Component will receive props - Calling setState() here does
not trigger re-render
Can abort render if you
return false here. If false,
Should component update componentWillUpdate and
componentDidUpdate will not
be called.
nextProps, nextState available
NOT called for
Component will update here
Cannot use setState() here
initial render
Render
Called immediately after
Component did update render
Component Life Cycle
STATE
Can abort render if you
Change return false here. If false,
Should component update componentWillUpdate and
componentDidUpdate will not
be called.
nextProps, nextState available
Component will update here
Cannot use setState() here
NOT called for
initial render
Render
Called immediately after
Component did update render
Component Life Cycle
The statics object allows you to define static methods
Statics 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 Invoked immediately before
component is unmounted.
Component will unmount For cleanup, invalidating
timers etc.
Virtual DOM
Render Build a new
the DOM Virtual DOM
Batch execute Diff with
EACH UPDATE
all updates old DOM
Compute the minimal
sets of mutation and queue
State Props
For data passed
For interactivity
to the component
in the component.
Should be treated as
Mutable data
immutable.
State
Is updated by calling setState()
Every call to setState() triggers a re-render
(except when called within
componentDidMount)
React jQuery
Only the changes Everything is
are rendered 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