From 8ac8f35db47ab172da7a8a67b7165b9eb4339ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20O=E2=80=99Shannessy?= Date: Sat, 15 Feb 2014 15:59:02 -0800 Subject: [PATCH] Community Roundup 16 --- blog/2013/06/02/jsfiddle-integration.html | 4 +- blog/2013/06/05/why-react.html | 4 +- blog/2013/06/12/community-roundup.html | 4 +- blog/2013/06/19/community-roundup-2.html | 4 +- blog/2013/06/21/react-v0-3-3.html | 4 +- blog/2013/06/27/community-roundup-3.html | 4 +- .../07/02/react-v0-4-autobind-by-default.html | 4 +- blog/2013/07/03/community-roundup-4.html | 4 +- ...-4-prop-validation-and-default-values.html | 4 +- blog/2013/07/17/react-v0-4-0.html | 4 +- blog/2013/07/23/community-roundup-5.html | 4 +- blog/2013/07/26/react-v0-4-1.html | 4 +- .../use-react-and-jsx-in-ruby-on-rails.html | 4 +- blog/2013/08/05/community-roundup-6.html | 4 +- ...-react-and-jsx-in-python-applications.html | 4 +- blog/2013/08/26/community-roundup-7.html | 4 +- blog/2013/09/24/community-roundup-8.html | 4 +- blog/2013/10/03/community-roundup-9.html | 4 +- blog/2013/10/16/react-v0.5.0.html | 4 +- blog/2013/10/29/react-v0-5-1.html | 4 +- blog/2013/11/05/thinking-in-react.html | 4 +- blog/2013/11/06/community-roundup-10.html | 4 +- blog/2013/11/18/community-roundup-11.html | 4 +- blog/2013/12/18/react-v0.5.2-v0.4.2.html | 4 +- blog/2013/12/19/react-v0.8.0.html | 4 +- blog/2013/12/23/community-roundup-12.html | 4 +- blog/2013/12/30/community-roundup-13.html | 4 +- .../01/02/react-chrome-developer-tools.html | 4 +- blog/2014/01/06/community-roundup-14.html | 4 +- blog/2014/02/05/community-roundup-15.html | 4 +- blog/2014/02/15/community-roundup-16.html | 191 ++++++++++++++ blog/all.html | 2 + blog/index.html | 153 ++++++------ blog/page2/index.html | 233 +++++++----------- blog/page3/index.html | 233 +++++++++++------- blog/page4/index.html | 184 +++++++------- blog/page5/index.html | 185 +++++++------- blog/page6/index.html | 105 ++++++-- blog/page7/index.html | 146 +++++++++++ feed.xml | 212 +++++----------- img/blog/react-diff-tree.png | Bin 0 -> 40606 bytes img/blog/resistance-calculator.png | Bin 0 -> 59693 bytes 42 files changed, 1040 insertions(+), 724 deletions(-) create mode 100644 blog/2014/02/15/community-roundup-16.html create mode 100644 blog/page7/index.html create mode 100644 img/blog/react-diff-tree.png create mode 100644 img/blog/resistance-calculator.png diff --git a/blog/2013/06/02/jsfiddle-integration.html b/blog/2013/06/02/jsfiddle-integration.html index 6136e20474..1e5926eb6d 100644 --- a/blog/2013/06/02/jsfiddle-integration.html +++ b/blog/2013/06/02/jsfiddle-integration.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/06/05/why-react.html b/blog/2013/06/05/why-react.html index a45b875b3a..9ed4c51421 100644 --- a/blog/2013/06/05/why-react.html +++ b/blog/2013/06/05/why-react.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/06/12/community-roundup.html b/blog/2013/06/12/community-roundup.html index 12cf4a42ae..3a3d32dc0d 100644 --- a/blog/2013/06/12/community-roundup.html +++ b/blog/2013/06/12/community-roundup.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/06/19/community-roundup-2.html b/blog/2013/06/19/community-roundup-2.html index 1cc53239a7..01e9a7f396 100644 --- a/blog/2013/06/19/community-roundup-2.html +++ b/blog/2013/06/19/community-roundup-2.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/06/21/react-v0-3-3.html b/blog/2013/06/21/react-v0-3-3.html index 892689eabb..06ef553ba1 100644 --- a/blog/2013/06/21/react-v0-3-3.html +++ b/blog/2013/06/21/react-v0-3-3.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/06/27/community-roundup-3.html b/blog/2013/06/27/community-roundup-3.html index 35be9275c5..f074c5abbe 100644 --- a/blog/2013/06/27/community-roundup-3.html +++ b/blog/2013/06/27/community-roundup-3.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/02/react-v0-4-autobind-by-default.html b/blog/2013/07/02/react-v0-4-autobind-by-default.html index b6004b5894..8938da1af0 100644 --- a/blog/2013/07/02/react-v0-4-autobind-by-default.html +++ b/blog/2013/07/02/react-v0-4-autobind-by-default.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/03/community-roundup-4.html b/blog/2013/07/03/community-roundup-4.html index bd4fba3130..7ab0d6bcb0 100644 --- a/blog/2013/07/03/community-roundup-4.html +++ b/blog/2013/07/03/community-roundup-4.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/11/react-v0-4-prop-validation-and-default-values.html b/blog/2013/07/11/react-v0-4-prop-validation-and-default-values.html index c7e5e68d7d..d0eadf35ff 100644 --- a/blog/2013/07/11/react-v0-4-prop-validation-and-default-values.html +++ b/blog/2013/07/11/react-v0-4-prop-validation-and-default-values.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/17/react-v0-4-0.html b/blog/2013/07/17/react-v0-4-0.html index 9cebd48b2c..1ce784d640 100644 --- a/blog/2013/07/17/react-v0-4-0.html +++ b/blog/2013/07/17/react-v0-4-0.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/23/community-roundup-5.html b/blog/2013/07/23/community-roundup-5.html index e670402d3e..ba91c2107e 100644 --- a/blog/2013/07/23/community-roundup-5.html +++ b/blog/2013/07/23/community-roundup-5.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/26/react-v0-4-1.html b/blog/2013/07/26/react-v0-4-1.html index 7063baadf4..8a89b59b63 100644 --- a/blog/2013/07/26/react-v0-4-1.html +++ b/blog/2013/07/26/react-v0-4-1.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/07/30/use-react-and-jsx-in-ruby-on-rails.html b/blog/2013/07/30/use-react-and-jsx-in-ruby-on-rails.html index 545687d0ea..3fddb3791d 100644 --- a/blog/2013/07/30/use-react-and-jsx-in-ruby-on-rails.html +++ b/blog/2013/07/30/use-react-and-jsx-in-ruby-on-rails.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/08/05/community-roundup-6.html b/blog/2013/08/05/community-roundup-6.html index 8927a72ab8..eba77395f8 100644 --- a/blog/2013/08/05/community-roundup-6.html +++ b/blog/2013/08/05/community-roundup-6.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/08/19/use-react-and-jsx-in-python-applications.html b/blog/2013/08/19/use-react-and-jsx-in-python-applications.html index 45e8a06879..3e84c700c4 100644 --- a/blog/2013/08/19/use-react-and-jsx-in-python-applications.html +++ b/blog/2013/08/19/use-react-and-jsx-in-python-applications.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/08/26/community-roundup-7.html b/blog/2013/08/26/community-roundup-7.html index 75bd6dceea..b1f865d039 100644 --- a/blog/2013/08/26/community-roundup-7.html +++ b/blog/2013/08/26/community-roundup-7.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/09/24/community-roundup-8.html b/blog/2013/09/24/community-roundup-8.html index cc9efb6dee..06c6ce94df 100644 --- a/blog/2013/09/24/community-roundup-8.html +++ b/blog/2013/09/24/community-roundup-8.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/10/03/community-roundup-9.html b/blog/2013/10/03/community-roundup-9.html index 29488bcb7d..1c62c60e34 100644 --- a/blog/2013/10/03/community-roundup-9.html +++ b/blog/2013/10/03/community-roundup-9.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/10/16/react-v0.5.0.html b/blog/2013/10/16/react-v0.5.0.html index 29714f6255..6915581cd4 100644 --- a/blog/2013/10/16/react-v0.5.0.html +++ b/blog/2013/10/16/react-v0.5.0.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/10/29/react-v0-5-1.html b/blog/2013/10/29/react-v0-5-1.html index 4540c0171c..8c36c44ca9 100644 --- a/blog/2013/10/29/react-v0-5-1.html +++ b/blog/2013/10/29/react-v0-5-1.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/11/05/thinking-in-react.html b/blog/2013/11/05/thinking-in-react.html index 9239f605a2..0e25b8fe3a 100644 --- a/blog/2013/11/05/thinking-in-react.html +++ b/blog/2013/11/05/thinking-in-react.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/11/06/community-roundup-10.html b/blog/2013/11/06/community-roundup-10.html index e5361d6871..adaa026037 100644 --- a/blog/2013/11/06/community-roundup-10.html +++ b/blog/2013/11/06/community-roundup-10.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/11/18/community-roundup-11.html b/blog/2013/11/18/community-roundup-11.html index b48d129de3..567ebdcab6 100644 --- a/blog/2013/11/18/community-roundup-11.html +++ b/blog/2013/11/18/community-roundup-11.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/12/18/react-v0.5.2-v0.4.2.html b/blog/2013/12/18/react-v0.5.2-v0.4.2.html index 9a6f7faa85..8875b65cf2 100644 --- a/blog/2013/12/18/react-v0.5.2-v0.4.2.html +++ b/blog/2013/12/18/react-v0.5.2-v0.4.2.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/12/19/react-v0.8.0.html b/blog/2013/12/19/react-v0.8.0.html index ab11bf42d5..18bad12229 100644 --- a/blog/2013/12/19/react-v0.8.0.html +++ b/blog/2013/12/19/react-v0.8.0.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/12/23/community-roundup-12.html b/blog/2013/12/23/community-roundup-12.html index 2536b80e8c..aff5162bb1 100644 --- a/blog/2013/12/23/community-roundup-12.html +++ b/blog/2013/12/23/community-roundup-12.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2013/12/30/community-roundup-13.html b/blog/2013/12/30/community-roundup-13.html index 379cde1614..4d1a33d7a3 100644 --- a/blog/2013/12/30/community-roundup-13.html +++ b/blog/2013/12/30/community-roundup-13.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2014/01/02/react-chrome-developer-tools.html b/blog/2014/01/02/react-chrome-developer-tools.html index 85621da246..5468b4b8f1 100644 --- a/blog/2014/01/02/react-chrome-developer-tools.html +++ b/blog/2014/01/02/react-chrome-developer-tools.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2014/01/06/community-roundup-14.html b/blog/2014/01/06/community-roundup-14.html index 8b157b6957..304231bb14 100644 --- a/blog/2014/01/06/community-roundup-14.html +++ b/blog/2014/01/06/community-roundup-14.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2014/02/05/community-roundup-15.html b/blog/2014/02/05/community-roundup-15.html index 7bfde071b2..9594770e94 100644 --- a/blog/2014/02/05/community-roundup-15.html +++ b/blog/2014/02/05/community-roundup-15.html @@ -63,6 +63,8 @@

Recent posts

diff --git a/blog/2014/02/15/community-roundup-16.html b/blog/2014/02/15/community-roundup-16.html new file mode 100644 index 0000000000..60d71e8797 --- /dev/null +++ b/blog/2014/02/15/community-roundup-16.html @@ -0,0 +1,191 @@ + + + + + + + React | Community Round-up #16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+

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 PropertiesThe 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 #

+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ + +
+
A Facebook & Instagram collaboration.
+
© 2014 Facebook Inc.
+
+
+
+ + + + diff --git a/blog/all.html b/blog/all.html index 950fb83e8c..b3d91a1063 100644 --- a/blog/all.html +++ b/blog/all.html @@ -61,6 +61,8 @@

All Posts

+

Community Round-up #16 on February 15, 2014 by Jonas Gebhardt

+

Community Round-up #15 on February 5, 2014 by Jonas Gebhardt

Community Round-up #14 on January 6, 2014 by Vjeux

diff --git a/blog/index.html b/blog/index.html index 551970c563..850cdef1f5 100644 --- a/blog/index.html +++ b/blog/index.html @@ -63,6 +63,8 @@

Recent posts

@@ -90,6 +90,73 @@
+
+

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 PropertiesThe 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

@@ -394,88 +461,6 @@ rails s
-
-

Community Round-up #12

-

December 23, 2013 by Vjeux

-
-
-

React got featured on the front-page of Hacker News thanks to the Om library. If you try it out for the first time, take a look at the docs and do not hesitate to ask questions on the Google Group, IRC or Stack Overflow. We are trying our best to help you out!

-

The Future of Javascript MVC #

-

David Nolen announced Om, a thin wrapper on-top of React in ClojureScript. It stands out by only using immutable data structures. This unlocks the ability to write a very efficient shouldComponentUpdate and get huge performance improvements on some tasks.

- -
-

We've known this for some time over here in the ClojureScript corner of the world - all of our collections are immutable and modeled directly on the original Clojure versions written in Java. Modern JavaScript engines have now been tuned to the point that it's no longer uncommon to see collection performance within 2.5X of the Java Virtual Machine.

- -

Wait, wait, wait. What does the performance of persistent data structures have to do with the future of JavaScript MVCs?

- -

A whole lot. -

- -

Read the full article...

-
-

Scroll Position with React #

-

Managing the scroll position when new content is inserted is usually very tricky to get right. Vjeux discovered that componentWillUpdate and componentDidUpdate were triggered exactly at the right time to manage the scroll position.

- -
-

We can check the scroll position before the component has updated with componentWillUpdate and scroll if necessary at componentDidUpdate

-
componentWillUpdate: function() {
-  var node = this.getDOMNode();
-  this.shouldScrollBottom =
-    (node.scrollTop + node.offsetHeight) === node.scrollHeight;
-},
-componentDidUpdate: function() {
-  if (this.shouldScrollBottom) {
-    var node = this.getDOMNode();
-    node.scrollTop = node.scrollHeight
-  }
-},
-
-

Check out the blog article...

-
-

Lights Out #

-

React declarative approach is well suited to write games. Cheng Lou wrote the famous Lights Out game in React. It's a good example of use of TransitionGroup to implement animations. -

- -

Try it out!

-

Reactive Table Bookmarklet #

-

Stoyan Stefanov wrote a bookmarklet to process tables on the internet. It adds a little "pop" button that expands to a full-screen view with sorting, editing and export to csv and json. -

- -

Check out the blog post...

-

MontageJS Tutorial in React #

-

Ross Allen implemented MontageJS's Reddit tutorial in React. This is a good opportunity to compare the philosophies of the two libraries.

- - - -

View the source on JSFiddle...

-

Writing Good React Components #

-

William Högman Rudenmalm wrote an article on how to write good React components. This is full of good advice.

- -
-

The idea of dividing software into smaller parts or components is hardly new - It is the essance of good software. The same principles that apply to software in general apply to building React components. That doesn’t mean that writing good React components is just about applying general rules.

- -

The web offers a unique set of challenges, which React offers interesting solutions to. First and foremost among these solutions is the what is called the Mock DOM. Rather than having user code interface with the DOM in a direct fashion, as is the case with most DOM manipulation libraries.

- -

You build a model of how you want the DOM end up like. React then inserts this model into the DOM. This is very useful for updates because React simply compares the model or mock DOM against the actual DOM, and then only updates based on the difference between the two states.

- -

Read the full article ...

-
-

Hoodie React TodoMVC #

-

Sven Lito integrated the React TodoMVC example within an Hoodie web app environment. This should let you get started using Hoodie and React.

-
hoodie new todomvc -t "hoodiehq/hoodie-react-todomvc"
-
-

Check out on GitHub...

-

JSX Compiler #

-

Ever wanted to have a quick way to see what a JSX tag would be converted to? Tim Yung made a page for it. -

- -

Try it out!

-

Random Tweet #

-

- -
-
- @@ -90,6 +90,88 @@
+
+

Community Round-up #12

+

December 23, 2013 by Vjeux

+
+
+

React got featured on the front-page of Hacker News thanks to the Om library. If you try it out for the first time, take a look at the docs and do not hesitate to ask questions on the Google Group, IRC or Stack Overflow. We are trying our best to help you out!

+

The Future of Javascript MVC #

+

David Nolen announced Om, a thin wrapper on-top of React in ClojureScript. It stands out by only using immutable data structures. This unlocks the ability to write a very efficient shouldComponentUpdate and get huge performance improvements on some tasks.

+ +
+

We've known this for some time over here in the ClojureScript corner of the world - all of our collections are immutable and modeled directly on the original Clojure versions written in Java. Modern JavaScript engines have now been tuned to the point that it's no longer uncommon to see collection performance within 2.5X of the Java Virtual Machine.

+ +

Wait, wait, wait. What does the performance of persistent data structures have to do with the future of JavaScript MVCs?

+ +

A whole lot. +

+ +

Read the full article...

+
+

Scroll Position with React #

+

Managing the scroll position when new content is inserted is usually very tricky to get right. Vjeux discovered that componentWillUpdate and componentDidUpdate were triggered exactly at the right time to manage the scroll position.

+ +
+

We can check the scroll position before the component has updated with componentWillUpdate and scroll if necessary at componentDidUpdate

+
componentWillUpdate: function() {
+  var node = this.getDOMNode();
+  this.shouldScrollBottom =
+    (node.scrollTop + node.offsetHeight) === node.scrollHeight;
+},
+componentDidUpdate: function() {
+  if (this.shouldScrollBottom) {
+    var node = this.getDOMNode();
+    node.scrollTop = node.scrollHeight
+  }
+},
+
+

Check out the blog article...

+
+

Lights Out #

+

React declarative approach is well suited to write games. Cheng Lou wrote the famous Lights Out game in React. It's a good example of use of TransitionGroup to implement animations. +

+ +

Try it out!

+

Reactive Table Bookmarklet #

+

Stoyan Stefanov wrote a bookmarklet to process tables on the internet. It adds a little "pop" button that expands to a full-screen view with sorting, editing and export to csv and json. +

+ +

Check out the blog post...

+

MontageJS Tutorial in React #

+

Ross Allen implemented MontageJS's Reddit tutorial in React. This is a good opportunity to compare the philosophies of the two libraries.

+ + + +

View the source on JSFiddle...

+

Writing Good React Components #

+

William Högman Rudenmalm wrote an article on how to write good React components. This is full of good advice.

+ +
+

The idea of dividing software into smaller parts or components is hardly new - It is the essance of good software. The same principles that apply to software in general apply to building React components. That doesn’t mean that writing good React components is just about applying general rules.

+ +

The web offers a unique set of challenges, which React offers interesting solutions to. First and foremost among these solutions is the what is called the Mock DOM. Rather than having user code interface with the DOM in a direct fashion, as is the case with most DOM manipulation libraries.

+ +

You build a model of how you want the DOM end up like. React then inserts this model into the DOM. This is very useful for updates because React simply compares the model or mock DOM against the actual DOM, and then only updates based on the difference between the two states.

+ +

Read the full article ...

+
+

Hoodie React TodoMVC #

+

Sven Lito integrated the React TodoMVC example within an Hoodie web app environment. This should let you get started using Hoodie and React.

+
hoodie new todomvc -t "hoodiehq/hoodie-react-todomvc"
+
+

Check out on GitHub...

+

JSX Compiler #

+

Ever wanted to have a quick way to see what a JSX tag would be converted to? Tim Yung made a page for it. +

+ +

Try it out!

+

Random Tweet #

+

+ +
+
+

React v0.8

December 19, 2013 by Paul O'Shannessy

@@ -355,153 +437,6 @@ Is this some sort of template language? Specifically no. This might have been th
-
-

Thinking in React

-

November 5, 2013 by Pete Hunt

-
-
-

React is, in my opinion, the premier way to build big, fast Web apps with JavaScript. It's scaled very well for us at Facebook and Instagram.

- -

One of the many great parts of React is how it makes you think about apps as you build them. In this post I'll walk you through the thought process of building a searchable product data table using React.

-

Start with a mock #

-

Imagine that we already have a JSON API and a mock from our designer. Our designer apparently isn't very good because the mock looks like this:

- -

Mockup

- -

Our JSON API returns some data that looks like this:

-
[
-  {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
-  {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
-  {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
-  {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
-  {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
-  {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
-];
-

Step 1: break the UI into a component hierarchy #

-

The first thing you'll want to do is to draw boxes around every component (and subcomponent) in the mock and give them all names. If you're working with a designer they may have already done this, so go talk to them! Their Photoshop layer names may end up being the names of your React components!

- -

But how do you know what should be its own component? Just use the same techniques for deciding if you should create a new function or object. One such technique is the single responsibility principle, that is, a component should ideally only do one thing. If it ends up growing it should be decomposed into smaller subcomponents.

- -

Since you're often displaying a JSON data model to a user, you'll find that if your model was built correctly your UI (and therefore your component structure) will map nicely onto it. That's because user interfaces and data models tend to adhere to the same information architecture which means the work of separating your UI into components is often trivial. Just break it up into components that represent exactly one piece of your data model.

- -

Component diagram

- -

You'll see here that we have five components in our simple app. I've italicized the data each component represents.

- -
    -
  1. FilterableProductTable (orange): contains the entirety of the example
  2. -
  3. SearchBar (blue): receives all user input
  4. -
  5. ProductTable (green): displays and filters the data collection based on user input
  6. -
  7. ProductCategoryRow (turquoise): displays a heading for each category
  8. -
  9. ProductRow (red): displays a row for each product
  10. -
- -

If you look at ProductTable you'll see that the table header (containing the "Name" and "Price" labels) isn't its own component. This is a matter of preference and there's an argument to be made either way. For this example I left it as part of ProductTable because it is part of rendering the data collection which is ProductTable's responsibility. However if this header grows to be complex (i.e. if we were to add affordances for sorting) it would certainly make sense to make this its own ProductTableHeader component.

- -

Now that we've identified the components in our mock, let's arrange them into a hierarchy. This is easy. Components that appear within another component in the mock should appear as a child in the hierarchy:

- -
    -
  • FilterableProductTable - -
      -
    • SearchBar
    • -
    • ProductTable - -
        -
      • ProductCategoryRow
      • -
      • ProductRow
      • -
    • -
  • -
-

Step 2: Build a static version in React #

- - -

Now that you have your component hierarchy it's time to start implementing your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's easiest to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why.

- -

To build a static version of your app that renders your data model you'll want to build components that reuse other components and pass data using props. props are a way of passing data from parent to child. If you're familiar with the concept of state, don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app you don't need it.

- -

You can build top-down or bottom-up. That is, you can either start with building the components higher up in the hierarchy (i.e. starting with FilterableProductTable) or with the ones lower in it (ProductRow). In simpler examples it's usually easier to go top-down and on larger projects it's easier to go bottom-up and write tests as you build.

- -

At the end of this step you'll have a library of reusable components that render your data model. The components will only have render() methods since this is a static version of your app. The component at the top of the hierarchy (FilterableProductTable) will take your data model as a prop. If you make a change to your underlying data model and call renderComponent() again the UI will be updated. It's easy to see how your UI is updated and where to make changes since there's nothing complicated going on since React's one-way data flow (also called one-way binding) keeps everything modular, easy to reason about, and fast.

- -

Simply refer to the React docs if you need help executing this step.

-

A brief interlude: props vs state #

-

There are two types of "model" data in React: props and state. It's important to understand the distinction between the two; skim the official React docs if you aren't sure what the difference is.

-

Step 3: Identify the minimal (but complete) representation of UI state #

-

To make your UI interactive you need to be able to trigger changes to your underlying data model. React makes this easy with state.

- -

To build your app correctly you first need to think of the minimal set of mutable state that your app needs. The key here is DRY: Don't Repeat Yourself. Figure out what the absolute minimal representation of the state of your application needs to be and compute everything else you need on-demand. For example, if you're building a TODO list, just keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count simply take the length of the TODO items array.

- -

Think of all of the pieces of data in our example application. We have:

- -
    -
  • The original list of products
  • -
  • The search text the user has entered
  • -
  • The value of the checkbox
  • -
  • The filtered list of products
  • -
- -

Let's go through each one and figure out which one is state. Simply ask three questions about each piece of data:

- -
    -
  1. Is it passed in from a parent via props? If so, it probably isn't state.
  2. -
  3. Does it change over time? If not, it probably isn't state.
  4. -
  5. Can you compute it based on any other state or props in your component? If so, it's not state.
  6. -
- -

The original list of products is passed in as props, so that's not state. The search text and the checkbox seem to be state since they change over time and can't be computed from anything. And finally, the filtered list of products isn't state because it can be computed by combining the original list of products with the search text and value of the checkbox.

- -

So finally, our state is:

- -
    -
  • The search text the user has entered
  • -
  • The value of the checkbox
  • -
-

Step 4: Identify where your state should live #

- - -

OK, so we've identified what the minimal set of app state is. Next we need to identify which component mutates, or owns, this state.

- -

Remember: React is all about one-way data flow down the component hierarchy. It may not be immediately clear which component should own what state. This is often the most challenging part for newcomers to understand, so follow these steps to figure it out:

- -

For each piece of state in your application:

- -
    -
  • Identify every component that renders something based on that state.
  • -
  • Find a common owner component (a single component above all the components that need the state in the hierarchy).
  • -
  • Either the common owner or another component higher up in the hierarchy should own the state.
  • -
  • If you can't find a component where it makes sense to own the state, create a new component simply for holding the state and add it somewhere in the hierarchy above the common owner component.
  • -
- -

Let's run through this strategy for our application:

- -
    -
  • ProductTable needs to filter the product list based on state and SearchBar needs to display the search text and checked state.
  • -
  • The common owner component is FilterableProductTable.
  • -
  • It conceptually makes sense for the filter text and checked value to live in FilterableProductTable
  • -
- -

Cool, so we've decided that our state lives in FilterableProductTable. First, add a getInitialState() method to FilterableProductTable that returns {filterText: '', inStockOnly: false} to reflect the initial state of your application. Then pass filterText and inStockOnly to ProductTable and SearchBar as a prop. Finally, use these props to filter the rows in ProductTable and set the values of the form fields in SearchBar.

- -

You can start seeing how your application will behave: set filterText to "ball" and refresh your app. You'll see the data table is updated correctly.

-

Step 5: Add inverse data flow #

- - -

So far we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in FilterableProductTable.

- -

React makes this data flow explicit to make it easy to understand how your program works, but it does require a little more typing than traditional two-way data binding. React provides an add-on called ReactLink to make this pattern as convenient as two-way binding, but for the purpose of this post we'll keep everything explicit.

- -

If you try to type or check the box in the current version of the example you'll see that React ignores your input. This is intentional, as we've set the value prop of the input to always be equal to the state passed in from FilterableProductTable.

- -

Let's think about what we want to happen. We want to make sure that whenever the user changes the form we update the state to reflect the user input. Since components should only update their own state, FilterableProductTable will pass a callback to SearchBar that will fire whenever the state should be updated. We can use the onChange event on the inputs to be notified of it. And the callback passed by FilterableProductTable will call setState() and the app will be updated.

- -

Though this sounds like a lot it's really just a few lines of code. And it's really explicit how your data is flowing throughout the app.

-

And that's it #

-

Hopefully this gives you an idea of how to think about building components and applications with React. While it may be a little more typing than you're used to, remember that code is read far more than it's written, and it's extremely easy to read this modular, explicit code. As you start to build large libraries of components you'll appreciate this explicitness and modularity, and with code reuse your lines of code will start to shrink :)

- -
-
- @@ -90,6 +90,153 @@
+
+

Thinking in React

+

November 5, 2013 by Pete Hunt

+
+
+

React is, in my opinion, the premier way to build big, fast Web apps with JavaScript. It's scaled very well for us at Facebook and Instagram.

+ +

One of the many great parts of React is how it makes you think about apps as you build them. In this post I'll walk you through the thought process of building a searchable product data table using React.

+

Start with a mock #

+

Imagine that we already have a JSON API and a mock from our designer. Our designer apparently isn't very good because the mock looks like this:

+ +

Mockup

+ +

Our JSON API returns some data that looks like this:

+
[
+  {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
+  {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
+  {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
+  {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
+  {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
+  {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
+];
+

Step 1: break the UI into a component hierarchy #

+

The first thing you'll want to do is to draw boxes around every component (and subcomponent) in the mock and give them all names. If you're working with a designer they may have already done this, so go talk to them! Their Photoshop layer names may end up being the names of your React components!

+ +

But how do you know what should be its own component? Just use the same techniques for deciding if you should create a new function or object. One such technique is the single responsibility principle, that is, a component should ideally only do one thing. If it ends up growing it should be decomposed into smaller subcomponents.

+ +

Since you're often displaying a JSON data model to a user, you'll find that if your model was built correctly your UI (and therefore your component structure) will map nicely onto it. That's because user interfaces and data models tend to adhere to the same information architecture which means the work of separating your UI into components is often trivial. Just break it up into components that represent exactly one piece of your data model.

+ +

Component diagram

+ +

You'll see here that we have five components in our simple app. I've italicized the data each component represents.

+ +
    +
  1. FilterableProductTable (orange): contains the entirety of the example
  2. +
  3. SearchBar (blue): receives all user input
  4. +
  5. ProductTable (green): displays and filters the data collection based on user input
  6. +
  7. ProductCategoryRow (turquoise): displays a heading for each category
  8. +
  9. ProductRow (red): displays a row for each product
  10. +
+ +

If you look at ProductTable you'll see that the table header (containing the "Name" and "Price" labels) isn't its own component. This is a matter of preference and there's an argument to be made either way. For this example I left it as part of ProductTable because it is part of rendering the data collection which is ProductTable's responsibility. However if this header grows to be complex (i.e. if we were to add affordances for sorting) it would certainly make sense to make this its own ProductTableHeader component.

+ +

Now that we've identified the components in our mock, let's arrange them into a hierarchy. This is easy. Components that appear within another component in the mock should appear as a child in the hierarchy:

+ +
    +
  • FilterableProductTable + +
      +
    • SearchBar
    • +
    • ProductTable + +
        +
      • ProductCategoryRow
      • +
      • ProductRow
      • +
    • +
  • +
+

Step 2: Build a static version in React #

+ + +

Now that you have your component hierarchy it's time to start implementing your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's easiest to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why.

+ +

To build a static version of your app that renders your data model you'll want to build components that reuse other components and pass data using props. props are a way of passing data from parent to child. If you're familiar with the concept of state, don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app you don't need it.

+ +

You can build top-down or bottom-up. That is, you can either start with building the components higher up in the hierarchy (i.e. starting with FilterableProductTable) or with the ones lower in it (ProductRow). In simpler examples it's usually easier to go top-down and on larger projects it's easier to go bottom-up and write tests as you build.

+ +

At the end of this step you'll have a library of reusable components that render your data model. The components will only have render() methods since this is a static version of your app. The component at the top of the hierarchy (FilterableProductTable) will take your data model as a prop. If you make a change to your underlying data model and call renderComponent() again the UI will be updated. It's easy to see how your UI is updated and where to make changes since there's nothing complicated going on since React's one-way data flow (also called one-way binding) keeps everything modular, easy to reason about, and fast.

+ +

Simply refer to the React docs if you need help executing this step.

+

A brief interlude: props vs state #

+

There are two types of "model" data in React: props and state. It's important to understand the distinction between the two; skim the official React docs if you aren't sure what the difference is.

+

Step 3: Identify the minimal (but complete) representation of UI state #

+

To make your UI interactive you need to be able to trigger changes to your underlying data model. React makes this easy with state.

+ +

To build your app correctly you first need to think of the minimal set of mutable state that your app needs. The key here is DRY: Don't Repeat Yourself. Figure out what the absolute minimal representation of the state of your application needs to be and compute everything else you need on-demand. For example, if you're building a TODO list, just keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count simply take the length of the TODO items array.

+ +

Think of all of the pieces of data in our example application. We have:

+ +
    +
  • The original list of products
  • +
  • The search text the user has entered
  • +
  • The value of the checkbox
  • +
  • The filtered list of products
  • +
+ +

Let's go through each one and figure out which one is state. Simply ask three questions about each piece of data:

+ +
    +
  1. Is it passed in from a parent via props? If so, it probably isn't state.
  2. +
  3. Does it change over time? If not, it probably isn't state.
  4. +
  5. Can you compute it based on any other state or props in your component? If so, it's not state.
  6. +
+ +

The original list of products is passed in as props, so that's not state. The search text and the checkbox seem to be state since they change over time and can't be computed from anything. And finally, the filtered list of products isn't state because it can be computed by combining the original list of products with the search text and value of the checkbox.

+ +

So finally, our state is:

+ +
    +
  • The search text the user has entered
  • +
  • The value of the checkbox
  • +
+

Step 4: Identify where your state should live #

+ + +

OK, so we've identified what the minimal set of app state is. Next we need to identify which component mutates, or owns, this state.

+ +

Remember: React is all about one-way data flow down the component hierarchy. It may not be immediately clear which component should own what state. This is often the most challenging part for newcomers to understand, so follow these steps to figure it out:

+ +

For each piece of state in your application:

+ +
    +
  • Identify every component that renders something based on that state.
  • +
  • Find a common owner component (a single component above all the components that need the state in the hierarchy).
  • +
  • Either the common owner or another component higher up in the hierarchy should own the state.
  • +
  • If you can't find a component where it makes sense to own the state, create a new component simply for holding the state and add it somewhere in the hierarchy above the common owner component.
  • +
+ +

Let's run through this strategy for our application:

+ +
    +
  • ProductTable needs to filter the product list based on state and SearchBar needs to display the search text and checked state.
  • +
  • The common owner component is FilterableProductTable.
  • +
  • It conceptually makes sense for the filter text and checked value to live in FilterableProductTable
  • +
+ +

Cool, so we've decided that our state lives in FilterableProductTable. First, add a getInitialState() method to FilterableProductTable that returns {filterText: '', inStockOnly: false} to reflect the initial state of your application. Then pass filterText and inStockOnly to ProductTable and SearchBar as a prop. Finally, use these props to filter the rows in ProductTable and set the values of the form fields in SearchBar.

+ +

You can start seeing how your application will behave: set filterText to "ball" and refresh your app. You'll see the data table is updated correctly.

+

Step 5: Add inverse data flow #

+ + +

So far we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in FilterableProductTable.

+ +

React makes this data flow explicit to make it easy to understand how your program works, but it does require a little more typing than traditional two-way data binding. React provides an add-on called ReactLink to make this pattern as convenient as two-way binding, but for the purpose of this post we'll keep everything explicit.

+ +

If you try to type or check the box in the current version of the example you'll see that React ignores your input. This is intentional, as we've set the value prop of the input to always be equal to the state passed in from FilterableProductTable.

+ +

Let's think about what we want to happen. We want to make sure that whenever the user changes the form we update the state to reflect the user input. Since components should only update their own state, FilterableProductTable will pass a callback to SearchBar that will fire whenever the state should be updated. We can use the onChange event on the inputs to be notified of it. And the callback passed by FilterableProductTable will call setState() and the app will be updated.

+ +

Though this sounds like a lot it's really just a few lines of code. And it's really explicit how your data is flowing throughout the app.

+

And that's it #

+

Hopefully this gives you an idea of how to think about building components and applications with React. While it may be a little more typing than you're used to, remember that code is read far more than it's written, and it's extremely easy to read this modular, explicit code. As you start to build large libraries of components you'll appreciate this explicitness and modularity, and with code reuse your lines of code will start to shrink :)

+ +
+
+

React v0.5.1

October 29, 2013 by Paul O'Shannessy

@@ -309,88 +456,6 @@
-
-

Community Round-up #7

-

August 26, 2013 by Vjeux

-
-
-

It's been three months since we open sourced React and it is going well. Some stats so far:

- - -

Wolfenstein Rendering Engine Ported to React #

-

Pete Hunt ported the render code of the web version of Wolfenstein 3D to React. Check out the demo and render.js file for the implementation. -

-

React & Meteor #

-

Ben Newman made a 13-lines wrapper to use React and Meteor together. Meteor handles the real-time data synchronization between client and server. React provides the declarative way to write the interface and only updates the parts of the UI that changed.

- -
-

This repository defines a Meteor package that automatically integrates the React rendering framework on both the client and the server, to complement or replace the default Handlebars templating system.

- -

The React core is officially agnostic about how you fetch and update your data, so it is far from obvious which approach is the best. This package provides one answer to that question (use Meteor!), and I hope you will find it a compelling combination.

-
var MyComponent = React.createClass({
- mixins: [MeteorMixin],
-
- getMeteorState: function() {
-   return { foo: Session.get('foo') };
- },
-
- render: function() {
-   return <div>{this.state.foo}</div>;
- }
-});
-
-

Dependencies will be registered for any data accesses performed by getMeteorState so that the component can be automatically re-rendered whenever the data changes.

- -

Read more ...

-
-

React Page #

-

Jordan Walke implemented a complete React project creator called react-page. It supports both server-side and client-side rendering, source transform and packaging JSX files using CommonJS modules, and instant reload.

- -
-

Easy Application Development with React JavaScript -

- -

Why Server Rendering?

- -
    -
  • Faster initial page speed: - -
      -
    • Markup displayed before downloading large JavaScript.
    • -
    • Markup can be generated more quickly on a fast server than low power client devices.
    • -
  • -
  • Faster Development and Prototyping: - -
      -
    • Instantly refresh your app without waiting for any watch scripts or bundlers.
    • -
  • -
  • Easy deployment of static content pages/blogs: just archive using recursive wget.
  • -
  • SEO benefits of indexability and perf.
  • -
- -

How Does Server Rendering Work?

- -
    -
  • react-page computes page markup on the server, sends it to the client so the user can see it quickly.
  • -
  • The corresponding JavaScript is then packaged and sent.
  • -
  • The browser runs that JavaScript, so that all of the event handlers, interactions and update code will run seamlessly on top of the server generated markup.
  • -
  • From the developer's (and the user's) perspective, it's just as if the rendering occurred on the client, only faster.
  • -
- -

Try it out ...

-
- -
-
- @@ -90,6 +90,88 @@
+
+

Community Round-up #7

+

August 26, 2013 by Vjeux

+
+
+

It's been three months since we open sourced React and it is going well. Some stats so far:

+ + +

Wolfenstein Rendering Engine Ported to React #

+

Pete Hunt ported the render code of the web version of Wolfenstein 3D to React. Check out the demo and render.js file for the implementation. +

+

React & Meteor #

+

Ben Newman made a 13-lines wrapper to use React and Meteor together. Meteor handles the real-time data synchronization between client and server. React provides the declarative way to write the interface and only updates the parts of the UI that changed.

+ +
+

This repository defines a Meteor package that automatically integrates the React rendering framework on both the client and the server, to complement or replace the default Handlebars templating system.

+ +

The React core is officially agnostic about how you fetch and update your data, so it is far from obvious which approach is the best. This package provides one answer to that question (use Meteor!), and I hope you will find it a compelling combination.

+
var MyComponent = React.createClass({
+ mixins: [MeteorMixin],
+
+ getMeteorState: function() {
+   return { foo: Session.get('foo') };
+ },
+
+ render: function() {
+   return <div>{this.state.foo}</div>;
+ }
+});
+
+

Dependencies will be registered for any data accesses performed by getMeteorState so that the component can be automatically re-rendered whenever the data changes.

+ +

Read more ...

+
+

React Page #

+

Jordan Walke implemented a complete React project creator called react-page. It supports both server-side and client-side rendering, source transform and packaging JSX files using CommonJS modules, and instant reload.

+ +
+

Easy Application Development with React JavaScript +

+ +

Why Server Rendering?

+ +
    +
  • Faster initial page speed: + +
      +
    • Markup displayed before downloading large JavaScript.
    • +
    • Markup can be generated more quickly on a fast server than low power client devices.
    • +
  • +
  • Faster Development and Prototyping: + +
      +
    • Instantly refresh your app without waiting for any watch scripts or bundlers.
    • +
  • +
  • Easy deployment of static content pages/blogs: just archive using recursive wget.
  • +
  • SEO benefits of indexability and perf.
  • +
+ +

How Does Server Rendering Work?

+ +
    +
  • react-page computes page markup on the server, sends it to the client so the user can see it quickly.
  • +
  • The corresponding JavaScript is then packaged and sent.
  • +
  • The browser runs that JavaScript, so that all of the event handlers, interactions and update code will run seamlessly on top of the server generated markup.
  • +
  • From the developer's (and the user's) perspective, it's just as if the rendering occurred on the client, only faster.
  • +
+ +

Try it out ...

+
+ +
+
+

Use React and JSX in Python Applications

August 19, 2013 by Kunal Mehta

@@ -266,104 +348,6 @@
-
-

Community Round-up #5

-

July 23, 2013 by Vjeux

-
-
-

We launched the React Facebook Page along with the React v0.4 launch. 700 people already liked it to get updated on the project :)

-

Cross-browser onChange #

-

Ben Alpert from Khan Academy worked on a cross-browser implementation of onChange event that landed in v0.4. He wrote a blog post explaining the various browser quirks he had to deal with.

- -
-

First off, what is the input event? If you have an <input> element and want to receive events whenever the value changes, the most obvious thing to do is to listen to the change event. Unfortunately, change fires only after the text field is defocused, rather than on each keystroke. The next obvious choice is the keyup event, which is triggered whenever a key is released. Unfortunately, keyup doesn't catch input that doesn't involve the keyboard (e.g., pasting from the clipboard using the mouse) and only fires once if a key is held down, rather than once per inserted character.

- -

Both keydown and keypress do fire repeatedly when a key is held down, but both fire immediately before the value changes, so to read the new value you have to defer the handler to the next event loop using setTimeout(fn, 0) or similar, which slows down your app. Of course, like keyup, neither keydown nor keypress fires for non-keyboard input events, and all three can fire in cases where the value doesn't change at all (such as when pressing the arrow keys).

- -

Read the full post...

-
-

React Samples #

-

Learning a new library is always easier when you have working examples you can play with. jwh put many of them on his react-samples Github repo.

- -
-

Some simple examples with Facebook's React framework

- - -
-

React Chosen Wrapper #

-

Cheng Lou wrote a wrapper for the Chosen input library called react-chosen. It took just 25 lines to be able to use jQuery component as a React one.

-
React.renderComponent(
-  <Chosen noResultsText="No result" value="Harvest" onChange={doSomething}>
-    <option value="Facebook">Facebook</option>
-    <option value="Harvest">Harvest</option>
-  </Chosen>
-, document.body);
-

JSX and ES6 Template Strings #

-

Domenic Denicola wrote a slide deck about the great applications of ES6 features and one slide shows how we could use Template Strings to compile JSX at run-time without the need for a pre-processing phase.

- -
-

React Presentation #

-

Tom Occhino and Jordan Walke, React developers, did a presentation of React at Facebook Seattle's office. Check out the first 25 minutes for the presentation and the remaining 45 for a Q&A. I highly recommend you watching this video.

- -
-

Docs #

-

Pete Hunt rewrote the entirety of the docs for v0.4. The goal was to add more explanation about why we built React and what the best practices are.

- -
-

Guides

- - -
- -
-
- @@ -90,6 +90,104 @@
+
+

Community Round-up #5

+

July 23, 2013 by Vjeux

+
+
+

We launched the React Facebook Page along with the React v0.4 launch. 700 people already liked it to get updated on the project :)

+

Cross-browser onChange #

+

Ben Alpert from Khan Academy worked on a cross-browser implementation of onChange event that landed in v0.4. He wrote a blog post explaining the various browser quirks he had to deal with.

+ +
+

First off, what is the input event? If you have an <input> element and want to receive events whenever the value changes, the most obvious thing to do is to listen to the change event. Unfortunately, change fires only after the text field is defocused, rather than on each keystroke. The next obvious choice is the keyup event, which is triggered whenever a key is released. Unfortunately, keyup doesn't catch input that doesn't involve the keyboard (e.g., pasting from the clipboard using the mouse) and only fires once if a key is held down, rather than once per inserted character.

+ +

Both keydown and keypress do fire repeatedly when a key is held down, but both fire immediately before the value changes, so to read the new value you have to defer the handler to the next event loop using setTimeout(fn, 0) or similar, which slows down your app. Of course, like keyup, neither keydown nor keypress fires for non-keyboard input events, and all three can fire in cases where the value doesn't change at all (such as when pressing the arrow keys).

+ +

Read the full post...

+
+

React Samples #

+

Learning a new library is always easier when you have working examples you can play with. jwh put many of them on his react-samples Github repo.

+ +
+

Some simple examples with Facebook's React framework

+ + +
+

React Chosen Wrapper #

+

Cheng Lou wrote a wrapper for the Chosen input library called react-chosen. It took just 25 lines to be able to use jQuery component as a React one.

+
React.renderComponent(
+  <Chosen noResultsText="No result" value="Harvest" onChange={doSomething}>
+    <option value="Facebook">Facebook</option>
+    <option value="Harvest">Harvest</option>
+  </Chosen>
+, document.body);
+

JSX and ES6 Template Strings #

+

Domenic Denicola wrote a slide deck about the great applications of ES6 features and one slide shows how we could use Template Strings to compile JSX at run-time without the need for a pre-processing phase.

+ +
+

React Presentation #

+

Tom Occhino and Jordan Walke, React developers, did a presentation of React at Facebook Seattle's office. Check out the first 25 minutes for the presentation and the remaining 45 for a Q&A. I highly recommend you watching this video.

+ +
+

Docs #

+

Pete Hunt rewrote the entirety of the docs for v0.4. The goal was to add more explanation about why we built React and what the best practices are.

+ +
+

Guides

+ + +
+ +
+
+

React v0.4.0

July 17, 2013 by Paul O'Shannessy

@@ -291,89 +389,6 @@ If you were using React without JSX previously, your code should still work.
-
-

Community Round-up #3

-

June 27, 2013 by Vjeux

-
-
-

The highlight of this week is that an interaction-heavy app has been ported to React. React components are solving issues they had with nested views.

-

Moving From Backbone To React #

-

Clay Allsopp successfully ported Propeller, a fairly big, interaction-heavy JavaScript app, to React.

- -
-

Subviews involve a lot of easy-to-forget boilerplate that Backbone (by design) doesn't automate. Libraries like Backbone.Marionette offer more abstractions to make view nesting easier, but they're all limited by the fact that Backbone delegates how and went view-document attachment occurs to the application code.

- -

React, on the other hand, manages the DOM and only exposes real nodes at select points in its API. The "elements" you code in React are actually objects which wrap DOM nodes, not the actual objects which get inserted into the DOM. Internally, React converts those abstractions into actual DOMElements and fills out the document accordingly. [...]

- -

We moved about 20 different Backbone view classes to React over the past few weeks, including the live-preview pane that you see in our little iOS demo. Most importantly, it's allowed us to put energy into making each component work great on its own, instead of spending extra cycles to ensure they function in unison. For that reason, we think React is a more scalable way to build view-intensive apps than Backbone alone, and it doesn't require you to drop-everything-and-refactor like a move to Ember or Angular would demand.

- -

Read the full post...

-
-

Grunt Task for JSX #

-

Eric Clemmons wrote a task for Grunt that applies the JSX transformation to your Javascript files. It also works with Browserify if you want all your files to be concatenated and minified together.

- -
-

Grunt task for compiling Facebook React's .jsx templates into .js

-
grunt.initConfig({
-  react: {
-    app: {
-      options: { extension: 'js' },
-      files: { 'path/to/output/dir': 'path/to/jsx/templates/dir' }
-
-

It also works great with grunt-browserify!

-
browserify: {
-  options: {
-    transform: [ require('grunt-react').browserify ]
-  },
-  app: {
-    src: 'path/to/source/main.js',
-    dest: 'path/to/target/output.js'
-
-

Check out the project ...

-
-

Backbone/Handlebars Nested Views #

-

Joel Burget wrote a blog post talking about the way we would write React-like components in Backbone and Handlebars.

- -
-

The problem here is that we're trying to maniplate a tree, but there's a textual layer we have to go through. Our views are represented as a tree - the subviews are children of CommentCollectionView - and they end up as part of a tree in the DOM. But there's a Handlebars layer in the middle (which deals in flat strings), so the hierarchy must be destructed and rebuilt when we render.

- -

What does it take to render a collection view? In the Backbone/Handlebars view of the world you have to render the template (with stubs), render each subview which replaces a stub, and keep a reference to each subview (or anything within the view that could change in the future).

- -

So while our view is conceptually hierarchical, due to the fact that it has to go through a flat textual representation, we need to do a lot of extra work to reassemble that structure after rendering.

- -

Read the full post...

-
-

JSRomandie Meetup #

-

Renault John Lecoultre from BugBuster did a React introduction talk at a JS meetup called JS Romandie last week.

- - -

CoffeeScript integration #

-

Vjeux used the fact that JSX is just a syntactic sugar on-top of regular JS to rewrite the React front-page examples in CoffeeScript.

- -
-

Multiple people asked what's the story about JSX and CoffeeScript. There is no JSX pre-processor for CoffeeScript and I'm not aware of anyone working on it. Fortunately, CoffeeScript is pretty expressive and we can play around the syntax to come up with something that is usable.

-
{div, h3, textarea} = React.DOM
-(div {className: 'MarkdownEditor'}, [
-  (h3 {}, 'Input'),
-  (textarea {onKeyUp: @handleKeyUp, ref: 'textarea'},
-    @state.value
-  )
-])
-
-

Read the full post...

-
-

Tutorial in Plain Javascript #

-

We've seen a lot of people comparing React with various frameworks. Ricardo Tomasi decided to re-implement the tutorial without any framework, just plain Javascript.

- -
-

Facebook & Instagram launched the React framework and an accompanying tutorial. Developer Vlad Yazhbin decided to rewrite that using AngularJS. The end result is pretty neat, but if you're like me you will not actually appreciate the HTML speaking for itself and doing all the hard work. So let's see what that looks like in plain javascript.

- -

Read the full post...

-
- -
-
- @@ -90,6 +90,89 @@
+
+

Community Round-up #3

+

June 27, 2013 by Vjeux

+
+
+

The highlight of this week is that an interaction-heavy app has been ported to React. React components are solving issues they had with nested views.

+

Moving From Backbone To React #

+

Clay Allsopp successfully ported Propeller, a fairly big, interaction-heavy JavaScript app, to React.

+ +
+

Subviews involve a lot of easy-to-forget boilerplate that Backbone (by design) doesn't automate. Libraries like Backbone.Marionette offer more abstractions to make view nesting easier, but they're all limited by the fact that Backbone delegates how and went view-document attachment occurs to the application code.

+ +

React, on the other hand, manages the DOM and only exposes real nodes at select points in its API. The "elements" you code in React are actually objects which wrap DOM nodes, not the actual objects which get inserted into the DOM. Internally, React converts those abstractions into actual DOMElements and fills out the document accordingly. [...]

+ +

We moved about 20 different Backbone view classes to React over the past few weeks, including the live-preview pane that you see in our little iOS demo. Most importantly, it's allowed us to put energy into making each component work great on its own, instead of spending extra cycles to ensure they function in unison. For that reason, we think React is a more scalable way to build view-intensive apps than Backbone alone, and it doesn't require you to drop-everything-and-refactor like a move to Ember or Angular would demand.

+ +

Read the full post...

+
+

Grunt Task for JSX #

+

Eric Clemmons wrote a task for Grunt that applies the JSX transformation to your Javascript files. It also works with Browserify if you want all your files to be concatenated and minified together.

+ +
+

Grunt task for compiling Facebook React's .jsx templates into .js

+
grunt.initConfig({
+  react: {
+    app: {
+      options: { extension: 'js' },
+      files: { 'path/to/output/dir': 'path/to/jsx/templates/dir' }
+
+

It also works great with grunt-browserify!

+
browserify: {
+  options: {
+    transform: [ require('grunt-react').browserify ]
+  },
+  app: {
+    src: 'path/to/source/main.js',
+    dest: 'path/to/target/output.js'
+
+

Check out the project ...

+
+

Backbone/Handlebars Nested Views #

+

Joel Burget wrote a blog post talking about the way we would write React-like components in Backbone and Handlebars.

+ +
+

The problem here is that we're trying to maniplate a tree, but there's a textual layer we have to go through. Our views are represented as a tree - the subviews are children of CommentCollectionView - and they end up as part of a tree in the DOM. But there's a Handlebars layer in the middle (which deals in flat strings), so the hierarchy must be destructed and rebuilt when we render.

+ +

What does it take to render a collection view? In the Backbone/Handlebars view of the world you have to render the template (with stubs), render each subview which replaces a stub, and keep a reference to each subview (or anything within the view that could change in the future).

+ +

So while our view is conceptually hierarchical, due to the fact that it has to go through a flat textual representation, we need to do a lot of extra work to reassemble that structure after rendering.

+ +

Read the full post...

+
+

JSRomandie Meetup #

+

Renault John Lecoultre from BugBuster did a React introduction talk at a JS meetup called JS Romandie last week.

+ + +

CoffeeScript integration #

+

Vjeux used the fact that JSX is just a syntactic sugar on-top of regular JS to rewrite the React front-page examples in CoffeeScript.

+ +
+

Multiple people asked what's the story about JSX and CoffeeScript. There is no JSX pre-processor for CoffeeScript and I'm not aware of anyone working on it. Fortunately, CoffeeScript is pretty expressive and we can play around the syntax to come up with something that is usable.

+
{div, h3, textarea} = React.DOM
+(div {className: 'MarkdownEditor'}, [
+  (h3 {}, 'Input'),
+  (textarea {onKeyUp: @handleKeyUp, ref: 'textarea'},
+    @state.value
+  )
+])
+
+

Read the full post...

+
+

Tutorial in Plain Javascript #

+

We've seen a lot of people comparing React with various frameworks. Ricardo Tomasi decided to re-implement the tutorial without any framework, just plain Javascript.

+ +
+

Facebook & Instagram launched the React framework and an accompanying tutorial. Developer Vlad Yazhbin decided to rewrite that using AngularJS. The end result is pretty neat, but if you're like me you will not actually appreciate the HTML speaking for itself and doing all the hard work. So let's see what that looks like in plain javascript.

+ +

Read the full post...

+
+ +
+
+

React v0.3.3

June 21, 2013 by Paul O'Shannessy

@@ -329,20 +412,6 @@ but if you are interested in the nuts and bolts
-
-

JSFiddle Integration

-

June 2, 2013 by Christopher Chedeau

-
-
-

JSFiddle just announced support for React. This is an exciting news as it makes collaboration on snippets of code a lot easier. You can play around this base React JSFiddle, fork it and share it! A fiddle without JSX is also available.

- - - - - -
-
-
diff --git a/blog/page7/index.html b/blog/page7/index.html new file mode 100644 index 0000000000..2b92071ec1 --- /dev/null +++ b/blog/page7/index.html @@ -0,0 +1,146 @@ + + + + + + + React | Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ +
+

JSFiddle Integration

+

June 2, 2013 by Christopher Chedeau

+
+
+

JSFiddle just announced support for React. This is an exciting news as it makes collaboration on snippets of code a lot easier. You can play around this base React JSFiddle, fork it and share it! A fiddle without JSX is also available.

+ + + + + +
+
+ + + +
+
+ + +
+
A Facebook & Instagram collaboration.
+
© 2014 Facebook Inc.
+
+
+
+ + + + diff --git a/feed.xml b/feed.xml index fc60fe7e6c..cda79f9f5b 100644 --- a/feed.xml +++ b/feed.xml @@ -6,6 +6,72 @@ http://facebook.github.io/react + + Community Round-up #16 + <p>There have been many posts recently covering the <i>why</i> and <i>how</i> of React. This week&#39;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.</p> +<h2><a class="anchor" name="react-in-a-nutshell"></a>React in a nutshell <a class="hash-link" href="#react-in-a-nutshell">#</a></h2> +<p>Got five minutes to pitch React to your coworkers? John Lynch (<a href="https://twitter.com/johnrlynch">@johnrlynch</a>) put together <a href="http://slid.es/johnlynch/reactjs">this excellent and refreshing slideshow</a>:</p> + +<iframe src="//slid.es/johnlynch/reactjs/embed" width="576" height="420" scrolling="no" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> +<h2><a class="anchor" name="reacts-diff-algorithm"></a>React&#39;s diff algorithm <a class="hash-link" href="#reacts-diff-algorithm">#</a></h2> +<p>React core team member Christopher Chedeau (<a href="https://twitter.com/vjeux">@vjeux</a>) explores the innards of React&#39;s tree diffing algorithm in this <a href="http://calendar.perfplanet.com/2013/diff/">extensive and well-illustrated post</a>. <figure><a href="http://calendar.perfplanet.com/2013/diff/"><img src="/react/img/blog/react-diff-tree.png" alt=""></a></figure></p> + +<p>While we&#39;re talking about tree diffing: Matt Esch (<a href="https://twitter.com/MatthewEsch">@MatthewEsch</a>) created <a href="https://github.com/Matt-Esch/virtual-dom">this project</a>, which aims to implement the virtual DOM and a corresponding diff algorithm as separate modules.</p> +<h2><a class="anchor" name="many-many-new-introductions-to-react"></a>Many, many new introductions to React! <a class="hash-link" href="#many-many-new-introductions-to-react">#</a></h2> +<p>James Padosley wrote a short post on the basics (and merits) of React: <a href="http://james.padolsey.com/javascript/what-is-react/">What is React?</a></p> + +<blockquote> +<p>What I like most about React is that it doesn&#39;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.</p> + +<p><a href="http://james.padolsey.com/javascript/what-is-react/">Read the full post...</a></p> +</blockquote> + +<p>Taylor Lapeyre (<a href="https://twitter.com/taylorlapeyre">@taylorlapeyre</a>) wrote another nice <a href="http://words.taylorlapeyre.me/an-introduction-to-react">introduction to React</a>.</p> + +<blockquote> +<p>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.</p> + +<p><a href="http://words.taylorlapeyre.me/an-introduction-to-react">Read the full post...</a></p> +</blockquote> + +<p><a href="http://www.webdesignporto.com/react-js-in-pure-javascript-facebook-library/?utm_source=echojs&amp;utm_medium=post&amp;utm_campaign=echojs">This &quot;Deep explanation for newbies&quot;</a> by <a href="https://twitter.com/ProJavaScript">@ProJavaScript</a> explains how to get started building a React game without using the optional JSX syntax.</p> +<h3><a class="anchor" name="react-around-the-world"></a>React around the world <a class="hash-link" href="#react-around-the-world">#</a></h3> +<p>It&#39;s great to see the React community expand internationally. <a href="http://habrahabr.ru/post/189230/">This site</a> features a React introduction in Russian.</p> +<h3><a class="anchor" name="react-tutorial-series"></a>React tutorial series <a class="hash-link" href="#react-tutorial-series">#</a></h3> +<p><a href="https://medium.com/@followchrisp">Christopher Pitt</a> explains <a href="https://medium.com/react-tutorials/828c397e3dc8">React Components</a> and <a href="https://medium.com/react-tutorials/ef11cd55caa0">React Properties</a>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 <a href="https://medium.com/react-tutorials">other posts in his React Tutorial series</a>, e.g. on using <a href="https://medium.com/react-tutorials/8aaec65a546c">React + Backbone Model</a> and <a href="https://medium.com/react-tutorials/c00be0cf1592">React + Backbone Router</a>.</p> +<h3><a class="anchor" name="beginner-tutorial-implementing-the-board-game-go"></a>Beginner tutorial: Implementing the board game Go <a class="hash-link" href="#beginner-tutorial-implementing-the-board-game-go">#</a></h3> +<p><a href="http://cjlarose.com/">Chris LaRose</a> walks through the steps of creating a Go app in React, showing how to separate application logic from the rendered components. Check out his <a href="http://cjlarose.com/2014/01/09/react-board-game-tutorial.html">tutorial</a> or go straight to the <a href="https://github.com/cjlarose/react-go">code</a>.</p> +<h3><a class="anchor" name="egghead.io-video-tutorials"></a>Egghead.io video tutorials <a class="hash-link" href="#egghead.io-video-tutorials">#</a></h3> +<p>Joe Maddalone (<a href="https://twitter.com/joemaddalone">@joemaddalone</a>) of <a href="https://egghead.io/">egghead.io</a> created a series of React video tutorials, such as <a href="http://www.youtube.com/watch?v=rFvZydtmsxM&amp;feature=youtu.be&amp;a">this</a> introduction to React Components. [<a href="http://www.youtube.com/watch?v=rFvZydtmsxM&amp;feature=youtu.be&amp;a">part 1</a>], [<a href="http://www.youtube.com/watch?v=5yvFLrt7N8M">part 2</a>]</p> +<h3><a class="anchor" name="react-finally-a-great-serverclient-web-stack"></a>&quot;React: Finally, a great server/client web stack&quot; <a class="hash-link" href="#react-finally-a-great-serverclient-web-stack">#</a></h3> +<p>Eric Florenzano (<a href="https://twitter.com/ericflo">@ericflo</a>) sheds some light on what makes React perfect for server rendering:</p> + +<blockquote> +<p>[...] 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. [...]</p> + +<p>What I&#39;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.</p> + +<p><a href="http://eflorenzano.com/blog/2014/01/23/react-finally-server-client/">Read the full post...</a></p> +</blockquote> +<h2><a class="anchor" name="building-a-complex-react-component"></a>Building a complex React component <a class="hash-link" href="#building-a-complex-react-component">#</a></h2> +<p><a href="http://matt-harrison.com/">Matt Harrison</a> walks through the process of <a href="http://matt-harrison.com/building-a-complex-web-component-with-facebooks-react-library/">creating an SVG-based Resistance Calculator</a> using React. <figure><a href="http://matt-harrison.com/building-a-complex-web-component-with-facebooks-react-library/"><img src="/react/img/blog/resistance-calculator.png" alt=""></a></figure></p> +<h2><a class="anchor" name="random-tweets"></a>Random Tweets <a class="hash-link" href="#random-tweets">#</a></h2> +<div><blockquote class="twitter-tweet" lang="en"><p>[#reactjs](https://twitter.com/search?q=%23reactjs&src=hash) has very simple API, but it's amazing how much work has been done under the hood to make it blazing fast.</p>&mdash; Anton Astashov (@anton_astashov) <a href="https://twitter.com/anton_astashov/status/417556491646693378">December 30, 2013</a></blockquote></div> + +<div><blockquote class="twitter-tweet" lang="en"><p>[#reactjs]((https://twitter.com/search?q=%23reactjs&src=hash) makes refactoring your HTML as easy & natural as refactoring your javascript [@react_js](https://twitter.com/react_js)</p>&mdash; Jared Forsyth (@jaredforsyth) <a href="https://twitter.com/jaredforsyth/status/420304083010854912">January 6, 2014</a></blockquote></div> + +<div><blockquote class="twitter-tweet" lang="en"><p>Played with react.js for an hour, so many things suddenly became stupidly simple.</p>&mdash; andrewingram (@andrewingram) <a href="https://twitter.com/andrewingram/status/422810480701620225">January 13, 2014</a></blockquote></div> + +<div><blockquote class="twitter-tweet" lang="en"><p>[@okonetchnikov](https://twitter.com/okonetchnikov) HOLY CRAP react is nice</p>&mdash; julik (@julikt) <a href="https://twitter.com/julikt/status/422843478792765440">January 13, 2014</a></blockquote></div> + +<div><blockquote class="twitter-tweet" lang="en"><p>brb rewriting everything with react +</p>&mdash; Ben Smithett (@bensmithett) <a href="https://twitter.com/bensmithett/status/430671242186592256">February 4, 2014</a></blockquote></div> + + 2014-02-15T00:00:00-08:00 + http://facebook.github.io/react/blog/2014/02/15/community-roundup-16.html + http://facebook.github.io/react/blog/2014/02/15/community-roundup-16.html + + Community Round-up #15 <p>Interest in React seems to have surged ever since David Nolen (<a href="https://twitter.com/swannodette">@swannodette</a>)&#39;s introduction of <a href="https://github.com/swannodette/om">Om</a> in his post <a href="http://swannodette.github.io/2013/12/17/the-future-of-javascript-mvcs/">&quot;The Future of Javascript MVC Frameworks&quot;</a>.</p> @@ -648,151 +714,5 @@ Is this some sort of template language? Specifically no. This might have been th http://facebook.github.io/react/blog/2013/11/06/community-roundup-10.html - - Thinking in React - <p>React is, in my opinion, the premier way to build big, fast Web apps with JavaScript. It&#39;s scaled very well for us at Facebook and Instagram.</p> - -<p>One of the many great parts of React is how it makes you think about apps as you build them. In this post I&#39;ll walk you through the thought process of building a searchable product data table using React.</p> -<h2><a class="anchor" name="start-with-a-mock"></a>Start with a mock <a class="hash-link" href="#start-with-a-mock">#</a></h2> -<p>Imagine that we already have a JSON API and a mock from our designer. Our designer apparently isn&#39;t very good because the mock looks like this:</p> - -<p><img src="/react/img/blog/thinking-in-react-mock.png" alt="Mockup"></p> - -<p>Our JSON API returns some data that looks like this:</p> -<div class="highlight"><pre><code class="text language-text" data-lang="text">[ - {category: &quot;Sporting Goods&quot;, price: &quot;$49.99&quot;, stocked: true, name: &quot;Football&quot;}, - {category: &quot;Sporting Goods&quot;, price: &quot;$9.99&quot;, stocked: true, name: &quot;Baseball&quot;}, - {category: &quot;Sporting Goods&quot;, price: &quot;$29.99&quot;, stocked: false, name: &quot;Basketball&quot;}, - {category: &quot;Electronics&quot;, price: &quot;$99.99&quot;, stocked: true, name: &quot;iPod Touch&quot;}, - {category: &quot;Electronics&quot;, price: &quot;$399.99&quot;, stocked: false, name: &quot;iPhone 5&quot;}, - {category: &quot;Electronics&quot;, price: &quot;$199.99&quot;, stocked: true, name: &quot;Nexus 7&quot;} -]; -</code></pre></div><h2><a class="anchor" name="step-1-break-the-ui-into-a-component-hierarchy"></a>Step 1: break the UI into a component hierarchy <a class="hash-link" href="#step-1-break-the-ui-into-a-component-hierarchy">#</a></h2> -<p>The first thing you&#39;ll want to do is to draw boxes around every component (and subcomponent) in the mock and give them all names. If you&#39;re working with a designer they may have already done this, so go talk to them! Their Photoshop layer names may end up being the names of your React components!</p> - -<p>But how do you know what should be its own component? Just use the same techniques for deciding if you should create a new function or object. One such technique is the <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">single responsibility principle</a>, that is, a component should ideally only do one thing. If it ends up growing it should be decomposed into smaller subcomponents.</p> - -<p>Since you&#39;re often displaying a JSON data model to a user, you&#39;ll find that if your model was built correctly your UI (and therefore your component structure) will map nicely onto it. That&#39;s because user interfaces and data models tend to adhere to the same <em>information architecture</em> which means the work of separating your UI into components is often trivial. Just break it up into components that represent exactly one piece of your data model.</p> - -<p><img src="/react/img/blog/thinking-in-react-components.png" alt="Component diagram"></p> - -<p>You&#39;ll see here that we have five components in our simple app. I&#39;ve italicized the data each component represents.</p> - -<ol> -<li><strong><code>FilterableProductTable</code> (orange):</strong> contains the entirety of the example</li> -<li><strong><code>SearchBar</code> (blue):</strong> receives all <em>user input</em></li> -<li><strong><code>ProductTable</code> (green):</strong> displays and filters the <em>data collection</em> based on <em>user input</em></li> -<li><strong><code>ProductCategoryRow</code> (turquoise):</strong> displays a heading for each <em>category</em></li> -<li><strong><code>ProductRow</code> (red):</strong> displays a row for each <em>product</em></li> -</ol> - -<p>If you look at <code>ProductTable</code> you&#39;ll see that the table header (containing the &quot;Name&quot; and &quot;Price&quot; labels) isn&#39;t its own component. This is a matter of preference and there&#39;s an argument to be made either way. For this example I left it as part of <code>ProductTable</code> because it is part of rendering the <em>data collection</em> which is <code>ProductTable</code>&#39;s responsibility. However if this header grows to be complex (i.e. if we were to add affordances for sorting) it would certainly make sense to make this its own <code>ProductTableHeader</code> component.</p> - -<p>Now that we&#39;ve identified the components in our mock, let&#39;s arrange them into a hierarchy. This is easy. Components that appear within another component in the mock should appear as a child in the hierarchy:</p> - -<ul> -<li><code>FilterableProductTable</code> - -<ul> -<li><code>SearchBar</code></li> -<li><code>ProductTable</code> - -<ul> -<li><code>ProductCategoryRow</code></li> -<li><code>ProductRow</code></li> -</ul></li> -</ul></li> -</ul> -<h2><a class="anchor" name="step-2-build-a-static-version-in-react"></a>Step 2: Build a static version in React <a class="hash-link" href="#step-2-build-a-static-version-in-react">#</a></h2> -<iframe width="100%" height="300" src="http://jsfiddle.net/6wQMG/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe> - -<p>Now that you have your component hierarchy it&#39;s time to start implementing your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It&#39;s easiest to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We&#39;ll see why.</p> - -<p>To build a static version of your app that renders your data model you&#39;ll want to build components that reuse other components and pass data using <em>props</em>. <em>props</em> are a way of passing data from parent to child. If you&#39;re familiar with the concept of <em>state</em>, <strong>don&#39;t use state at all</strong> to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app you don&#39;t need it.</p> - -<p>You can build top-down or bottom-up. That is, you can either start with building the components higher up in the hierarchy (i.e. starting with <code>FilterableProductTable</code>) or with the ones lower in it (<code>ProductRow</code>). In simpler examples it&#39;s usually easier to go top-down and on larger projects it&#39;s easier to go bottom-up and write tests as you build.</p> - -<p>At the end of this step you&#39;ll have a library of reusable components that render your data model. The components will only have <code>render()</code> methods since this is a static version of your app. The component at the top of the hierarchy (<code>FilterableProductTable</code>) will take your data model as a prop. If you make a change to your underlying data model and call <code>renderComponent()</code> again the UI will be updated. It&#39;s easy to see how your UI is updated and where to make changes since there&#39;s nothing complicated going on since React&#39;s <strong>one-way data flow</strong> (also called <em>one-way binding</em>) keeps everything modular, easy to reason about, and fast.</p> - -<p>Simply refer to the <a href="http://facebook.github.io/react/docs/">React docs</a> if you need help executing this step.</p> -<h3><a class="anchor" name="a-brief-interlude-props-vs-state"></a>A brief interlude: props vs state <a class="hash-link" href="#a-brief-interlude-props-vs-state">#</a></h3> -<p>There are two types of &quot;model&quot; data in React: props and state. It&#39;s important to understand the distinction between the two; skim <a href="http://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html">the official React docs</a> if you aren&#39;t sure what the difference is.</p> -<h2><a class="anchor" name="step-3-identify-the-minimal-but-complete-representation-of-ui-state"></a>Step 3: Identify the minimal (but complete) representation of UI state <a class="hash-link" href="#step-3-identify-the-minimal-but-complete-representation-of-ui-state">#</a></h2> -<p>To make your UI interactive you need to be able to trigger changes to your underlying data model. React makes this easy with <strong>state</strong>.</p> - -<p>To build your app correctly you first need to think of the minimal set of mutable state that your app needs. The key here is DRY: <em>Don&#39;t Repeat Yourself</em>. Figure out what the absolute minimal representation of the state of your application needs to be and compute everything else you need on-demand. For example, if you&#39;re building a TODO list, just keep an array of the TODO items around; don&#39;t keep a separate state variable for the count. Instead, when you want to render the TODO count simply take the length of the TODO items array.</p> - -<p>Think of all of the pieces of data in our example application. We have:</p> - -<ul> -<li>The original list of products</li> -<li>The search text the user has entered</li> -<li>The value of the checkbox</li> -<li>The filtered list of products</li> -</ul> - -<p>Let&#39;s go through each one and figure out which one is state. Simply ask three questions about each piece of data:</p> - -<ol> -<li>Is it passed in from a parent via props? If so, it probably isn&#39;t state.</li> -<li>Does it change over time? If not, it probably isn&#39;t state.</li> -<li>Can you compute it based on any other state or props in your component? If so, it&#39;s not state.</li> -</ol> - -<p>The original list of products is passed in as props, so that&#39;s not state. The search text and the checkbox seem to be state since they change over time and can&#39;t be computed from anything. And finally, the filtered list of products isn&#39;t state because it can be computed by combining the original list of products with the search text and value of the checkbox.</p> - -<p>So finally, our state is:</p> - -<ul> -<li>The search text the user has entered</li> -<li>The value of the checkbox</li> -</ul> -<h2><a class="anchor" name="step-4-identify-where-your-state-should-live"></a>Step 4: Identify where your state should live <a class="hash-link" href="#step-4-identify-where-your-state-should-live">#</a></h2> -<iframe width="100%" height="300" src="http://jsfiddle.net/QvHnx/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe> - -<p>OK, so we&#39;ve identified what the minimal set of app state is. Next we need to identify which component mutates, or <em>owns</em>, this state.</p> - -<p>Remember: React is all about one-way data flow down the component hierarchy. It may not be immediately clear which component should own what state. <strong>This is often the most challenging part for newcomers to understand,</strong> so follow these steps to figure it out:</p> - -<p>For each piece of state in your application:</p> - -<ul> -<li>Identify every component that renders something based on that state.</li> -<li>Find a common owner component (a single component above all the components that need the state in the hierarchy).</li> -<li>Either the common owner or another component higher up in the hierarchy should own the state.</li> -<li>If you can&#39;t find a component where it makes sense to own the state, create a new component simply for holding the state and add it somewhere in the hierarchy above the common owner component.</li> -</ul> - -<p>Let&#39;s run through this strategy for our application:</p> - -<ul> -<li><code>ProductTable</code> needs to filter the product list based on state and <code>SearchBar</code> needs to display the search text and checked state.</li> -<li>The common owner component is <code>FilterableProductTable</code>.</li> -<li>It conceptually makes sense for the filter text and checked value to live in <code>FilterableProductTable</code></li> -</ul> - -<p>Cool, so we&#39;ve decided that our state lives in <code>FilterableProductTable</code>. First, add a <code>getInitialState()</code> method to <code>FilterableProductTable</code> that returns <code>{filterText: &#39;&#39;, inStockOnly: false}</code> to reflect the initial state of your application. Then pass <code>filterText</code> and <code>inStockOnly</code> to <code>ProductTable</code> and <code>SearchBar</code> as a prop. Finally, use these props to filter the rows in <code>ProductTable</code> and set the values of the form fields in <code>SearchBar</code>.</p> - -<p>You can start seeing how your application will behave: set <code>filterText</code> to <code>&quot;ball&quot;</code> and refresh your app. You&#39;ll see the data table is updated correctly.</p> -<h2><a class="anchor" name="step-5-add-inverse-data-flow"></a>Step 5: Add inverse data flow <a class="hash-link" href="#step-5-add-inverse-data-flow">#</a></h2> -<iframe width="100%" height="300" src="http://jsfiddle.net/3Vs3Q/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe> - -<p>So far we&#39;ve built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it&#39;s time to support data flowing the other way: the form components deep in the hierarchy need to update the state in <code>FilterableProductTable</code>.</p> - -<p>React makes this data flow explicit to make it easy to understand how your program works, but it does require a little more typing than traditional two-way data binding. React provides an add-on called <code>ReactLink</code> to make this pattern as convenient as two-way binding, but for the purpose of this post we&#39;ll keep everything explicit.</p> - -<p>If you try to type or check the box in the current version of the example you&#39;ll see that React ignores your input. This is intentional, as we&#39;ve set the <code>value</code> prop of the <code>input</code> to always be equal to the <code>state</code> passed in from <code>FilterableProductTable</code>.</p> - -<p>Let&#39;s think about what we want to happen. We want to make sure that whenever the user changes the form we update the state to reflect the user input. Since components should only update their own state, <code>FilterableProductTable</code> will pass a callback to <code>SearchBar</code> that will fire whenever the state should be updated. We can use the <code>onChange</code> event on the inputs to be notified of it. And the callback passed by <code>FilterableProductTable</code> will call <code>setState()</code> and the app will be updated.</p> - -<p>Though this sounds like a lot it&#39;s really just a few lines of code. And it&#39;s really explicit how your data is flowing throughout the app.</p> -<h2><a class="anchor" name="and-thats-it"></a>And that&#39;s it <a class="hash-link" href="#and-thats-it">#</a></h2> -<p>Hopefully this gives you an idea of how to think about building components and applications with React. While it may be a little more typing than you&#39;re used to, remember that code is read far more than it&#39;s written, and it&#39;s extremely easy to read this modular, explicit code. As you start to build large libraries of components you&#39;ll appreciate this explicitness and modularity, and with code reuse your lines of code will start to shrink :)</p> - - 2013-11-05T00:00:00-08:00 - http://facebook.github.io/react/blog/2013/11/05/thinking-in-react.html - http://facebook.github.io/react/blog/2013/11/05/thinking-in-react.html - - diff --git a/img/blog/react-diff-tree.png b/img/blog/react-diff-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3474a02065f07371676336d7d690684f94d171 GIT binary patch literal 40606 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 Rd>R9Nz*L?oe^RuJ_&>sQD%$`6 literal 0 HcmV?d00001 diff --git a/img/blog/resistance-calculator.png b/img/blog/resistance-calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..8e04c5959e45e325955701649d8cd2f41e795e4c GIT binary patch literal 59693 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 literal 0 HcmV?d00001