React v0.9 RC

February 16, 2014 by Ben Alpert


We're almost ready to release React v0.9! We're posting a release candidate so that you can test your apps on it; we'd much prefer to find show-stopping bugs now rather than after we release.

The release candidate is available for download from the CDN:

We've also published version 0.9.0-rc1 of the react and react-tools packages on npm and the react package on bower.

Please try these builds out and file an issue on GitHub if you see anything awry.

Upgrade Notes #

In addition to the changes to React core listed below, we've made a small change to the way JSX interprets whitespace to make things more consistent. With this release, space between two components on the same line will be preserved, while a newline separating a text node from a tag will be eliminated in the output. Consider the code:

<div>
  Monkeys:
  {listOfMonkeys} {submitButton}
</div>

In v0.8 and below, it was transformed to the following:

React.DOM.div(null,
  " Monkeys: ",
  listOfMonkeys, submitButton
)

In v0.9, it will be transformed to this JS instead:

React.DOM.div(null,
  "Monkeys:",
  listOfMonkeys, " ", submitButton
)

We believe this new behavior is more helpful and elimates cases where unwanted whitespace was previously added.

In cases where you want to preserve the space adjacent to a newline, you can write a JS string like {"Monkeys: "} in your JSX source. We've included a script to do an automated codemod of your JSX source tree that preserves the old whitespace behavior by adding and removing spaces appropriately. You can install jsx_whitespace_transformer from npm and run it over your source tree to modify files in place. The transformed JSX files will preserve your code's existing whitespace behavior.

Changelog #

React Core #

Breaking Changes #

  • The lifecycle methods componentDidMount and componentDidUpdate no longer receive the root node as a parameter; use this.getDOMNode() instead
  • Whenever a prop is equal to undefined, the default value returned by getDefaultProps will now be used instead
  • React.unmountAndReleaseReactRootNode was previously deprecated and has now been removed
  • React.renderComponentToString is now synchronous and returns the generated HTML string
  • Full-page rendering (that is, rendering the <html> tag using React) is now supported only when starting with server-rendered markup
  • On mouse wheel events, deltaY is no longer negated
  • When prop types validation fails, a warning is logged instead of an error thrown (with the production build of React, the type checks are now skipped for performance)
  • On input, select, and textarea elements, .getValue() is no longer supported; use .getDOMNode().value instead
  • this.context on components is now reserved for internal use by React

New Features #

  • React now never rethrows errors, so stack traces are more accurate and Chrome's purple break-on-error stop sign now works properly
  • Added a new tool for profiling React components and identifying places where defining shouldComponentUpdate can give performance improvements
  • Added support for SVG tags defs, linearGradient, polygon, radialGradient, stop
  • Added support for more attributes:
    • noValidate and formNoValidate for forms
    • property for Open Graph <meta> tags
    • sandbox, seamless, and srcDoc for <iframe> tags
    • scope for screen readers
    • span for <colgroup> tags
  • Added support for defining propTypes in mixins
  • Added any, arrayOf, component, oneOfType, renderable, shape to React.PropTypes
  • Added support for statics on component spec for static component methods
  • On all events, .currentTarget is now properly set
  • On keyboard events, .key is now polyfilled in all browsers for special (non-printable) keys
  • On clipboard events, .clipboardData is now polyfilled in IE
  • On drag events, .dataTransfer is now present
  • Added support for onMouseOver and onMouseOut in addition to the existing onMouseEnter and onMouseLeave events
  • Added support for onLoad and onError on <img> elements
  • Added support for onReset on <form> elements
  • The autoFocus attribute is now polyfilled consistently on input, select, and textarea

Bug Fixes #

  • React no longer adds an __owner__ property to each component's props object; passed-in props are now never mutated
  • When nesting top-level components (e.g., calling React.renderComponent within componentDidMount), events now properly bubble to the parent component
  • Fixed a case where nesting top-level components would throw an error when updating
  • Passing an invalid or misspelled propTypes type now throws an error
  • On mouse enter/leave events, .target, .relatedTarget, and .type are now set properly
  • On composition events, .data is now properly normalized in IE9 and IE10
  • CSS property values no longer have px appended for the unitless properties columnCount, flex, flexGrow, flexShrink, lineClamp, order, widows
  • Fixed a memory leak when unmounting children with a componentWillUnmount handler
  • Fixed a memory leak when renderComponentToString would store event handlers
  • Fixed an error that could be thrown when removing form elements during a click handler
  • key values containing . are now supported
  • Shortened data-reactid values for performance
  • Components now always remount when the key property changes
  • Event handlers are attached to document only when necessary, improving performance in some cases
  • Events no longer use .returnValue in modern browsers, eliminating a warning in Chrome
  • scrollLeft and scrollTop are no longer accessed on document.body, eliminating a warning in Chrome
  • General performance fixes, memory optimizations, improvements to warnings and error messages

React with Addons #

  • React.addons.TransitionGroup was renamed to React.addons.CSSTransitionGroup
  • React.addons.TransitionGroup was added as a more general animation wrapper
  • React.addons.cloneWithProps was added for cloning components and modifying their props
  • Bug fix for adding back nodes during an exit transition for CSSTransitionGroup
  • Bug fix for changing transitionLeave in CSSTransitionGroup
  • Performance optimizations for CSSTransitionGroup
  • On checkbox <input> elements, checkedLink is now supported for two-way binding

JSX Compiler and react-tools Package #

  • Whitespace normalization has changed; now space between two tags on the same line will be preserved, while newlines between two tags will be removed
  • The react-tools npm package no longer includes the React core libraries; use the react package instead.
  • displayName is now added in more cases, improving error messages and names in the React Dev Tools
  • Fixed an issue where an invalid token error was thrown after a JSX closing tag
  • JSXTransformer now uses source maps automatically in modern browsers
  • JSXTransformer error messages now include the filename and problematic line contents when a file fails to parse

Community Round-up #16

February 15, 2014 by Jonas Gebhardt


There have been many posts recently covering the why and how of React. This week's community round-up includes a collection of recent articles to help you get started with React, along with a few posts that explain some of the inner workings.

React in a nutshell #

Got five minutes to pitch React to your coworkers? John Lynch (@johnrlynch) put together this excellent and refreshing slideshow:

React's diff algorithm #

React core team member Christopher Chedeau (@vjeux) explores the innards of React's tree diffing algorithm in this extensive and well-illustrated post.

While we're talking about tree diffing: Matt Esch (@MatthewEsch) created this project, which aims to implement the virtual DOM and a corresponding diff algorithm as separate modules.

Many, many new introductions to React! #

James Padosley wrote a short post on the basics (and merits) of React: What is React?

What I like most about React is that it doesn't impose heady design patterns and data-modelling abstractions on me. [...] Its opinions are so minimal and its abstractions so focused on the problem of the DOM, that you can merrily slap your design choices atop.

Read the full post...

Taylor Lapeyre (@taylorlapeyre) wrote another nice introduction to React.

React expects you to do the work of getting and pushing data from the server. This makes it very easy to implement React as a front end solution, since it simply expects you to hand it data. React does all the other work.

Read the full post...

This "Deep explanation for newbies" by @ProJavaScript explains how to get started building a React game without using the optional JSX syntax.

React around the world #

It's great to see the React community expand internationally. This site features a React introduction in Russian.

React tutorial series #

Christopher Pitt explains React Components and React Properties. The former includes a nice introduction to using JSX, while the latter focuses on adding interactivity and linking multiple components together. Also check out the other posts in his React Tutorial series, e.g. on using React + Backbone Model and React + Backbone Router.

Beginner tutorial: Implementing the board game Go #

Chris LaRose walks through the steps of creating a Go app in React, showing how to separate application logic from the rendered components. Check out his tutorial or go straight to the code.

Egghead.io video tutorials #

Joe Maddalone (@joemaddalone) of egghead.io created a series of React video tutorials, such as this introduction to React Components. [part 1], [part 2]

"React: Finally, a great server/client web stack" #

Eric Florenzano (@ericflo) sheds some light on what makes React perfect for server rendering:

[...] the ideal solution would fully render the markup on the server, deliver it to the client so that it can be shown to the user instantly. Then it would asynchronously load some Javascript that would attach to the rendered markup, and invisibly promote the page into a full app that can render its own markup. [...]

What I've discovered is that enough of the pieces have come together, that this futuristic-sounding web environment is actually surprisingly easy to do now with React.js.

Read the full post...

Building a complex React component #

Matt Harrison walks through the process of creating an SVG-based Resistance Calculator using React.

Random Tweets #

Community Round-up #15

February 5, 2014 by Jonas Gebhardt


Interest in React seems to have surged ever since David Nolen (@swannodette)'s introduction of Om in his post "The Future of Javascript MVC Frameworks".

In this React Community Round-up, we are taking a closer look at React from a functional programming perspective.

"React: Another Level of Indirection" #

To start things off, Eric Normand (@ericnormand) of LispCast makes the case for React from a general functional programming standpoint and explains how React's "Virtual DOM provides the last piece of the Web Frontend Puzzle for ClojureScript".

The Virtual DOM is an indirection mechanism that solves the difficult problem of DOM programming: how to deal with incremental changes to a stateful tree structure. By abstracting away the statefulness, the Virtual DOM turns the real DOM into an immediate mode GUI, which is perfect for functional programming.

Read the full post...

Reagent: Minimalistic React for ClojureScript #

Dan Holmsand (@holmsand) created Reagent, a simplistic ClojureScript API to React.

It allows you to define efficient React components using nothing but plain ClojureScript functions and data, that describe your UI using a Hiccup-like syntax.

The goal of Reagent is to make it possible to define arbitrarily complex UIs using just a couple of basic concepts, and to be fast enough by default that you rarely have to care about performance.

Check it out on Github...

Functional DOM programming #

React's one-way data-binding naturally lends itself to a functional programming approach. Facebook's Pete Hunt (@floydophone) explores how one would go about writing web apps in a functional manner. Spoiler alert:

This is React. It’s not about templates, or data binding, or DOM manipulation. It’s about using functional programming with a virtual DOM representation to build ambitious, high-performance apps with JavaScript.

Read the full post...

Pete also explains this in detail at his #MeteorDevShop talk (about 30 Minutes):

Kioo: Separating markup and logic #

Creighton Kirkendall created Kioo, which adds Enlive-style templating to React. HTML templates are separated from the application logic. Kioo comes with separate examples for both Om and Reagent.

A basic example from github:

<!DOCTYPE html>
<html lang="en">
  <body>
    <header>
      <h1>Header placeholder</h1>
      <ul id="navigation">
        <li class="nav-item"><a href="#">Placeholder</a></li>
      </ul>
    </header>
    <div class="content">place holder</div>
  </body>
</html>
...

(defn my-nav-item [[caption func]]
  (kioo/component "main.html" [:.nav-item]
    {[:a] (do-> (content caption)
                (set-attr :onClick func))}))

(defn my-header [heading nav-elms]
  (kioo/component "main.html" [:header]
    {[:h1] (content heading)
     [:ul] (content (map my-nav-item nav-elms))}))

(defn my-page [data]
  (kioo/component "main.html"
    {[:header] (substitute (my-header (:heading data)
                                      (:navigation data)))
     [:.content] (content (:content data))}))

(def app-state (atom {:heading    "main"
                      :content    "Hello World"
                      :navigation [["home" #(js/alert %)]
                                   ["next" #(js/alert %)]]}))

(om/root app-state my-page (.-body js/document))

Om #

In an interview with David Nolen, Tom Coupland (@tcoupland) of InfoQ provides a nice summary of recent developments around Om ("Om: Enhancing Facebook's React with Immutability").

David [Nolen]: I think people are starting to see the limitations of just JavaScript and jQuery and even more structured solutions like Backbone, Angular, Ember, etc. React is a fresh approach to the DOM problem that seems obvious in hindsight.

Read the full interview...

A slice of React, ClojureScript and Om #

Fredrik Dyrkell (@lexicallyscoped) rewrote part of the React tutorial in both ClojureScript and Om, along with short, helpful explanations.

React has sparked a lot of interest in the Clojure community lately [...]. At the very core, React lets you build up your DOM representation in a functional fashion by composing pure functions and you have a simple building block for everything: React components.

Read the full post...

In a separate post, Dyrkell breaks down how to build a binary clock component in Om.

[Demo] [Code]

Time Travel: Implementing undo in Om #

David Nolen shows how to leverage immutable data structures to add global undo functionality to an app – using just 13 lines of ClojureScript.

A Step-by-Step Om Walkthrough #

Josh Lehman took the time to create an extensive step-by-step walkthrough of the React tutorial in Om. The well-documented source is on github.

Omkara #

brendanyounger created omkara, a starting point for ClojureScript web apps based on Om/React. It aims to take advantage of server-side rendering and comes with a few tips on getting started with Om/React projects.

Om Experience Report #

Adam Solove (@asolove) dives a little deeper into Om, React and ClojureScript. He shares some helpful tips he gathered while building his CartoCrayon prototype.

Not-so-random Tweet #

Community Round-up #14

January 6, 2014 by Vjeux


The theme of this first round-up of 2014 is integration. I've tried to assemble a list of articles and projects that use React in various environments.

React Baseline #

React is only one-piece of your web application stack. Mark Lussier shared his baseline stack that uses React along with Grunt, Browserify, Bower, Zepto, Director and Sass. This should help you get started using React for a new project.

As I do more projects with ReactJS I started to extract a baseline to use when starting new projects. This is very opinionated and I change my opinion from time to time. This is by no ways perfect and in your opinion most likely wrong :).. which is why I love github

I encourage you to fork, and make it right and submit a pull request!

My current opinion is using tools like Grunt, Browserify, Bower and mutiple grunt plugins to get the job done. I also opted for Zepto over jQuery and the Flatiron Project's Director when I need a router. Oh and for the last little bit of tech that makes you mad, I am in the SASS camp when it comes to stylesheets

Check it out on GitHub...

Animal Sounds #

Josh Duck used React in order to build a Windows 8 tablet app. This is a good example of a touch app written in React.

Download the app...

React Rails Tutorial #

Selem Delul bundled the React Tutorial into a rails app. This is a good example on how to get started with a rails project.

git clone https://github.com/necrodome/react-rails-tutorial
cd react-rails-tutorial
bundle install
rake db:migrate
rails s

Then visit http://localhost:3000/app to see the React application that is explained in the React Tutorial. Try opening multiple tabs!

View on GitHub...

Mixing with Backbone #

Eldar Djafarov implemented a mixin to link Backbone models to React state and a small abstraction to write two-way binding on-top.

View code on JSFiddle

Check out the blog post...

React Infinite Scroll #

Guillaume Rivals implemented an InfiniteScroll component. This is a good example of a React component that has a simple yet powerful API.

<InfiniteScroll
  pageStart={0}
  loadMore={loadFunc}
  hasMore={true || false}
  loader={<div className="loader">Loading ...</div>}>
  {items} // <-- This is the "stuff" you want to load
</InfiniteScroll>

Try it out on GitHub!

Web Components Style #

Thomas Aylott implemented an API that looks like Web Components but using React underneath.

View the source on JSFiddle...

React vs Angular #

React is often compared with Angular. Pete Hunt wrote an opinionated post on the subject.

First of all I think it’s important to evaluate technologies on objective rather than subjective features. “It feels nicer” or “it’s cleaner” aren’t valid reasons: performance, modularity, community size and ease of testing / integration with other tools are.

I’ve done a lot of work benchmarking, building apps, and reading the code of Angular to try to come up with a reasonable comparison between their ways of doing things.

Read the full post...

Random Tweet #

React Chrome Developer Tools

January 2, 2014 by Sebastian Markbåge


With the new year, we thought you'd enjoy some new tools for debugging React code. Today we're releasing the React Developer Tools, an extension to the Chrome Developer Tools. Download them from the Chrome Web Store.

You will get a new tab titled "React" in your Chrome DevTools. This tab shows you a list of the root React Components that are rendered on the page as well as the subcomponents that each root renders.

Selecting a Component in this tab allows you to view and edit its props and state in the panel on the right. In the breadcrumbs at the bottom, you can inspect the selected Component, the Component that created it, the Component that created that one, and so on.

When you inspect a DOM element using the regular Elements tab, you can switch over to the React tab and the corresponding Component will be automatically selected. The Component will also be automatically selected if you have a breakpoint within its render phase. This allows you to step through the render tree and see how one Component affects another one.

We hope these tools will help your team better understand your component hierarchy and track down bugs. We're very excited about this initial launch and appreciate any feedback you may have. As always, we also accept pull requests on GitHub.