diff --git a/blog/2013/06/02/jsfiddle-integration.html b/blog/2013/06/02/jsfiddle-integration.html index a7eee36930..e6d1e18f81 100644 --- a/blog/2013/06/02/jsfiddle-integration.html +++ b/blog/2013/06/02/jsfiddle-integration.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/06/05/why-react.html b/blog/2013/06/05/why-react.html index 3d4463c3c1..45197e59a6 100644 --- a/blog/2013/06/05/why-react.html +++ b/blog/2013/06/05/why-react.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/06/12/community-roundup.html b/blog/2013/06/12/community-roundup.html index 52aaaf584d..1a5939f6e5 100644 --- a/blog/2013/06/12/community-roundup.html +++ b/blog/2013/06/12/community-roundup.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/06/19/community-roundup-2.html b/blog/2013/06/19/community-roundup-2.html index a9a7812e87..7377e20677 100644 --- a/blog/2013/06/19/community-roundup-2.html +++ b/blog/2013/06/19/community-roundup-2.html @@ -66,6 +66,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 b1efb967d9..8fd61377a3 100644 --- a/blog/2013/06/21/react-v0-3-3.html +++ b/blog/2013/06/21/react-v0-3-3.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/06/27/community-roundup-3.html b/blog/2013/06/27/community-roundup-3.html index 0fe0d423a9..caff63279e 100644 --- a/blog/2013/06/27/community-roundup-3.html +++ b/blog/2013/06/27/community-roundup-3.html @@ -66,6 +66,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 b420017114..0eaa06875f 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 @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/07/03/community-roundup-4.html b/blog/2013/07/03/community-roundup-4.html index 04266c0804..3dc182456d 100644 --- a/blog/2013/07/03/community-roundup-4.html +++ b/blog/2013/07/03/community-roundup-4.html @@ -66,6 +66,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 fb5696c67c..4fda01fdc7 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 @@ -66,6 +66,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 0a4e17db99..842fcc4007 100644 --- a/blog/2013/07/17/react-v0-4-0.html +++ b/blog/2013/07/17/react-v0-4-0.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/07/23/community-roundup-5.html b/blog/2013/07/23/community-roundup-5.html index 0832fe65cd..a4878c6cdf 100644 --- a/blog/2013/07/23/community-roundup-5.html +++ b/blog/2013/07/23/community-roundup-5.html @@ -66,6 +66,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 2521098067..6ada955226 100644 --- a/blog/2013/07/26/react-v0-4-1.html +++ b/blog/2013/07/26/react-v0-4-1.html @@ -66,6 +66,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 9027bd1dbd..14353a3ce8 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 @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/08/05/community-roundup-6.html b/blog/2013/08/05/community-roundup-6.html index d8855e12c2..4cf9322900 100644 --- a/blog/2013/08/05/community-roundup-6.html +++ b/blog/2013/08/05/community-roundup-6.html @@ -66,6 +66,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 c27bc527b3..ffa9adb6a6 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 @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/08/26/community-roundup-7.html b/blog/2013/08/26/community-roundup-7.html index 71d6f6e90f..683063334f 100644 --- a/blog/2013/08/26/community-roundup-7.html +++ b/blog/2013/08/26/community-roundup-7.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/09/24/community-roundup-8.html b/blog/2013/09/24/community-roundup-8.html index 56143d1a90..65e4a7dfa0 100644 --- a/blog/2013/09/24/community-roundup-8.html +++ b/blog/2013/09/24/community-roundup-8.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/10/03/community-roundup-9.html b/blog/2013/10/03/community-roundup-9.html index 295dd6b8ed..89c36ba669 100644 --- a/blog/2013/10/03/community-roundup-9.html +++ b/blog/2013/10/03/community-roundup-9.html @@ -66,6 +66,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 e63f9c6ae9..b7ceb9668b 100644 --- a/blog/2013/10/16/react-v0.5.0.html +++ b/blog/2013/10/16/react-v0.5.0.html @@ -66,6 +66,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 63abb14ad9..e71fb57ee2 100644 --- a/blog/2013/10/29/react-v0-5-1.html +++ b/blog/2013/10/29/react-v0-5-1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/11/05/thinking-in-react.html b/blog/2013/11/05/thinking-in-react.html index 271584e1b5..60a0cc99af 100644 --- a/blog/2013/11/05/thinking-in-react.html +++ b/blog/2013/11/05/thinking-in-react.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/11/06/community-roundup-10.html b/blog/2013/11/06/community-roundup-10.html index 04ecad5d56..534a4e7013 100644 --- a/blog/2013/11/06/community-roundup-10.html +++ b/blog/2013/11/06/community-roundup-10.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/11/18/community-roundup-11.html b/blog/2013/11/18/community-roundup-11.html index 9c1ecadae0..8459d35626 100644 --- a/blog/2013/11/18/community-roundup-11.html +++ b/blog/2013/11/18/community-roundup-11.html @@ -66,6 +66,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 41a54255ff..b989c4a883 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 @@ -66,6 +66,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 9413a55110..3bcafe68b3 100644 --- a/blog/2013/12/19/react-v0.8.0.html +++ b/blog/2013/12/19/react-v0.8.0.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/12/23/community-roundup-12.html b/blog/2013/12/23/community-roundup-12.html index 30357b643b..e215bf7d59 100644 --- a/blog/2013/12/23/community-roundup-12.html +++ b/blog/2013/12/23/community-roundup-12.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2013/12/30/community-roundup-13.html b/blog/2013/12/30/community-roundup-13.html index 9731cfac48..03f72b5522 100644 --- a/blog/2013/12/30/community-roundup-13.html +++ b/blog/2013/12/30/community-roundup-13.html @@ -66,6 +66,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 fc159cfab5..da87018a34 100644 --- a/blog/2014/01/02/react-chrome-developer-tools.html +++ b/blog/2014/01/02/react-chrome-developer-tools.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/01/06/community-roundup-14.html b/blog/2014/01/06/community-roundup-14.html index 27d0ec1c08..63bc0344af 100644 --- a/blog/2014/01/06/community-roundup-14.html +++ b/blog/2014/01/06/community-roundup-14.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/02/05/community-roundup-15.html b/blog/2014/02/05/community-roundup-15.html index 219af1ebb2..8cb559d755 100644 --- a/blog/2014/02/05/community-roundup-15.html +++ b/blog/2014/02/05/community-roundup-15.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/02/15/community-roundup-16.html b/blog/2014/02/15/community-roundup-16.html index a9db6abe15..5769c9acc9 100644 --- a/blog/2014/02/15/community-roundup-16.html +++ b/blog/2014/02/15/community-roundup-16.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/02/16/react-v0.9-rc1.html b/blog/2014/02/16/react-v0.9-rc1.html index 1ffdf87e38..c5ace352cd 100644 --- a/blog/2014/02/16/react-v0.9-rc1.html +++ b/blog/2014/02/16/react-v0.9-rc1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/02/20/react-v0.9.html b/blog/2014/02/20/react-v0.9.html index 744d6b6f4f..4865674a0d 100644 --- a/blog/2014/02/20/react-v0.9.html +++ b/blog/2014/02/20/react-v0.9.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/02/24/community-roundup-17.html b/blog/2014/02/24/community-roundup-17.html index cd6d7ada72..47516f23cf 100644 --- a/blog/2014/02/24/community-roundup-17.html +++ b/blog/2014/02/24/community-roundup-17.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/03/14/community-roundup-18.html b/blog/2014/03/14/community-roundup-18.html index bdff4abf10..2177873ee7 100644 --- a/blog/2014/03/14/community-roundup-18.html +++ b/blog/2014/03/14/community-roundup-18.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/03/19/react-v0.10-rc1.html b/blog/2014/03/19/react-v0.10-rc1.html index 0a06797007..b8a3ebdd78 100644 --- a/blog/2014/03/19/react-v0.10-rc1.html +++ b/blog/2014/03/19/react-v0.10-rc1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/03/21/react-v0.10.html b/blog/2014/03/21/react-v0.10.html index de2d870456..3737c2f184 100644 --- a/blog/2014/03/21/react-v0.10.html +++ b/blog/2014/03/21/react-v0.10.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/03/28/the-road-to-1.0.html b/blog/2014/03/28/the-road-to-1.0.html index 1ea667e5e0..123540e3c6 100644 --- a/blog/2014/03/28/the-road-to-1.0.html +++ b/blog/2014/03/28/the-road-to-1.0.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/04/04/reactnet.html b/blog/2014/04/04/reactnet.html index 44d52e19b9..35595197f4 100644 --- a/blog/2014/04/04/reactnet.html +++ b/blog/2014/04/04/reactnet.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/05/06/flux.html b/blog/2014/05/06/flux.html index 46946df38d..cf46761b19 100644 --- a/blog/2014/05/06/flux.html +++ b/blog/2014/05/06/flux.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/05/29/one-year-of-open-source-react.html b/blog/2014/05/29/one-year-of-open-source-react.html index fc32e7cc38..ac4706d313 100644 --- a/blog/2014/05/29/one-year-of-open-source-react.html +++ b/blog/2014/05/29/one-year-of-open-source-react.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/06/27/community-roundup-19.html b/blog/2014/06/27/community-roundup-19.html index ef13d25cc3..ba6022d59c 100644 --- a/blog/2014/06/27/community-roundup-19.html +++ b/blog/2014/06/27/community-roundup-19.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/07/13/react-v0.11-rc1.html b/blog/2014/07/13/react-v0.11-rc1.html index e6cfbec001..7ea16dd5ee 100644 --- a/blog/2014/07/13/react-v0.11-rc1.html +++ b/blog/2014/07/13/react-v0.11-rc1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/07/17/react-v0.11.html b/blog/2014/07/17/react-v0.11.html index 58195e013d..132e51a18f 100644 --- a/blog/2014/07/17/react-v0.11.html +++ b/blog/2014/07/17/react-v0.11.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/07/25/react-v0.11.1.html b/blog/2014/07/25/react-v0.11.1.html index 7b4ac78028..457a9f1b51 100644 --- a/blog/2014/07/25/react-v0.11.1.html +++ b/blog/2014/07/25/react-v0.11.1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/07/28/community-roundup-20.html b/blog/2014/07/28/community-roundup-20.html index b144e91b04..d3f2573a68 100644 --- a/blog/2014/07/28/community-roundup-20.html +++ b/blog/2014/07/28/community-roundup-20.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/07/30/flux-actions-and-the-dispatcher.html b/blog/2014/07/30/flux-actions-and-the-dispatcher.html index fc380ee8ab..0a3a0d53d3 100644 --- a/blog/2014/07/30/flux-actions-and-the-dispatcher.html +++ b/blog/2014/07/30/flux-actions-and-the-dispatcher.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/08/03/community-roundup-21.html b/blog/2014/08/03/community-roundup-21.html index 2136a54b4a..bb195accca 100644 --- a/blog/2014/08/03/community-roundup-21.html +++ b/blog/2014/08/03/community-roundup-21.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/09/03/introducing-the-jsx-specification.html b/blog/2014/09/03/introducing-the-jsx-specification.html index 3f20a43bb0..33701988f9 100644 --- a/blog/2014/09/03/introducing-the-jsx-specification.html +++ b/blog/2014/09/03/introducing-the-jsx-specification.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/09/12/community-round-up-22.html b/blog/2014/09/12/community-round-up-22.html index e147ab55a8..de3a56c8f3 100644 --- a/blog/2014/09/12/community-round-up-22.html +++ b/blog/2014/09/12/community-round-up-22.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/09/16/react-v0.11.2.html b/blog/2014/09/16/react-v0.11.2.html index 453417067c..3b471bcd78 100644 --- a/blog/2014/09/16/react-v0.11.2.html +++ b/blog/2014/09/16/react-v0.11.2.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/09/24/testing-flux-applications.html b/blog/2014/09/24/testing-flux-applications.html index a99fceee61..d4c0439eae 100644 --- a/blog/2014/09/24/testing-flux-applications.html +++ b/blog/2014/09/24/testing-flux-applications.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/10/14/introducing-react-elements.html b/blog/2014/10/14/introducing-react-elements.html index 1a5d091957..fa301eef03 100644 --- a/blog/2014/10/14/introducing-react-elements.html +++ b/blog/2014/10/14/introducing-react-elements.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/10/16/react-v0.12-rc1.html b/blog/2014/10/16/react-v0.12-rc1.html index 24febc72b2..d5ba83a268 100644 --- a/blog/2014/10/16/react-v0.12-rc1.html +++ b/blog/2014/10/16/react-v0.12-rc1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/10/17/community-roundup-23.html b/blog/2014/10/17/community-roundup-23.html index 72a4106a4f..23e6d2315c 100644 --- a/blog/2014/10/17/community-roundup-23.html +++ b/blog/2014/10/17/community-roundup-23.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/10/27/react-js-conf.html b/blog/2014/10/27/react-js-conf.html index 6c9daaa593..595012ab4f 100644 --- a/blog/2014/10/27/react-js-conf.html +++ b/blog/2014/10/27/react-js-conf.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/10/28/react-v0.12.html b/blog/2014/10/28/react-v0.12.html index ab3aba4da7..dbb8dd2366 100644 --- a/blog/2014/10/28/react-v0.12.html +++ b/blog/2014/10/28/react-v0.12.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/11/24/react-js-conf-updates.html b/blog/2014/11/24/react-js-conf-updates.html index 7ff1584962..39cd2e75e9 100644 --- a/blog/2014/11/24/react-js-conf-updates.html +++ b/blog/2014/11/24/react-js-conf-updates.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/11/25/community-roundup-24.html b/blog/2014/11/25/community-roundup-24.html index e11570b397..8210afc424 100644 --- a/blog/2014/11/25/community-roundup-24.html +++ b/blog/2014/11/25/community-roundup-24.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/12/18/react-v0.12.2.html b/blog/2014/12/18/react-v0.12.2.html index 2940e4cecd..eda4771c9b 100644 --- a/blog/2014/12/18/react-v0.12.2.html +++ b/blog/2014/12/18/react-v0.12.2.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2014/12/19/react-js-conf-diversity-scholarship.html b/blog/2014/12/19/react-js-conf-diversity-scholarship.html index dc25e14277..21be098045 100644 --- a/blog/2014/12/19/react-js-conf-diversity-scholarship.html +++ b/blog/2014/12/19/react-js-conf-diversity-scholarship.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/01/27/react-v0.13.0-beta-1.html b/blog/2015/01/27/react-v0.13.0-beta-1.html index d446e0c6f9..6b8dbc3ca2 100644 --- a/blog/2015/01/27/react-v0.13.0-beta-1.html +++ b/blog/2015/01/27/react-v0.13.0-beta-1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/02/18/react-conf-roundup-2015.html b/blog/2015/02/18/react-conf-roundup-2015.html index 12c9c5aea5..43f4aba187 100644 --- a/blog/2015/02/18/react-conf-roundup-2015.html +++ b/blog/2015/02/18/react-conf-roundup-2015.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/02/20/introducing-relay-and-graphql.html b/blog/2015/02/20/introducing-relay-and-graphql.html index b8096ba433..884b6d4dd5 100644 --- a/blog/2015/02/20/introducing-relay-and-graphql.html +++ b/blog/2015/02/20/introducing-relay-and-graphql.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/02/24/react-v0.13-rc1.html b/blog/2015/02/24/react-v0.13-rc1.html index 3787132556..98d56d25d0 100644 --- a/blog/2015/02/24/react-v0.13-rc1.html +++ b/blog/2015/02/24/react-v0.13-rc1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/02/24/streamlining-react-elements.html b/blog/2015/02/24/streamlining-react-elements.html index 18e968baa3..82b08feae9 100644 --- a/blog/2015/02/24/streamlining-react-elements.html +++ b/blog/2015/02/24/streamlining-react-elements.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/03/react-v0.13-rc2.html b/blog/2015/03/03/react-v0.13-rc2.html index 8144848c22..e40ec7d5e4 100644 --- a/blog/2015/03/03/react-v0.13-rc2.html +++ b/blog/2015/03/03/react-v0.13-rc2.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/04/community-roundup-25.html b/blog/2015/03/04/community-roundup-25.html index 1fd3a26b76..86729fcab9 100644 --- a/blog/2015/03/04/community-roundup-25.html +++ b/blog/2015/03/04/community-roundup-25.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/10/react-v0.13.html b/blog/2015/03/10/react-v0.13.html index f669022cf5..ce08805349 100644 --- a/blog/2015/03/10/react-v0.13.html +++ b/blog/2015/03/10/react-v0.13.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/16/react-v0.13.1.html b/blog/2015/03/16/react-v0.13.1.html index 59bda2a88d..981dc03879 100644 --- a/blog/2015/03/16/react-v0.13.1.html +++ b/blog/2015/03/16/react-v0.13.1.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/19/building-the-facebook-news-feed-with-relay.html b/blog/2015/03/19/building-the-facebook-news-feed-with-relay.html index ef6f04011c..4083384195 100644 --- a/blog/2015/03/19/building-the-facebook-news-feed-with-relay.html +++ b/blog/2015/03/19/building-the-facebook-news-feed-with-relay.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/26/introducing-react-native.html b/blog/2015/03/26/introducing-react-native.html index 66c3de1575..210cb0011a 100644 --- a/blog/2015/03/26/introducing-react-native.html +++ b/blog/2015/03/26/introducing-react-native.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/03/30/community-roundup-26.html b/blog/2015/03/30/community-roundup-26.html index a6f4c9e00f..0df43736e4 100644 --- a/blog/2015/03/30/community-roundup-26.html +++ b/blog/2015/03/30/community-roundup-26.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/04/17/react-native-v0.4.html b/blog/2015/04/17/react-native-v0.4.html index 54a2b63f14..98d26c56e8 100644 --- a/blog/2015/04/17/react-native-v0.4.html +++ b/blog/2015/04/17/react-native-v0.4.html @@ -66,6 +66,8 @@

Recent posts

diff --git a/blog/2015/04/18/react-v0.13.2.html b/blog/2015/04/18/react-v0.13.2.html new file mode 100644 index 0000000000..d0c7d26b45 --- /dev/null +++ b/blog/2015/04/18/react-v0.13.2.html @@ -0,0 +1,185 @@ + + + + + + + React v0.13.2 | React + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+

React v0.13.2

+

April 18, 2015 by Paul O’Shannessy

+ +
+ +
+

Yesterday Vjeux and team shipped React Native v0.4. Those of us working on the web team couldn't just be shown up like that so we're shipping v0.13.2 today as well! This is a bug fix release to address a few things while we continue to work towards v0.14.

+ +

The release is now available for download:

+ + + +

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

+ +
+

Changelog #

React Core #

New Features #

+
    +
  • Added strokeDashoffset, flexPositive, flexNegative to the list of unitless CSS properties
  • +
  • Added support for more DOM properties: + +
      +
    • scoped - for <style> elements
    • +
    • high, low, optimum - for <meter> elements
    • +
    • unselectable - IE-specific property to prevent user selection
    • +
  • +
+

Bug Fixes #

+
    +
  • Fixed a case where re-rendering after rendering null didn't properly pass context
  • +
  • Fixed a case where re-rendering after rendering with style={null} didn't properly update style
  • +
  • Update uglify dependency to prevent a bug in IE8
  • +
  • Improved warnings
  • +
+

React with Add-Ons #

Bug Fixes #

+
    +
  • Immutabilty Helpers: Ensure it supports hasOwnProperty as an object key
  • +
+

React Tools #

+
    +
  • Improve documentation for new options
  • +
+ +
+ +
+
+
+ + + +
+
+ + + + diff --git a/blog/all.html b/blog/all.html index c251088dc4..fa1c6a3ef2 100644 --- a/blog/all.html +++ b/blog/all.html @@ -64,6 +64,8 @@

All Posts

+

React v0.13.2 on April 18, 2015 by Paul O’Shannessy

+

React Native v0.4 on April 17, 2015 by Vjeux

Community Round-up #26 on March 30, 2015 by Vjeux

diff --git a/blog/index.html b/blog/index.html index 2b36637629..df34fb0957 100644 --- a/blog/index.html +++ b/blog/index.html @@ -66,6 +66,8 @@

Recent posts

@@ -93,6 +93,59 @@
+
+

React v0.13.2

+

April 18, 2015 by Paul O’Shannessy

+
+
+

Yesterday Vjeux and team shipped React Native v0.4. Those of us working on the web team couldn't just be shown up like that so we're shipping v0.13.2 today as well! This is a bug fix release to address a few things while we continue to work towards v0.14.

+ +

The release is now available for download:

+ + + +

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

+ +
+

Changelog #

React Core #

New Features #

+
    +
  • Added strokeDashoffset, flexPositive, flexNegative to the list of unitless CSS properties
  • +
  • Added support for more DOM properties: + +
      +
    • scoped - for <style> elements
    • +
    • high, low, optimum - for <meter> elements
    • +
    • unselectable - IE-specific property to prevent user selection
    • +
  • +
+

Bug Fixes #

+
    +
  • Fixed a case where re-rendering after rendering null didn't properly pass context
  • +
  • Fixed a case where re-rendering after rendering with style={null} didn't properly update style
  • +
  • Update uglify dependency to prevent a bug in IE8
  • +
  • Improved warnings
  • +
+

React with Add-Ons #

Bug Fixes #

+
    +
  • Immutabilty Helpers: Ensure it supports hasOwnProperty as an object key
  • +
+

React Tools #

+
    +
  • Improve documentation for new options
  • +
+ +
+
+

React Native v0.4

April 17, 2015 by Vjeux

@@ -398,50 +451,6 @@
-
-

React v0.13.1

-

March 16, 2015 by Paul O’Shannessy

-
-
-

It's been less than a week since we shipped v0.13.0 but it's time to do another quick release. We just released v0.13.1 which contains bugfixes for a number of small issues.

- -

Thanks all of you who have been upgrading your applications and taking the time to report issues. And a huge thank you to those of you who submitted pull requests for the issues you found! 2 of the 6 fixes that went out today came from people who aren't on the core team!

- -

The release is now available for download:

- - - -

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

- -
-

Changelog #

React Core #

Bug Fixes #

- -

React with Add-Ons #

Bug Fixes #

- -

React Tools #

Bug Fixes #

- - -
-
- @@ -93,6 +93,118 @@
+
+

Community Round-up #15

+

February 5, 2014 by Jonas Gebhardt

+
+
+

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

+ +

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

+

"React: Another Level of Indirection" #

+

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

+ +
+

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

+ +

Read the full post...

+
+

Reagent: Minimalistic React for ClojureScript #

+

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

+ +
+

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

+ +

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

+ +

Check it out on Github...

+
+

Functional DOM programming #

+

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

+ +
+

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

+ +

Read the full post...

+
+ +

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

+ + +

Kioo: Separating markup and logic #

+

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

+ +

A basic example from github:

+
<!DOCTYPE html>
+<html lang="en">
+  <body>
+    <header>
+      <h1>Header placeholder</h1>
+      <ul id="navigation">
+        <li class="nav-item"><a href="#">Placeholder</a></li>
+      </ul>
+    </header>
+    <div class="content">place holder</div>
+  </body>
+</html>
+
...
+
+(defn my-nav-item [[caption func]]
+  (kioo/component "main.html" [:.nav-item]
+    {[:a] (do-> (content caption)
+                (set-attr :onClick func))}))
+
+(defn my-header [heading nav-elms]
+  (kioo/component "main.html" [:header]
+    {[:h1] (content heading)
+     [:ul] (content (map my-nav-item nav-elms))}))
+
+(defn my-page [data]
+  (kioo/component "main.html"
+    {[:header] (substitute (my-header (:heading data)
+                                      (:navigation data)))
+     [:.content] (content (:content data))}))
+
+(def app-state (atom {:heading    "main"
+                      :content    "Hello World"
+                      :navigation [["home" #(js/alert %)]
+                                   ["next" #(js/alert %)]]}))
+
+(om/root app-state my-page (.-body js/document))
+

Om #

+

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

+ +
+

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

+ +

Read the full interview...

+
+

A slice of React, ClojureScript and Om #

+

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

+ +
+

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

+ +

Read the full post...

+
+ +

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

+ +

[Demo] [Code]

+

Time Travel: Implementing undo in Om #

+

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

+

A Step-by-Step Om Walkthrough #

+

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

+

Omkara #

+

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

+

Om Experience Report #

+

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

+

Not-so-random Tweet #

+
+ +
+
+

Community Round-up #14

January 6, 2014 by Vjeux

@@ -367,56 +479,6 @@ componentDidUpdate: function() {
-
-

React v0.8

-

December 19, 2013 by Paul O'Shannessy

-
-
-

I'll start by answering the obvious question:

- -
-

What happened to 0.6 and 0.7?

-
- -

It's become increasingly obvious since our launch in May that people want to use React on the server. With the server-side rendering abilities, that's a perfect fit. However using the same copy of React on the server and then packaging it up for the client is surprisingly a harder problem. People have been using our react-tools module which includes React, but when browserifying that ends up packaging all of esprima and some other dependencies that aren't needed on the client. So we wanted to make this whole experience better.

- -

We talked with Jeff Barczewski who was the owner of the react module on npm. He was kind enough to transition ownership to us and release his package under a different name: autoflow. I encourage you to check it out if you're writing a lot of asynchronous code. In order to not break all of react's current users of 0.7.x, we decided to bump our version to 0.8 and skip the issue entirely. We're also including a warning if you use our react module like you would use the previous package.

- -

In order to make the transition to 0.8 for our current users as painless as possible, we decided to make 0.8 primarily a bug fix release on top of 0.5. No public APIs were changed (even if they were already marked as deprecated). We haven't added any of the new features we have in master, though we did take the opportunity to pull in some improvements to internals.

- -

We hope that by releasing react on npm, we will enable a new set of uses that have been otherwise difficult. All feedback is welcome!

-

Changelog #

React #

- -

React with Addons #

- -

react-tools #

- -

JSXTransformer #

- - -
-
- @@ -93,6 +93,56 @@
+
+

React v0.8

+

December 19, 2013 by Paul O'Shannessy

+
+
+

I'll start by answering the obvious question:

+ +
+

What happened to 0.6 and 0.7?

+
+ +

It's become increasingly obvious since our launch in May that people want to use React on the server. With the server-side rendering abilities, that's a perfect fit. However using the same copy of React on the server and then packaging it up for the client is surprisingly a harder problem. People have been using our react-tools module which includes React, but when browserifying that ends up packaging all of esprima and some other dependencies that aren't needed on the client. So we wanted to make this whole experience better.

+ +

We talked with Jeff Barczewski who was the owner of the react module on npm. He was kind enough to transition ownership to us and release his package under a different name: autoflow. I encourage you to check it out if you're writing a lot of asynchronous code. In order to not break all of react's current users of 0.7.x, we decided to bump our version to 0.8 and skip the issue entirely. We're also including a warning if you use our react module like you would use the previous package.

+ +

In order to make the transition to 0.8 for our current users as painless as possible, we decided to make 0.8 primarily a bug fix release on top of 0.5. No public APIs were changed (even if they were already marked as deprecated). We haven't added any of the new features we have in master, though we did take the opportunity to pull in some improvements to internals.

+ +

We hope that by releasing react on npm, we will enable a new set of uses that have been otherwise difficult. All feedback is welcome!

+

Changelog #

React #

+
    +
  • Added support for more attributes: + +
      +
    • rows & cols for <textarea>
    • +
    • defer & async for <script>
    • +
    • loop for <audio> & <video>
    • +
    • autoCorrect for form fields (a non-standard attribute only supported by mobile WebKit)
    • +
  • +
  • Improved error messages
  • +
  • Fixed Selection events in IE11
  • +
  • Added onContextMenu events
  • +
+

React with Addons #

+
    +
  • Fixed bugs with TransitionGroup when children were undefined
  • +
  • Added support for onTransition
  • +
+

react-tools #

+
    +
  • Upgraded jstransform and esprima-fb
  • +
+

JSXTransformer #

+
    +
  • Added support for use in IE8
  • +
  • Upgraded browserify, which reduced file size by ~65KB (16KB gzipped)
  • +
+ +
+
+

React v0.5.2, v0.4.2

December 18, 2013 by Paul O'Shannessy

@@ -455,27 +505,6 @@ Is this some sort of template language? Specifically no. This might have been th
-
-

React v0.5.1

-

October 29, 2013 by Paul O'Shannessy

-
-
-

This release focuses on fixing some small bugs that have been uncovered over the past two weeks. I would like to thank everybody involved, specifically members of the community who fixed half of the issues found. Thanks to Ben Alpert, Andrey Popp, and Laurence Rowe for their contributions!

-

Changelog #

React #

- -

React with Addons #

- - -
-
- @@ -93,6 +93,27 @@
+
+

React v0.5.1

+

October 29, 2013 by Paul O'Shannessy

+
+
+

This release focuses on fixing some small bugs that have been uncovered over the past two weeks. I would like to thank everybody involved, specifically members of the community who fixed half of the issues found. Thanks to Ben Alpert, Andrey Popp, and Laurence Rowe for their contributions!

+

Changelog #

React #

+
    +
  • Fixed bug with <input type="range"> and selection events.
  • +
  • Fixed bug with selection and focus.
  • +
  • Made it possible to unmount components from the document root.
  • +
  • Fixed bug for disabled attribute handling on non-<input> elements.
  • +
+

React with Addons #

+
    +
  • Fixed bug with transition and animation event detection.
  • +
+ +
+
+

React v0.5

October 16, 2013 by Paul O'Shannessy

@@ -373,48 +394,6 @@
-
-

Use React and JSX in Python Applications

-

August 19, 2013 by Kunal Mehta

-
-
-

Today we're happy to announce the initial release of PyReact, which makes it easier to use React and JSX in your Python applications. It's designed to provide an API to transform your JSX files into JavaScript, as well as provide access to the latest React source files.

-

Usage #

-

Transform your JSX files via the provided jsx module:

-
from react import jsx
-
-# For multiple paths, use the JSXTransformer class.
-transformer = jsx.JSXTransformer()
-for jsx_path, js_path in my_paths:
-    transformer.transform(jsx_path, js_path)
-
-# For a single file, you can use a shortcut method.
-jsx.transform('path/to/input/file.jsx', 'path/to/output/file.js')
-
-

For full paths to React files, use the source module:

-
from react import source
-
-# path_for raises IOError if the file doesn't exist.
-react_js = source.path_for('react.min.js')
-

Django #

-

PyReact includes a JSX compiler for django-pipeline. Add it to your project's pipeline settings like this:

-
PIPELINE_COMPILERS = (
-  'react.utils.pipeline.JSXCompiler',
-)
-

Installation #

-

PyReact is hosted on PyPI, and can be installed with pip:

-
$ pip install PyReact
-
-

Alternatively, add it into your requirements file:

-
PyReact==0.1.1
-
-

Dependencies: PyReact uses PyExecJS to execute the bundled React code, which requires that a JS runtime environment is installed on your machine. We don't explicitly set a dependency on a runtime environment; Mac OS X comes bundled with one. If you're on a different platform, we recommend PyV8.

- -

For the initial release, we've only tested on Python 2.7. Look out for support for Python 3 in the future, and if you see anything that can be improved, we welcome your contributions!

- -
-
- @@ -93,6 +93,48 @@
+
+

Use React and JSX in Python Applications

+

August 19, 2013 by Kunal Mehta

+
+
+

Today we're happy to announce the initial release of PyReact, which makes it easier to use React and JSX in your Python applications. It's designed to provide an API to transform your JSX files into JavaScript, as well as provide access to the latest React source files.

+

Usage #

+

Transform your JSX files via the provided jsx module:

+
from react import jsx
+
+# For multiple paths, use the JSXTransformer class.
+transformer = jsx.JSXTransformer()
+for jsx_path, js_path in my_paths:
+    transformer.transform(jsx_path, js_path)
+
+# For a single file, you can use a shortcut method.
+jsx.transform('path/to/input/file.jsx', 'path/to/output/file.js')
+
+

For full paths to React files, use the source module:

+
from react import source
+
+# path_for raises IOError if the file doesn't exist.
+react_js = source.path_for('react.min.js')
+

Django #

+

PyReact includes a JSX compiler for django-pipeline. Add it to your project's pipeline settings like this:

+
PIPELINE_COMPILERS = (
+  'react.utils.pipeline.JSXCompiler',
+)
+

Installation #

+

PyReact is hosted on PyPI, and can be installed with pip:

+
$ pip install PyReact
+
+

Alternatively, add it into your requirements file:

+
PyReact==0.1.1
+
+

Dependencies: PyReact uses PyExecJS to execute the bundled React code, which requires that a JS runtime environment is installed on your machine. We don't explicitly set a dependency on a runtime environment; Mac OS X comes bundled with one. If you're on a different platform, we recommend PyV8.

+ +

For the initial release, we've only tested on Python 2.7. Look out for support for Python 3 in the future, and if you see anything that can be improved, we welcome your contributions!

+ +
+
+

Community Round-up #6

August 5, 2013 by Vjeux

@@ -325,47 +367,6 @@
-
-

React v0.4.0

-

July 17, 2013 by Paul O'Shannessy

-
-
-

Over the past 2 months we've been taking feedback and working hard to make React even better. We fixed some bugs, made some under-the-hood improvements, and added several features that we think will improve the experience developing with React. Today we're proud to announce the availability of React v0.4!

- -

This release could not have happened without the support of our growing community. Since launch day, the community has contributed blog posts, questions to the Google Group, and issues and pull requests on GitHub. We've had contributions ranging from documentation improvements to major changes to React's rendering. We've seen people integrate React into the tools they're using and the products they're building, and we're all very excited to see what our budding community builds next!

- -

React v0.4 has some big changes. We've also restructured the documentation to better communicate how to use React. We've summarized the changes below and linked to documentation where we think it will be especially useful.

- -

When you're ready, go download it!

-

React #

- -

JSX #

- -

react-tools #

- - -
-
- @@ -93,6 +93,47 @@
+
+

React v0.4.0

+

July 17, 2013 by Paul O'Shannessy

+
+
+

Over the past 2 months we've been taking feedback and working hard to make React even better. We fixed some bugs, made some under-the-hood improvements, and added several features that we think will improve the experience developing with React. Today we're proud to announce the availability of React v0.4!

+ +

This release could not have happened without the support of our growing community. Since launch day, the community has contributed blog posts, questions to the Google Group, and issues and pull requests on GitHub. We've had contributions ranging from documentation improvements to major changes to React's rendering. We've seen people integrate React into the tools they're using and the products they're building, and we're all very excited to see what our budding community builds next!

+ +

React v0.4 has some big changes. We've also restructured the documentation to better communicate how to use React. We've summarized the changes below and linked to documentation where we think it will be especially useful.

+ +

When you're ready, go download it!

+

React #

+
    +
  • Switch from using id attribute to data-reactid to track DOM nodes. This allows you to integrate with other JS and CSS libraries more easily.
  • +
  • Support for more DOM elements and attributes (e.g., <canvas>)
  • +
  • Improved server-side rendering APIs. React.renderComponentToString(<component>, callback) allows you to use React on the server and generate markup which can be sent down to the browser.
  • +
  • prop improvements: validation and default values. Read our blog post for details...
  • +
  • Support for the key prop, which allows for finer control over reconciliation. Read the docs for details...
  • +
  • Removed React.autoBind. Read our blog post for details...
  • +
  • Improvements to forms. We've written wrappers around <input>, <textarea>, <option>, and <select> in order to standardize many inconsistencies in browser implementations. This includes support for defaultValue, and improved implementation of the onChange event, and circuit completion. Read the docs for details...
  • +
  • We've implemented an improved synthetic event system that conforms to the W3C spec.
  • +
  • Updates to your component are batched now, which may result in a significantly faster re-render of components. this.setState now takes an optional callback as its second parameter. If you were using onClick={this.setState.bind(this, state)} previously, you'll want to make sure you add a third parameter so that the event is not treated as the callback.
  • +
+

JSX #

+
    +
  • Support for comment nodes <div>{/* this is a comment and won't be rendered */}</div>
  • +
  • Children are now transformed directly into arguments instead of being wrapped in an array +E.g. <div><Component1/><Component2/></div> is transformed into React.DOM.div(null, Component1(null), Component2(null)). +Previously this would be transformed into React.DOM.div(null, [Component1(null), Component2(null)]). +If you were using React without JSX previously, your code should still work.
  • +
+

react-tools #

+
    +
  • Fixed a number of bugs when transforming directories
  • +
  • No longer re-write require()s to be relative unless specified
  • +
+ +
+
+

New in React v0.4: Prop Validation and Default Values

July 11, 2013 by Paul O'Shannessy

@@ -336,30 +377,6 @@
-
-

React v0.3.3

-

June 21, 2013 by Paul O'Shannessy

-
-
-

We have a ton of great stuff coming in v0.4, but in the meantime we're releasing v0.3.3. This release addresses some small issues people were having and simplifies our tools to make them easier to use.

-

react-tools #

- -

React #

- -

JSXTransformer #

- - -
-
- @@ -93,6 +93,30 @@
+
+

React v0.3.3

+

June 21, 2013 by Paul O'Shannessy

+
+
+

We have a ton of great stuff coming in v0.4, but in the meantime we're releasing v0.3.3. This release addresses some small issues people were having and simplifies our tools to make them easier to use.

+

react-tools #

+
    +
  • Upgrade Commoner so require statements are no longer relativized when passing through the transformer. This was a feature needed when building React, but doesn't translate well for other consumers of bin/jsx.
  • +
  • Upgraded our dependencies on Commoner and Recast so they use a different directory for their cache.
  • +
  • Freeze our esprima dependency.
  • +
+

React #

+
    +
  • Allow reusing the same DOM node to render different components. e.g. React.renderComponent(<div/>, domNode); React.renderComponent(<span/>, domNode); will work now.
  • +
+

JSXTransformer #

+
    +
  • Improved the in-browser transformer so that transformed scripts will execute in the expected scope. The allows components to be defined and used from separate files.
  • +
+ +
+
+

Community Round-up #2

June 19, 2013 by Vjeux

diff --git a/blog/page2/index.html b/blog/page2/index.html index c5dfa7d0cb..0d7eda874a 100644 --- a/blog/page2/index.html +++ b/blog/page2/index.html @@ -66,6 +66,8 @@

Recent posts

@@ -93,6 +93,50 @@
+
+

React v0.13.1

+

March 16, 2015 by Paul O’Shannessy

+
+
+

It's been less than a week since we shipped v0.13.0 but it's time to do another quick release. We just released v0.13.1 which contains bugfixes for a number of small issues.

+ +

Thanks all of you who have been upgrading your applications and taking the time to report issues. And a huge thank you to those of you who submitted pull requests for the issues you found! 2 of the 6 fixes that went out today came from people who aren't on the core team!

+ +

The release is now available for download:

+ + + +

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

+ +
+

Changelog #

React Core #

Bug Fixes #

+
    +
  • Don't throw when rendering empty <select> elements
  • +
  • Ensure updating style works when transitioning from null
  • +
+

React with Add-Ons #

Bug Fixes #

+
    +
  • TestUtils: Don't warn about getDOMNode for ES6 classes
  • +
  • TestUtils: Ensure wrapped full page components (<html>, <head>, <body>) are treated as DOM components
  • +
  • Perf: Stop double-counting DOM components
  • +
+

React Tools #

Bug Fixes #

+
    +
  • Fix option parsing for --non-strict-es6module
  • +
+ +
+
+

React v0.13

March 10, 2015 by Ben Alpert

@@ -367,162 +411,6 @@ Minified build for production: -

Streamlining React Elements

-

February 24, 2015 by Sebastian Markbåge

-
-
-

React v0.13 is right around the corner and so we wanted to discuss some upcoming changes to ReactElement. In particular, we added several warnings to some esoteric use cases of ReactElement. There are no runtime behavior changes for ReactElement - we're adding these warnings in the hope that we can change some behavior in v0.14 if the changes are valuable to the community.

- -

If you use React in an idiomatic way, chances are, you’ll never see any of these warnings. In that case, you can skip this blog post. You can just enjoy the benefits! These changes will unlock simplified semantics, better error messages, stack traces and compiler optimizations!

-

Immutable Props #

-

In React 0.12, the props object was mutable. It allows you to do patterns like this:

-
var element = <Foo bar={false} />;
-if (shouldUseFoo) {
-  element.props.foo = 10;
-  element.props.bar = true;
-}
-
-

The problem is that we don’t have a convenient way to tell when you’re done mutating.

-

Problem: Mutating Props You Don’t Own #

-

If you mutate something, you destroy the original value. Therefore, there is nothing to diff against. Imagine something like this:

-
var element = this.props.child;
-element.props.count = this.state.count;
-return element;
-
-

You take a ReactElement through props.child and mutate its property before rendering it. If this component's state updates, this render function won't actually get a new ReactElement in props.child. It will be the same one. You're mutating the same props.

- -

You could imagine that this would work. However, this disables the ability for any component to use shouldComponentUpdate. It looks like the component never changed because the previous value is always the same as the next one. Since the DOM layer does diffing, this pattern doesn't even work in this case. The change will never propagate down to the DOM except the first time.

- -

Additionally, if this element is reused in other places or used to switch back and forth between two modes, then you have all kinds of weird race conditions.

- -

It has always been broken to mutate the props of something passed into you. The problem is that we can’t warn you about this special case if you accidentally do this.

-

Problem: Too Late Validation #

-

In React 0.12, we do PropType validation very deep inside React during mounting. This means that by the time you get an error, the debugger stack is long gone. This makes it difficult to find complex issues during debugging. We have to do this since it is fairly common for extra props to be added between the call to React.createElement and the mount time. So the type is incomplete until then.

- -

The static analysis in Flow is also impaired by this. There is no convenient place in the code where Flow can determine that the props are finalized.

-

Solution: Immutable Props #

-

Therefore, we would like to be able to freeze the element.props object so that it is immediately immutable at the JSX callsite (or createElement). In React 0.13 we will start warning you if you mutate element.props after this point.

- -

You can generally refactor these pattern to simply use two different JSX calls:

-
if (shouldUseFoo) {
-  return <Foo foo={10} bar={true} />;
-} else {
-  return <Foo bar={false} />;
-}
-
-

However, if you really need to dynamically build up your props you can just use a temporary object and spread it into JSX:

-
var props = { bar: false };
-if (shouldUseFoo) {
-  props.foo = 10;
-  props.bar = true;
-}
-return <Foo {...props} />;
-
-

It is still OK to do deep mutations of objects. E.g:

-
return <Foo nestedObject={this.state.myModel} />;
-
-

In this case it's still ok to mutate the myModel object in state. We recommend that you use fully immutable models. E.g. by using immutable-js. However, we realize that mutable models are still convenient in many cases. Therefore we're only considering shallow freezing the props object that belongs to the ReactElement itself. Not nested objects.

-

Solution: Early PropType Warnings #

-

We will also start warning you for PropTypes at the JSX or createElement callsite. This will help debugging as you’ll have the stack trace right there. Similarly, Flow also validates PropTypes at this callsite.

- -

Note: There are valid patterns that clones a ReactElement and adds additional props to it. In that case these additional props needs to be optional.

-
var element1 = <Foo />; // extra prop is optional
-var element2 = React.addons.cloneWithProps(element1, { extra: 'prop' });
-

Owner #

-

In React each child has both a "parent" and an “owner”. The owner is the component that created a ReactElement. I.e. the render method which contains the JSX or createElement callsite.

-
class Foo {
-  render() {
-    return <div><span /></div>;
-  }
-}
-
-

In this example, the owner of the span is Foo but the parent is the div.

- -

There is also an undocumented feature called "context" that also relies on the concept of an “owner” to pass hidden props down the tree.

-

Problem: The Semantics are Opaque and Confusing #

-

The problem is that these are hidden artifacts attached to the ReactElement. In fact, you probably didn’t even know about it. It silently changes semantics. Take this for example:

-
var foo = <input className="foo" />;
-class Component {
-  render() {
-    return bar ? <input className="bar" /> : foo;
-  }
-}
-
-

These two inputs have different owners, therefore React will not keep its state when the conditional switches. There is nothing in the code to indicate that. Similarly, if you use React.addons.cloneWithProps, the owner changes.

-

Problem: Timing Matters #

-

The owner is tracked by the currently executing stack. This means that the semantics of a ReactElement varies depending on when it is executed. Take this example:

-
class A {
-  render() {
-    return <B renderer={text => <span>{text}</span>} />;
-  }
-}
-class B {
-  render() {
-    return this.props.renderer('foo');
-  }
-}
-
-

The owner of the span is actually B, not A because of the timing of the callback. This all adds complexity and suffers from similar problems as mutation.

-

Problem: It Couples JSX to React #

-

Have you wondered why JSX depends on React? Couldn’t the transpiler have that built-in to its runtime? The reason you need to have React.createElement in scope is because we depend on internal state of React to capture the current "owner". Without this, you wouldn’t need to have React in scope.

-

Solution: Make Context Parent-Based Instead of Owner-Based #

-

The first thing we’re doing is warning you if you’re using the "owner" feature in a way that relies on it propagating through owners. Instead, we’re planning on propagating it through parents to its children. In almost all cases, this shouldn’t matter. In fact, parent-based contexts is simply a superset.

-

Solution: Remove the Semantic Implications of Owner #

-

It turns out that there are very few cases where owners are actually important part of state-semantics. As a precaution, we’ll warn you if it turns out that the owner is important to determine state. In almost every case this shouldn’t matter. Unless you’re doing some weird optimizations, you shouldn’t see this warning.

-

Pending: Change the refs Semantics #

-

Refs are still based on "owner". We haven’t fully solved this special case just yet.

- -

In 0.13 we introduced a new callback-refs API that doesn’t suffer from these problems but we’ll keep on a nice declarative alternative to the current semantics for refs. As always, we won’t deprecate something until we’re sure that you’ll have a nice upgrade path.

-

Keyed Objects as Maps #

-

In React 0.12, and earlier, you could use keyed objects to provide an external key to an element or a set. This pattern isn’t actually widely used. It shouldn’t be an issue for most of you.

-
<div>{ {a: <span />, b: <span />} }</div>
-

Problem: Relies on Enumeration Order #

-

The problem with this pattern is that it relies on enumeration order of objects. This is technically unspecified, even though implementations now agree to use insertion order. Except for the special case when numeric keys are used.

-

Problem: Using Objects as Maps is Bad #

-

It is generally accepted that using objects as maps screw up type systems, VM optimizations, compilers etc. It is much better to use a dedicated data structure like ES6 Maps.

- -

More importantly, this can have important security implications. For example this has a potential security problem:

-
var children = {};
-items.forEach(item => children[item.title] = <span />);
-return <div>{children}</div>;
-
-

Imagine if item.title === '__proto__' for example.

-

Problem: Can’t be Differentiated from Arbitrary Objects #

-

Since these objects can have any keys with almost any value, we can’t differentiate them from a mistake. If you put some random object, we will try our best to traverse it and render it, instead of failing with a helpful warning. In fact, this is one of the few places where you can accidentally get an infinite loop in React.

- -

To differentiate ReactElements from one of these objects, we have to tag them with _isReactElement. This is another issue preventing us from inlining ReactElements as simple object literals.

-

Solution: Just use an Array and key={…} #

-

Most of the time you can just use an array with keyed ReactElements.

-
var children = items.map(item => <span key={item.title} />);
-<div>{children}</div>
-

Solution: React.addons.createFragment #

-

However, this is not always possible if you’re trying to add a prefix key to an unknown set (e.g. this.props.children). It is also not always the easiest upgrade path. Therefore, we are adding a helper to React.addons called createFragment(). This accepts a keyed object and returns an opaque type.

-
<div>{React.addons.createFragment({ a: <div />, b: this.props.children })}</div>
-
-

The exact signature of this kind of fragment will be determined later. It will likely be some kind of immutable sequence.

- -

Note: This will still not be valid as the direct return value of render(). Unfortunately, they still need to be wrapped in a <div /> or some other element.

-

Compiler Optimizations: Unlocked! #

-

These changes also unlock several possible compiler optimizations for static content in React 0.14. These optimizations were previously only available to template-based frameworks. They will now also be possible for React code! Both for JSX and React.createElement/Factory*!

- -

See these GitHub Issues for a deep dive into compiler optimizations:

- - - -

* If you use the recommended pattern of explicit React.createFactory calls on the consumer side - since they are easily statically analyzed.

-

Rationale #

-

I thought that these changes were particularly important because the mere existence of these patterns means that even components that DON’T use these patterns have to pay the price. There are other problematic patterns such as mutating state, but they’re at least localized to a component subtree so they don’t harm the ecosystem.

- -

As always, we’d love to hear your feedback and if you have any trouble upgrading, please let us know.

- -
-
- @@ -93,6 +93,162 @@
+
+

Streamlining React Elements

+

February 24, 2015 by Sebastian Markbåge

+
+
+

React v0.13 is right around the corner and so we wanted to discuss some upcoming changes to ReactElement. In particular, we added several warnings to some esoteric use cases of ReactElement. There are no runtime behavior changes for ReactElement - we're adding these warnings in the hope that we can change some behavior in v0.14 if the changes are valuable to the community.

+ +

If you use React in an idiomatic way, chances are, you’ll never see any of these warnings. In that case, you can skip this blog post. You can just enjoy the benefits! These changes will unlock simplified semantics, better error messages, stack traces and compiler optimizations!

+

Immutable Props #

+

In React 0.12, the props object was mutable. It allows you to do patterns like this:

+
var element = <Foo bar={false} />;
+if (shouldUseFoo) {
+  element.props.foo = 10;
+  element.props.bar = true;
+}
+
+

The problem is that we don’t have a convenient way to tell when you’re done mutating.

+

Problem: Mutating Props You Don’t Own #

+

If you mutate something, you destroy the original value. Therefore, there is nothing to diff against. Imagine something like this:

+
var element = this.props.child;
+element.props.count = this.state.count;
+return element;
+
+

You take a ReactElement through props.child and mutate its property before rendering it. If this component's state updates, this render function won't actually get a new ReactElement in props.child. It will be the same one. You're mutating the same props.

+ +

You could imagine that this would work. However, this disables the ability for any component to use shouldComponentUpdate. It looks like the component never changed because the previous value is always the same as the next one. Since the DOM layer does diffing, this pattern doesn't even work in this case. The change will never propagate down to the DOM except the first time.

+ +

Additionally, if this element is reused in other places or used to switch back and forth between two modes, then you have all kinds of weird race conditions.

+ +

It has always been broken to mutate the props of something passed into you. The problem is that we can’t warn you about this special case if you accidentally do this.

+

Problem: Too Late Validation #

+

In React 0.12, we do PropType validation very deep inside React during mounting. This means that by the time you get an error, the debugger stack is long gone. This makes it difficult to find complex issues during debugging. We have to do this since it is fairly common for extra props to be added between the call to React.createElement and the mount time. So the type is incomplete until then.

+ +

The static analysis in Flow is also impaired by this. There is no convenient place in the code where Flow can determine that the props are finalized.

+

Solution: Immutable Props #

+

Therefore, we would like to be able to freeze the element.props object so that it is immediately immutable at the JSX callsite (or createElement). In React 0.13 we will start warning you if you mutate element.props after this point.

+ +

You can generally refactor these pattern to simply use two different JSX calls:

+
if (shouldUseFoo) {
+  return <Foo foo={10} bar={true} />;
+} else {
+  return <Foo bar={false} />;
+}
+
+

However, if you really need to dynamically build up your props you can just use a temporary object and spread it into JSX:

+
var props = { bar: false };
+if (shouldUseFoo) {
+  props.foo = 10;
+  props.bar = true;
+}
+return <Foo {...props} />;
+
+

It is still OK to do deep mutations of objects. E.g:

+
return <Foo nestedObject={this.state.myModel} />;
+
+

In this case it's still ok to mutate the myModel object in state. We recommend that you use fully immutable models. E.g. by using immutable-js. However, we realize that mutable models are still convenient in many cases. Therefore we're only considering shallow freezing the props object that belongs to the ReactElement itself. Not nested objects.

+

Solution: Early PropType Warnings #

+

We will also start warning you for PropTypes at the JSX or createElement callsite. This will help debugging as you’ll have the stack trace right there. Similarly, Flow also validates PropTypes at this callsite.

+ +

Note: There are valid patterns that clones a ReactElement and adds additional props to it. In that case these additional props needs to be optional.

+
var element1 = <Foo />; // extra prop is optional
+var element2 = React.addons.cloneWithProps(element1, { extra: 'prop' });
+

Owner #

+

In React each child has both a "parent" and an “owner”. The owner is the component that created a ReactElement. I.e. the render method which contains the JSX or createElement callsite.

+
class Foo {
+  render() {
+    return <div><span /></div>;
+  }
+}
+
+

In this example, the owner of the span is Foo but the parent is the div.

+ +

There is also an undocumented feature called "context" that also relies on the concept of an “owner” to pass hidden props down the tree.

+

Problem: The Semantics are Opaque and Confusing #

+

The problem is that these are hidden artifacts attached to the ReactElement. In fact, you probably didn’t even know about it. It silently changes semantics. Take this for example:

+
var foo = <input className="foo" />;
+class Component {
+  render() {
+    return bar ? <input className="bar" /> : foo;
+  }
+}
+
+

These two inputs have different owners, therefore React will not keep its state when the conditional switches. There is nothing in the code to indicate that. Similarly, if you use React.addons.cloneWithProps, the owner changes.

+

Problem: Timing Matters #

+

The owner is tracked by the currently executing stack. This means that the semantics of a ReactElement varies depending on when it is executed. Take this example:

+
class A {
+  render() {
+    return <B renderer={text => <span>{text}</span>} />;
+  }
+}
+class B {
+  render() {
+    return this.props.renderer('foo');
+  }
+}
+
+

The owner of the span is actually B, not A because of the timing of the callback. This all adds complexity and suffers from similar problems as mutation.

+

Problem: It Couples JSX to React #

+

Have you wondered why JSX depends on React? Couldn’t the transpiler have that built-in to its runtime? The reason you need to have React.createElement in scope is because we depend on internal state of React to capture the current "owner". Without this, you wouldn’t need to have React in scope.

+

Solution: Make Context Parent-Based Instead of Owner-Based #

+

The first thing we’re doing is warning you if you’re using the "owner" feature in a way that relies on it propagating through owners. Instead, we’re planning on propagating it through parents to its children. In almost all cases, this shouldn’t matter. In fact, parent-based contexts is simply a superset.

+

Solution: Remove the Semantic Implications of Owner #

+

It turns out that there are very few cases where owners are actually important part of state-semantics. As a precaution, we’ll warn you if it turns out that the owner is important to determine state. In almost every case this shouldn’t matter. Unless you’re doing some weird optimizations, you shouldn’t see this warning.

+

Pending: Change the refs Semantics #

+

Refs are still based on "owner". We haven’t fully solved this special case just yet.

+ +

In 0.13 we introduced a new callback-refs API that doesn’t suffer from these problems but we’ll keep on a nice declarative alternative to the current semantics for refs. As always, we won’t deprecate something until we’re sure that you’ll have a nice upgrade path.

+

Keyed Objects as Maps #

+

In React 0.12, and earlier, you could use keyed objects to provide an external key to an element or a set. This pattern isn’t actually widely used. It shouldn’t be an issue for most of you.

+
<div>{ {a: <span />, b: <span />} }</div>
+

Problem: Relies on Enumeration Order #

+

The problem with this pattern is that it relies on enumeration order of objects. This is technically unspecified, even though implementations now agree to use insertion order. Except for the special case when numeric keys are used.

+

Problem: Using Objects as Maps is Bad #

+

It is generally accepted that using objects as maps screw up type systems, VM optimizations, compilers etc. It is much better to use a dedicated data structure like ES6 Maps.

+ +

More importantly, this can have important security implications. For example this has a potential security problem:

+
var children = {};
+items.forEach(item => children[item.title] = <span />);
+return <div>{children}</div>;
+
+

Imagine if item.title === '__proto__' for example.

+

Problem: Can’t be Differentiated from Arbitrary Objects #

+

Since these objects can have any keys with almost any value, we can’t differentiate them from a mistake. If you put some random object, we will try our best to traverse it and render it, instead of failing with a helpful warning. In fact, this is one of the few places where you can accidentally get an infinite loop in React.

+ +

To differentiate ReactElements from one of these objects, we have to tag them with _isReactElement. This is another issue preventing us from inlining ReactElements as simple object literals.

+

Solution: Just use an Array and key={…} #

+

Most of the time you can just use an array with keyed ReactElements.

+
var children = items.map(item => <span key={item.title} />);
+<div>{children}</div>
+

Solution: React.addons.createFragment #

+

However, this is not always possible if you’re trying to add a prefix key to an unknown set (e.g. this.props.children). It is also not always the easiest upgrade path. Therefore, we are adding a helper to React.addons called createFragment(). This accepts a keyed object and returns an opaque type.

+
<div>{React.addons.createFragment({ a: <div />, b: this.props.children })}</div>
+
+

The exact signature of this kind of fragment will be determined later. It will likely be some kind of immutable sequence.

+ +

Note: This will still not be valid as the direct return value of render(). Unfortunately, they still need to be wrapped in a <div /> or some other element.

+

Compiler Optimizations: Unlocked! #

+

These changes also unlock several possible compiler optimizations for static content in React 0.14. These optimizations were previously only available to template-based frameworks. They will now also be possible for React code! Both for JSX and React.createElement/Factory*!

+ +

See these GitHub Issues for a deep dive into compiler optimizations:

+ + + +

* If you use the recommended pattern of explicit React.createFactory calls on the consumer side - since they are easily statically analyzed.

+

Rationale #

+

I thought that these changes were particularly important because the mere existence of these patterns means that even components that DON’T use these patterns have to pay the price. There are other problematic patterns such as mutating state, but they’re at least localized to a component subtree so they don’t harm the ecosystem.

+ +

As always, we’d love to hear your feedback and if you have any trouble upgrading, please let us know.

+ +
+
+

Introducing Relay and GraphQL

February 20, 2015 by Greg Hurrell

@@ -596,46 +752,6 @@ Facebook will make determinations on scholarship recipients in its sole discreti
-
-

React v0.12.2

-

December 18, 2014 by Paul O’Shannessy

-
-
-

We just shipped React v0.12.2, bringing the 0.12 branch up to date with a few small fixes that landed in master over the past 2 months.

- -

You may have noticed that we did not do an announcement for v0.12.1. That release was snuck out in anticipation of Flow, with only transform-related changes. Namely we added a flag to the jsx executable which allowed you to safely transform Flow-based code to vanilla JS. If you didn't update for that release, you can safely skip it and move directly to v0.12.2.

- -

The release is available for download from the CDN:

- - - -

We've also published version 0.12.2 of the react and react-tools packages on npm and the react package on bower. 0.12.1 is also available in the same locations if need those.

- -

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

-

Changelog #

React Core #

-
    -
  • Added support for more HTML attributes: formAction, formEncType, formMethod, formTarget, marginHeight, marginWidth
  • -
  • Added strokeOpacity to the list of unitless CSS properties
  • -
  • Removed trailing commas (allows npm module to be bundled and used in IE8)
  • -
  • Fixed bug resulting in error when passing undefined to React.createElement - now there is a useful warning
  • -
-

React Tools #

-
    -
  • JSX-related transforms now always use double quotes for props and displayName
  • -
- -
-
- @@ -93,6 +93,46 @@
+
+

React v0.12.2

+

December 18, 2014 by Paul O’Shannessy

+
+
+

We just shipped React v0.12.2, bringing the 0.12 branch up to date with a few small fixes that landed in master over the past 2 months.

+ +

You may have noticed that we did not do an announcement for v0.12.1. That release was snuck out in anticipation of Flow, with only transform-related changes. Namely we added a flag to the jsx executable which allowed you to safely transform Flow-based code to vanilla JS. If you didn't update for that release, you can safely skip it and move directly to v0.12.2.

+ +

The release is available for download from the CDN:

+ + + +

We've also published version 0.12.2 of the react and react-tools packages on npm and the react package on bower. 0.12.1 is also available in the same locations if need those.

+ +

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

+

Changelog #

React Core #

+
    +
  • Added support for more HTML attributes: formAction, formEncType, formMethod, formTarget, marginHeight, marginWidth
  • +
  • Added strokeOpacity to the list of unitless CSS properties
  • +
  • Removed trailing commas (allows npm module to be bundled and used in IE8)
  • +
  • Fixed bug resulting in error when passing undefined to React.createElement - now there is a useful warning
  • +
+

React Tools #

+
    +
  • JSX-related transforms now always use double quotes for props and displayName
  • +
+ +
+
+

Community Round-up #24

November 25, 2014 by Steven Luscher

@@ -358,130 +398,6 @@ Minified build for production: -

Community Round-up #23

-

October 17, 2014 by Lou Husson

-
-
-

This round-up is a special edition on Flux. If you expect to see diagrams showing arrows that all point in the same direction, you won't be disappointed!

-

React And Flux at ForwardJS #

-

Facebook engineers Jing Chen and Bill Fisher gave a talk about Flux and React at ForwardJS, and how using an application architecture with a unidirectional data flow helped solve recurring bugs.

- - -

Yahoo #

-

Yahoo is converting Yahoo Mail to React and Flux and in the process, they open sourced several components. This will help you get an isomorphic application up and running.

- - -

Reflux #

-

Mikael Brassman wrote Reflux, a library that implements Flux concepts. Note that it diverges significantly from the way we use Flux at Facebook. He explains the reasons why in a blog post.

- -

- -

-

React and Flux Interview #

-

Ian Obermiller, engineer at Facebook, made a lengthy interview on the experience of using React and Flux in order to build probably the biggest React application ever written so far.

- -
-

I’ve actually said this many times to my team too, I love React. It’s really great for making these complex applications. One thing that really surprised me with it is that React combined with a sane module system like CommonJS, and making sure that you actually modulize your stuff properly has scaled really well to a team of almost 10 developers working on hundreds of files and tens of thousands of lines of code.

- -

Really, a fairly large code base... stuff just works. You don’t have to worry about mutating, and the state of the DOM just really makes stuff easy. Just conceptually it’s easier just to think about here’s what I have, here’s my data, here’s how it renders, I don’t care about anything else. For most cases that is really simplifying and makes it really fast to do stuff.

- -

Read the full interview...

-
-

Adobe's Brackets Project Tree #

-

Kevin Dangoor is converting the project tree of Adobe's Bracket text editor to React and Flux. He wrote about his experience using Flux.

- -

- -

-

Async Requests with Flux Revisited #

-

Reto Schläpfer came back to a Flux project he hasn't worked on for a month and saw many ways to improve the way he implemented Flux. He summarized his learnings in a blog post.

- -
-

The smarter way is to call the Web Api directly from an Action Creator and then make the Api dispatch an event with the request result as a payload. The Store(s) can choose to listen on those request actions and change their state accordingly.

- -

Before I show some updated code snippets, let me explain why this is superior:

- -
    -
  • There should be only one channel for all state changes: The Dispatcher. This makes debugging easy because it just requires a single console.log in the dispatcher to observe every single state change trigger.

  • -
  • Asynchronously executed callbacks should not leak into Stores. The consequences of it are just too hard to fully foresee. This leads to elusive bugs. Stores should only execute synchronous code. Otherwise they are too hard to understand.

  • -
  • Avoiding actions firing other actions makes your app simple. We use the newest Dispatcher implementation from Facebook that does not allow a new dispatch while dispatching. It forces you to do things right.

  • -
- -

Read the full article...

-
-

Undo-Redo with Immutable Data Structures #

-

Ameya Karve explained how to use Mori, a library that provides immutable data structures, in order to implement undo-redo. This usually very challenging feature only takes a few lines of code with Flux!

-
undo: function() {
-  this.redoStates = Mori.conj(this.redoStates, Mori.first(this.undoStates));
-  this.undoStates = Mori.drop(1, this.undoStates);
-  this.todosState = Mori.first(this.undoStates);
-  this.canUndo = Mori.count(this.undoStates) > 1;
-  this.canRedo = true;
-  if (Mori.count(this.undoStates) > 1) {
-    this.todos = JSON.parse(this.todosState);
-  } else {
-    this.todos = [];
-  }
-  this.emit('change');
-},
-

Flux in practice #

-

Gary Chambers wrote a guide to get started with Flux. This is a very practical introduction to Flux.

- -
-

So, what does it actually mean to write an application in the Flux way? At that moment of inspiration, when faced with an empty text editor, how should you begin? This post follows the process of building a Flux-compliant application from scratch.

- -

Read the full guide...

-
-

Components, React and Flux #

-

Dan Abramov working at Stampsy made a talk about React and Flux. It's a very good overview of the concepts at play.

- - -

React and Flux #

-

Christian Alfoni wrote an article where he compares Backbone, Angular and Flux on a simple example that's representative of a real project he worked on.

- -
-

Wow, that was a bit more code! Well, try to think of it like this. In the above examples, if we were to do any changes to the application we would probably have to move things around. In the FLUX example we have considered that from the start.

- -

Any changes to the application is adding, not moving things around. If you need a new store, just add it and make components dependant of it. If you need more views, create a component and use it inside any other component without affecting their current "parent controller or models".

- -

Read the full article...

-
-

Flux: Step by Step approach #

-

Nicola Paolucci from Atlassian wrote a great guide to help your getting understand Flux step by step.

- -

- -

-

DeLorean: Back to the future! #

-

DeLorean is a tiny Flux pattern implementation developed by Fatih Kadir Akin.

- -
-
    -
  • Unidirectional data flow, it makes your app logic simpler than MVC
  • -
  • Automatically listens to data changes and keeps your data updated
  • -
  • Makes data more consistent across your whole application
  • -
  • It's framework agnostic, completely. There's no view framework dependency
  • -
  • Very small, just 4K gzipped
  • -
  • Built-in React.js integration, easy to use with Flight.js and Ractive.js and probably all others
  • -
  • Improve your UI/data consistency using rollbacks
  • -
-
-

Facebook's iOS Infrastructure #

-

Last but not least, Flux and React ideas are not limited to JavaScript inside of the browser. The iOS team at Facebook re-implemented Newsfeed using very similar patterns.

- - -

Random Tweet #

- - -
-
- @@ -93,6 +93,130 @@
+
+

Community Round-up #23

+

October 17, 2014 by Lou Husson

+
+
+

This round-up is a special edition on Flux. If you expect to see diagrams showing arrows that all point in the same direction, you won't be disappointed!

+

React And Flux at ForwardJS #

+

Facebook engineers Jing Chen and Bill Fisher gave a talk about Flux and React at ForwardJS, and how using an application architecture with a unidirectional data flow helped solve recurring bugs.

+ + +

Yahoo #

+

Yahoo is converting Yahoo Mail to React and Flux and in the process, they open sourced several components. This will help you get an isomorphic application up and running.

+ + +

Reflux #

+

Mikael Brassman wrote Reflux, a library that implements Flux concepts. Note that it diverges significantly from the way we use Flux at Facebook. He explains the reasons why in a blog post.

+ +

+ +

+

React and Flux Interview #

+

Ian Obermiller, engineer at Facebook, made a lengthy interview on the experience of using React and Flux in order to build probably the biggest React application ever written so far.

+ +
+

I’ve actually said this many times to my team too, I love React. It’s really great for making these complex applications. One thing that really surprised me with it is that React combined with a sane module system like CommonJS, and making sure that you actually modulize your stuff properly has scaled really well to a team of almost 10 developers working on hundreds of files and tens of thousands of lines of code.

+ +

Really, a fairly large code base... stuff just works. You don’t have to worry about mutating, and the state of the DOM just really makes stuff easy. Just conceptually it’s easier just to think about here’s what I have, here’s my data, here’s how it renders, I don’t care about anything else. For most cases that is really simplifying and makes it really fast to do stuff.

+ +

Read the full interview...

+
+

Adobe's Brackets Project Tree #

+

Kevin Dangoor is converting the project tree of Adobe's Bracket text editor to React and Flux. He wrote about his experience using Flux.

+ +

+ +

+

Async Requests with Flux Revisited #

+

Reto Schläpfer came back to a Flux project he hasn't worked on for a month and saw many ways to improve the way he implemented Flux. He summarized his learnings in a blog post.

+ +
+

The smarter way is to call the Web Api directly from an Action Creator and then make the Api dispatch an event with the request result as a payload. The Store(s) can choose to listen on those request actions and change their state accordingly.

+ +

Before I show some updated code snippets, let me explain why this is superior:

+ +
    +
  • There should be only one channel for all state changes: The Dispatcher. This makes debugging easy because it just requires a single console.log in the dispatcher to observe every single state change trigger.

  • +
  • Asynchronously executed callbacks should not leak into Stores. The consequences of it are just too hard to fully foresee. This leads to elusive bugs. Stores should only execute synchronous code. Otherwise they are too hard to understand.

  • +
  • Avoiding actions firing other actions makes your app simple. We use the newest Dispatcher implementation from Facebook that does not allow a new dispatch while dispatching. It forces you to do things right.

  • +
+ +

Read the full article...

+
+

Undo-Redo with Immutable Data Structures #

+

Ameya Karve explained how to use Mori, a library that provides immutable data structures, in order to implement undo-redo. This usually very challenging feature only takes a few lines of code with Flux!

+
undo: function() {
+  this.redoStates = Mori.conj(this.redoStates, Mori.first(this.undoStates));
+  this.undoStates = Mori.drop(1, this.undoStates);
+  this.todosState = Mori.first(this.undoStates);
+  this.canUndo = Mori.count(this.undoStates) > 1;
+  this.canRedo = true;
+  if (Mori.count(this.undoStates) > 1) {
+    this.todos = JSON.parse(this.todosState);
+  } else {
+    this.todos = [];
+  }
+  this.emit('change');
+},
+

Flux in practice #

+

Gary Chambers wrote a guide to get started with Flux. This is a very practical introduction to Flux.

+ +
+

So, what does it actually mean to write an application in the Flux way? At that moment of inspiration, when faced with an empty text editor, how should you begin? This post follows the process of building a Flux-compliant application from scratch.

+ +

Read the full guide...

+
+

Components, React and Flux #

+

Dan Abramov working at Stampsy made a talk about React and Flux. It's a very good overview of the concepts at play.

+ + +

React and Flux #

+

Christian Alfoni wrote an article where he compares Backbone, Angular and Flux on a simple example that's representative of a real project he worked on.

+ +
+

Wow, that was a bit more code! Well, try to think of it like this. In the above examples, if we were to do any changes to the application we would probably have to move things around. In the FLUX example we have considered that from the start.

+ +

Any changes to the application is adding, not moving things around. If you need a new store, just add it and make components dependant of it. If you need more views, create a component and use it inside any other component without affecting their current "parent controller or models".

+ +

Read the full article...

+
+

Flux: Step by Step approach #

+

Nicola Paolucci from Atlassian wrote a great guide to help your getting understand Flux step by step.

+ +

+ +

+

DeLorean: Back to the future! #

+

DeLorean is a tiny Flux pattern implementation developed by Fatih Kadir Akin.

+ +
+
    +
  • Unidirectional data flow, it makes your app logic simpler than MVC
  • +
  • Automatically listens to data changes and keeps your data updated
  • +
  • Makes data more consistent across your whole application
  • +
  • It's framework agnostic, completely. There's no view framework dependency
  • +
  • Very small, just 4K gzipped
  • +
  • Built-in React.js integration, easy to use with Flight.js and Ractive.js and probably all others
  • +
  • Improve your UI/data consistency using rollbacks
  • +
+
+

Facebook's iOS Infrastructure #

+

Last but not least, Flux and React ideas are not limited to JavaScript inside of the browser. The iOS team at Facebook re-implemented Newsfeed using very similar patterns.

+ + +

Random Tweet #

+ + +
+
+

React v0.12 RC

October 16, 2014 by Sebastian Markbåge

@@ -682,96 +806,6 @@ Minified build for production: -

Community Round-up #22

-

September 12, 2014 by Lou Husson

-
-
-

This has been an exciting summer as four big companies: Yahoo, Mozilla, Airbnb and Reddit announced that they were using React!

- -
- - - -
- - - -
-

React's Architecture #

-

Vjeux, from the React team, gave a talk at OSCON on the history of React and the various optimizations strategies that are implemented. You can also check out the annotated slides or Chris Dawson's notes titled JavaScript’s History and How it Led To React.

- - -

v8 optimizations #

-

Jakob Kummerow landed two optimizations to V8 specifically targeted at optimizing React. That's really exciting to see browser vendors helping out on performance!

-

Reusable Components by Khan Academy #

-

Khan Academy released many high quality standalone components they are using. This is a good opportunity to see what React code used in production look like.

-
var TeX = require('react-components/js/tex.jsx');
-React.renderComponent(<TeX>\nabla \cdot E = 4 \pi \rho</TeX>, domNode);
-
-var translated = (
-  <$_ first="Motoko" last="Kusanagi">
-    Hello, %(first)s %(last)s!
-  </$_>
-);
-

React + Browserify + Gulp #

-

Trường wrote a little guide to help your getting started using React, Browserify and Gulp.

- -
-

React Style #

-

After React put HTML inside of JavaScript, Sander Spies takes the same approach with CSS: IntegratedCSS. It seems weird at first but this is the direction where React is heading.

-
var Button = React.createClass({
-  normalStyle: ReactStyle(function() {
-    return { backgroundColor: vars.orange };
-  }),
-  activeStyle: ReactStyle(function() {
-    if (this.state.active) {
-      return { color: 'yellow', padding: '10px' };
-    }
-  }),
-  render: function() {
-    return (
-      <div styles={[this.normalStyle(), this.activeStyle()]}>
-        Hello, I'm styled
-      </div>
-    );
-  }
-});
-

Virtual DOM in Elm #

-

Evan Czaplicki explains how Elm implements the idea of a Virtual DOM and a diffing algorithm. This is great to see React ideas spread to other languages.

- -
-

Performance is a good hook, but the real benefit is that this approach leads to code that is easier to understand and maintain. In short, it becomes very simple to create reusable HTML widgets and abstract out common patterns. This is why people with larger code bases should be interested in virtual DOM approaches.

- -

Read the full article

-
-

Components Tutorial #

-

If you are getting started with React, Joe Maddalone made a good tutorial on how to build your first component.

- - -

Saving time & staying sane? #

-

When Kent William Innholt who works at M>Path summed up his experience using React in an article.

- -
-

We're building an ambitious new web app, where the UI complexity represents most of the app's complexity overall. It includes a tremendous amount of UI widgets as well as a lot rules on what-to-show-when. This is exactly the sort of situation React.js was built to simplify.

- -
    -
  • Big win: Tighter coupling of markup and behavior
  • -
  • Jury's still out: CSS lives outside React.js
  • -
  • Big win: Cascading updates and functional thinking
  • -
  • Jury's still out: Verbose propagation
  • -
- -

Read the article...

-
-

Weather #

-

To finish this round-up, Andrew Gleave made a page that displays the Weather. It's great to see that React is also used for small prototypes.

- -
- -
-
- @@ -93,6 +93,96 @@
+
+

Community Round-up #22

+

September 12, 2014 by Lou Husson

+
+
+

This has been an exciting summer as four big companies: Yahoo, Mozilla, Airbnb and Reddit announced that they were using React!

+ +
+ + + +
+ + + +
+

React's Architecture #

+

Vjeux, from the React team, gave a talk at OSCON on the history of React and the various optimizations strategies that are implemented. You can also check out the annotated slides or Chris Dawson's notes titled JavaScript’s History and How it Led To React.

+ + +

v8 optimizations #

+

Jakob Kummerow landed two optimizations to V8 specifically targeted at optimizing React. That's really exciting to see browser vendors helping out on performance!

+

Reusable Components by Khan Academy #

+

Khan Academy released many high quality standalone components they are using. This is a good opportunity to see what React code used in production look like.

+
var TeX = require('react-components/js/tex.jsx');
+React.renderComponent(<TeX>\nabla \cdot E = 4 \pi \rho</TeX>, domNode);
+
+var translated = (
+  <$_ first="Motoko" last="Kusanagi">
+    Hello, %(first)s %(last)s!
+  </$_>
+);
+

React + Browserify + Gulp #

+

Trường wrote a little guide to help your getting started using React, Browserify and Gulp.

+ +
+

React Style #

+

After React put HTML inside of JavaScript, Sander Spies takes the same approach with CSS: IntegratedCSS. It seems weird at first but this is the direction where React is heading.

+
var Button = React.createClass({
+  normalStyle: ReactStyle(function() {
+    return { backgroundColor: vars.orange };
+  }),
+  activeStyle: ReactStyle(function() {
+    if (this.state.active) {
+      return { color: 'yellow', padding: '10px' };
+    }
+  }),
+  render: function() {
+    return (
+      <div styles={[this.normalStyle(), this.activeStyle()]}>
+        Hello, I'm styled
+      </div>
+    );
+  }
+});
+

Virtual DOM in Elm #

+

Evan Czaplicki explains how Elm implements the idea of a Virtual DOM and a diffing algorithm. This is great to see React ideas spread to other languages.

+ +
+

Performance is a good hook, but the real benefit is that this approach leads to code that is easier to understand and maintain. In short, it becomes very simple to create reusable HTML widgets and abstract out common patterns. This is why people with larger code bases should be interested in virtual DOM approaches.

+ +

Read the full article

+
+

Components Tutorial #

+

If you are getting started with React, Joe Maddalone made a good tutorial on how to build your first component.

+ + +

Saving time & staying sane? #

+

When Kent William Innholt who works at M>Path summed up his experience using React in an article.

+ +
+

We're building an ambitious new web app, where the UI complexity represents most of the app's complexity overall. It includes a tremendous amount of UI widgets as well as a lot rules on what-to-show-when. This is exactly the sort of situation React.js was built to simplify.

+ +
    +
  • Big win: Tighter coupling of markup and behavior
  • +
  • Jury's still out: CSS lives outside React.js
  • +
  • Big win: Cascading updates and functional thinking
  • +
  • Jury's still out: Verbose propagation
  • +
+ +

Read the article...

+
+

Weather #

+

To finish this round-up, Andrew Gleave made a page that displays the Weather. It's great to see that React is also used for small prototypes.

+ +
+ +
+
+

Introducing the JSX Specification

September 3, 2014 by Sebastian Markbåge

@@ -317,53 +407,6 @@ This is not the intended way to use React but can be useful as last resort if yo
-
-

React v0.11.1

-

July 25, 2014 by Paul O’Shannessy

-
-
-

Today we're releasing React v0.11.1 to address a few small issues. Thanks to everybody who has reported them as they've begun upgrading.

- -

The first of these is the most major and resulted in a regression with the use of setState inside componentWillMount when using React on the server. These setState calls are batched into the initial render. A change we made to our batching code resulted in this path hitting DOM specific code when run server-side, in turn throwing an error as document is not defined.

- -

There are several fixes we're including in v0.11.1 that are focused around the newly supported event.getModifierState() function. We made some adjustments to improve this cross-browser standardization.

- -

The final fix we're including is to better support a workaround for some IE8 behavior. The edge-case bug we're fixing was also present in v0.9 and v0.10, so while it wasn't a short-term regression, we wanted to make sure we support IE8 to the best of our abilities.

- -

We'd also like to call out a couple additional breaking changes that we failed to originally mention in the release notes for v0.11. We updated that blog post and the changelog, so we encourage you to go read about the changes around Descriptors and Prop Type Validation.

- -

The release is available for download from the CDN:

- - - -

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

- -

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

-

Changelog #

React Core #

Bug Fixes #

-
    -
  • setState can be called inside componentWillMount in non-DOM environments
  • -
  • SyntheticMouseEvent.getEventModifierState correctly renamed to getModifierState
  • -
  • getModifierState correctly returns a boolean
  • -
  • getModifierState is now correctly case sensitive
  • -
  • Empty Text node used in IE8 innerHTML workaround is now removed, fixing rerendering in certain cases
  • -
-

JSXTransformer #

-
    -
  • Fix duplicate variable declaration (caused issues in some browsers)
  • -
- -
-
- @@ -93,6 +93,53 @@
+
+

React v0.11.1

+

July 25, 2014 by Paul O’Shannessy

+
+
+

Today we're releasing React v0.11.1 to address a few small issues. Thanks to everybody who has reported them as they've begun upgrading.

+ +

The first of these is the most major and resulted in a regression with the use of setState inside componentWillMount when using React on the server. These setState calls are batched into the initial render. A change we made to our batching code resulted in this path hitting DOM specific code when run server-side, in turn throwing an error as document is not defined.

+ +

There are several fixes we're including in v0.11.1 that are focused around the newly supported event.getModifierState() function. We made some adjustments to improve this cross-browser standardization.

+ +

The final fix we're including is to better support a workaround for some IE8 behavior. The edge-case bug we're fixing was also present in v0.9 and v0.10, so while it wasn't a short-term regression, we wanted to make sure we support IE8 to the best of our abilities.

+ +

We'd also like to call out a couple additional breaking changes that we failed to originally mention in the release notes for v0.11. We updated that blog post and the changelog, so we encourage you to go read about the changes around Descriptors and Prop Type Validation.

+ +

The release is available for download from the CDN:

+ + + +

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

+ +

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

+

Changelog #

React Core #

Bug Fixes #

+
    +
  • setState can be called inside componentWillMount in non-DOM environments
  • +
  • SyntheticMouseEvent.getEventModifierState correctly renamed to getModifierState
  • +
  • getModifierState correctly returns a boolean
  • +
  • getModifierState is now correctly case sensitive
  • +
  • Empty Text node used in IE8 innerHTML workaround is now removed, fixing rerendering in certain cases
  • +
+

JSXTransformer #

+
    +
  • Fix duplicate variable declaration (caused issues in some browsers)
  • +
+ +
+
+

React v0.11

July 17, 2014 by Paul O’Shannessy

@@ -447,26 +494,6 @@ Minified build for production: -

Flux: An Application Architecture for React

-

May 6, 2014 by Bill Fisher and Jing Chen

-
-
-

We recently spoke at one of f8's breakout session about Flux, a data flow architecture that works well with React. Check out the video here:

- -
- -

To summarize, Flux works well for us because the single directional data flow makes it easy to understand and modify an application as it becomes more complicated. We found that two-way data bindings lead to cascading updates, where changing one data model led to another data model updating, making it very difficult to predict what would change as the result of a single user interaction.

- -

In Flux, the Dispatcher is a singleton that directs the flow of data and ensures that updates do not cascade. As an application grows, the Dispatcher becomes more vital, as it can also manage dependencies between stores by invoking the registered callbacks in a specific order.

- -

When a user interacts with a React view, the view sends an action (usually represented as a JavaScript object with some fields) through the dispatcher, which notifies the various stores that hold the application's data and business logic. When the stores change state, they notify the views that something has updated. This works especially well with React's declarative model, which allows the stores to send updates without specifying how to transition views between states.

- -

Flux is more of a pattern than a formal framework, so you can start using Flux immediately without a lot of new code. An example of this architecture is available, along with more detailed documentation and a tutorial. Look for more examples to come in the future.

- -
-
- @@ -93,6 +93,26 @@
+
+

Flux: An Application Architecture for React

+

May 6, 2014 by Bill Fisher and Jing Chen

+
+
+

We recently spoke at one of f8's breakout session about Flux, a data flow architecture that works well with React. Check out the video here:

+ +
+ +

To summarize, Flux works well for us because the single directional data flow makes it easy to understand and modify an application as it becomes more complicated. We found that two-way data bindings lead to cascading updates, where changing one data model led to another data model updating, making it very difficult to predict what would change as the result of a single user interaction.

+ +

In Flux, the Dispatcher is a singleton that directs the flow of data and ensures that updates do not cascade. As an application grows, the Dispatcher becomes more vital, as it can also manage dependencies between stores by invoking the registered callbacks in a specific order.

+ +

When a user interacts with a React view, the view sends an action (usually represented as a JavaScript object with some fields) through the dispatcher, which notifies the various stores that hold the application's data and business logic. When the stores change state, they notify the views that something has updated. This works especially well with React's declarative model, which allows the stores to send updates without specifying how to transition views between states.

+ +

Flux is more of a pattern than a formal framework, so you can start using Flux immediately without a lot of new code. An example of this architecture is available, along with more detailed documentation and a tutorial. Look for more examples to come in the future.

+ +
+
+

Use React and JSX in ASP.NET MVC

April 4, 2014 by Daniel Lo Nigro

@@ -319,89 +339,6 @@ Minified build for production: -

Community Round-up #18

-

March 14, 2014 by Jonas Gebhardt

-
-
-

In this Round-up, we are taking a few closer looks at React's interplay with different frameworks and architectures.

-

"Little framework BIG splash" #

-

Let's start with yet another refreshing introduction to React: Craig Savolainen (@maedhr) walks through some first steps, demonstrating how to build a Google Maps component using React.

-

Architecting your app with react #

-

Brandon Konkle (@bkonkle) -Architecting your app with react -We're looking forward to part 2!

- -
-

React is not a full MVC framework, and this is actually one of its strengths. Many who adopt React choose to do so alongside their favorite MVC framework, like Backbone. React has no opinions about routing or syncing data, so you can easily use your favorite tools to handle those aspects of your frontend application. You'll often see React used to manage specific parts of an application's UI and not others. React really shines, however, when you fully embrace its strategies and make it the core of your application's interface.

- -

Read the full article...

-
-

React vs. async DOM manipulation #

-

Eliseu Monar (@eliseumds)'s post "ReactJS vs async concurrent rendering" is a great example of how React quite literally renders a whole array of common web development work(arounds) obsolete.

-

React, Scala and the Play Framework #

-

Matthias Nehlsen wrote a detailed introductory piece on React and the Play Framework, including a helpful architectural diagram of a typical React app.

- -

Nehlsen's React frontend is the second implementation of his chat application's frontend, following an AngularJS version. Both implementations are functionally equivalent and offer some perspective on differences between the two frameworks.

- -

In another article, he walks us through the process of using React with scala.js to implement app-wide undo functionality.

- -

Also check out his talk at Ping Conference 2014, in which he walks through a lot of the previously content in great detail.

-

React and Backbone #

-

The folks over at Venmo are using React in conjunction with Backbone. -Thomas Boyt (@thomasaboyt) wrote this detailed piece about why React and Backbone are "a fantastic pairing".

-

React vs. Ember #

-

Eric Berry (@coderberry) developed Ember equivalents for some of the official React examples. Read his post for a side-by-side comparison of the respective implementations: "Facebook React vs. Ember".

-

React and plain old HTML #

-

Daniel Lo Nigro (@Daniel15) created React-Magic, which leverages React to ajaxify plain old html pages and even allows CSS transitions between pageloads.

- -
-

React-Magic intercepts all navigation (link clicks and form posts) and loads the requested page via an AJAX request. React is then used to "diff" the old HTML with the new HTML, and only update the parts of the DOM that have been changed.

- -

Check out the project on GitHub...

-
- -

On a related note, Reactize by Ross Allen (@ssorallen) is a similarly awesome project: A wrapper for Rails' Turbolinks, which seems to have inspired John Lynch (@johnrlynch) to then create a server-rendered version using the JSX transformer in Rails middleware.

-

React and Object.observe #

-

Check out François de Campredon's implementation of TodoMVC based on React and ES6's Object.observe.

-

React and Angular #

-

Ian Bicking (@ianbicking) of Mozilla Labs explains why he "decided to go with React instead of Angular.js".

-

ng-React Update #

-

David Chang works through some performance improvements of his ngReact project. His post "ng-React Update - React 0.9 and Angular Track By" includes some helpful advice on boosting render performance for Angular components.

- -
-

Angular gives you a ton of functionality out of the box - a full MV* framework - and I am a big fan, but I'll admit that you need to know how to twist the right knobs to get performance.

- -

That said, React gives you a very strong view component out of the box with the performance baked right in. Try as I did, I couldn't actually get it any faster. So pretty impressive stuff.

- -

Read the full post...

-
- -

React was also recently mentioned at ng-conf, where the Angular team commented on React's concept of the virtual DOM:

- - -

React and Web Components #

-

Jonathan Krause (@jonykrause) offers his thoughts regarding parallels between React and Web Components, highlighting the value of React's ability to render pages on the server practically for free.

-

Immutable React #

-

Peter Hausel shows how to build a Wikipedia auto-complete demo based on immutable data structures (similar to mori), really taking advantage of the framework's one-way reactive data binding:

- -
-

Its truly reactive design makes DOM updates finally sane and when combined with persistent data structures one can experience JavaScript development like it was never done before.

- -

Read the full post

-
-

D3 and React #

-

Ben Smith built some great SVG-based charting components using a little less of D3 and a little more of React: D3 and React - the future of charting components?

-

Om and React #

-

Josh Haberman (@joshhaberman) discusses performance differences between React, Om and traditional MVC frameworks in "A closer look at OM vs React performance".

- -

Speaking of Om: Omchaya by Sean Grove (@sgrove) is a neat Cljs/Om example project.

-

Random Tweets #

-
- -
-
- @@ -93,6 +93,89 @@
+
+

Community Round-up #18

+

March 14, 2014 by Jonas Gebhardt

+
+
+

In this Round-up, we are taking a few closer looks at React's interplay with different frameworks and architectures.

+

"Little framework BIG splash" #

+

Let's start with yet another refreshing introduction to React: Craig Savolainen (@maedhr) walks through some first steps, demonstrating how to build a Google Maps component using React.

+

Architecting your app with react #

+

Brandon Konkle (@bkonkle) +Architecting your app with react +We're looking forward to part 2!

+ +
+

React is not a full MVC framework, and this is actually one of its strengths. Many who adopt React choose to do so alongside their favorite MVC framework, like Backbone. React has no opinions about routing or syncing data, so you can easily use your favorite tools to handle those aspects of your frontend application. You'll often see React used to manage specific parts of an application's UI and not others. React really shines, however, when you fully embrace its strategies and make it the core of your application's interface.

+ +

Read the full article...

+
+

React vs. async DOM manipulation #

+

Eliseu Monar (@eliseumds)'s post "ReactJS vs async concurrent rendering" is a great example of how React quite literally renders a whole array of common web development work(arounds) obsolete.

+

React, Scala and the Play Framework #

+

Matthias Nehlsen wrote a detailed introductory piece on React and the Play Framework, including a helpful architectural diagram of a typical React app.

+ +

Nehlsen's React frontend is the second implementation of his chat application's frontend, following an AngularJS version. Both implementations are functionally equivalent and offer some perspective on differences between the two frameworks.

+ +

In another article, he walks us through the process of using React with scala.js to implement app-wide undo functionality.

+ +

Also check out his talk at Ping Conference 2014, in which he walks through a lot of the previously content in great detail.

+

React and Backbone #

+

The folks over at Venmo are using React in conjunction with Backbone. +Thomas Boyt (@thomasaboyt) wrote this detailed piece about why React and Backbone are "a fantastic pairing".

+

React vs. Ember #

+

Eric Berry (@coderberry) developed Ember equivalents for some of the official React examples. Read his post for a side-by-side comparison of the respective implementations: "Facebook React vs. Ember".

+

React and plain old HTML #

+

Daniel Lo Nigro (@Daniel15) created React-Magic, which leverages React to ajaxify plain old html pages and even allows CSS transitions between pageloads.

+ +
+

React-Magic intercepts all navigation (link clicks and form posts) and loads the requested page via an AJAX request. React is then used to "diff" the old HTML with the new HTML, and only update the parts of the DOM that have been changed.

+ +

Check out the project on GitHub...

+
+ +

On a related note, Reactize by Ross Allen (@ssorallen) is a similarly awesome project: A wrapper for Rails' Turbolinks, which seems to have inspired John Lynch (@johnrlynch) to then create a server-rendered version using the JSX transformer in Rails middleware.

+

React and Object.observe #

+

Check out François de Campredon's implementation of TodoMVC based on React and ES6's Object.observe.

+

React and Angular #

+

Ian Bicking (@ianbicking) of Mozilla Labs explains why he "decided to go with React instead of Angular.js".

+

ng-React Update #

+

David Chang works through some performance improvements of his ngReact project. His post "ng-React Update - React 0.9 and Angular Track By" includes some helpful advice on boosting render performance for Angular components.

+ +
+

Angular gives you a ton of functionality out of the box - a full MV* framework - and I am a big fan, but I'll admit that you need to know how to twist the right knobs to get performance.

+ +

That said, React gives you a very strong view component out of the box with the performance baked right in. Try as I did, I couldn't actually get it any faster. So pretty impressive stuff.

+ +

Read the full post...

+
+ +

React was also recently mentioned at ng-conf, where the Angular team commented on React's concept of the virtual DOM:

+ + +

React and Web Components #

+

Jonathan Krause (@jonykrause) offers his thoughts regarding parallels between React and Web Components, highlighting the value of React's ability to render pages on the server practically for free.

+

Immutable React #

+

Peter Hausel shows how to build a Wikipedia auto-complete demo based on immutable data structures (similar to mori), really taking advantage of the framework's one-way reactive data binding:

+ +
+

Its truly reactive design makes DOM updates finally sane and when combined with persistent data structures one can experience JavaScript development like it was never done before.

+ +

Read the full post

+
+

D3 and React #

+

Ben Smith built some great SVG-based charting components using a little less of D3 and a little more of React: D3 and React - the future of charting components?

+

Om and React #

+

Josh Haberman (@joshhaberman) discusses performance differences between React, Om and traditional MVC frameworks in "A closer look at OM vs React performance".

+ +

Speaking of Om: Omchaya by Sean Grove (@sgrove) is a neat Cljs/Om example project.

+

Random Tweets #

+
+ +
+
+

Community Round-up #17

February 24, 2014 by Jonas Gebhardt

@@ -476,118 +559,6 @@ Minified build for production: -

Community Round-up #15

-

February 5, 2014 by Jonas Gebhardt

-
-
-

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

- -

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

-

"React: Another Level of Indirection" #

-

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

- -
-

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

- -

Read the full post...

-
-

Reagent: Minimalistic React for ClojureScript #

-

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

- -
-

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

- -

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

- -

Check it out on Github...

-
-

Functional DOM programming #

-

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

- -
-

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

- -

Read the full post...

-
- -

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

- - -

Kioo: Separating markup and logic #

-

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

- -

A basic example from github:

-
<!DOCTYPE html>
-<html lang="en">
-  <body>
-    <header>
-      <h1>Header placeholder</h1>
-      <ul id="navigation">
-        <li class="nav-item"><a href="#">Placeholder</a></li>
-      </ul>
-    </header>
-    <div class="content">place holder</div>
-  </body>
-</html>
-
...
-
-(defn my-nav-item [[caption func]]
-  (kioo/component "main.html" [:.nav-item]
-    {[:a] (do-> (content caption)
-                (set-attr :onClick func))}))
-
-(defn my-header [heading nav-elms]
-  (kioo/component "main.html" [:header]
-    {[:h1] (content heading)
-     [:ul] (content (map my-nav-item nav-elms))}))
-
-(defn my-page [data]
-  (kioo/component "main.html"
-    {[:header] (substitute (my-header (:heading data)
-                                      (:navigation data)))
-     [:.content] (content (:content data))}))
-
-(def app-state (atom {:heading    "main"
-                      :content    "Hello World"
-                      :navigation [["home" #(js/alert %)]
-                                   ["next" #(js/alert %)]]}))
-
-(om/root app-state my-page (.-body js/document))
-

Om #

-

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

- -
-

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

- -

Read the full interview...

-
-

A slice of React, ClojureScript and Om #

-

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

- -
-

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

- -

Read the full post...

-
- -

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

- -

[Demo] [Code]

-

Time Travel: Implementing undo in Om #

-

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

-

A Step-by-Step Om Walkthrough #

-

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

-

Omkara #

-

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

-

Om Experience Report #

-

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

-

Not-so-random Tweet #

-
- -
-
- diff --git a/docs/tutorial-ko-KR.html b/docs/tutorial-ko-KR.html index b031256379..83d61503fb 100644 --- a/docs/tutorial-ko-KR.html +++ b/docs/tutorial-ko-KR.html @@ -433,8 +433,8 @@ <html> <head> <title>Hello React</title> - <script src="http://fb.me/react-0.13.1.js"></script> - <script src="http://fb.me/JSXTransformer-0.13.1.js"></script> + <script src="http://fb.me/react-0.13.2.js"></script> + <script src="http://fb.me/JSXTransformer-0.13.2.js"></script> <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script> </head> <body> @@ -577,8 +577,8 @@
<!-- index.html -->
 <head>
   <title>Hello React</title>
-  <script src="http://fb.me/react-0.13.1.js"></script>
-  <script src="http://fb.me/JSXTransformer-0.13.1.js"></script>
+  <script src="http://fb.me/react-0.13.2.js"></script>
+  <script src="http://fb.me/JSXTransformer-0.13.2.js"></script>
   <script src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script>
 </head>
diff --git a/docs/tutorial.html b/docs/tutorial.html
index 2543899a48..e8aa76eee4 100644
--- a/docs/tutorial.html
+++ b/docs/tutorial.html
@@ -433,8 +433,8 @@
 <html>
   <head>
     <title>Hello React</title>
-    <script src="https://fb.me/react-0.13.1.js"></script>
-    <script src="https://fb.me/JSXTransformer-0.13.1.js"></script>
+    <script src="https://fb.me/react-0.13.2.js"></script>
+    <script src="https://fb.me/JSXTransformer-0.13.2.js"></script>
     <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
   </head>
   <body>
@@ -577,8 +577,8 @@
 
<!-- index.html -->
 <head>
   <title>Hello React</title>
-  <script src="https://fb.me/react-0.13.1.js"></script>
-  <script src="https://fb.me/JSXTransformer-0.13.1.js"></script>
+  <script src="https://fb.me/react-0.13.2.js"></script>
+  <script src="https://fb.me/JSXTransformer-0.13.2.js"></script>
   <script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script>
 </head>
diff --git a/docs/tutorial.ja-JP.html b/docs/tutorial.ja-JP.html
index 96588054f8..0b867fd3be 100644
--- a/docs/tutorial.ja-JP.html
+++ b/docs/tutorial.ja-JP.html
@@ -433,8 +433,8 @@
 <html>
   <head>
     <title>Hello React</title>
-    <script src="https://fb.me/react-0.13.1.js"></script>
-    <script src="https://fb.me/JSXTransformer-0.13.1.js"></script>
+    <script src="https://fb.me/react-0.13.2.js"></script>
+    <script src="https://fb.me/JSXTransformer-0.13.2.js"></script>
     <script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
   </head>
   <body>
@@ -577,8 +577,8 @@
 
<!-- index.html -->
 <head>
   <title>Hello React</title>
-  <script src="https://fb.me/react-0.13.1.js"></script>
-  <script src="https://fb.me/JSXTransformer-0.13.1.js"></script>
+  <script src="https://fb.me/react-0.13.2.js"></script>
+  <script src="https://fb.me/JSXTransformer-0.13.2.js"></script>
   <script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/0.3.1/showdown.min.js"></script>
 </head>
diff --git a/downloads.html b/downloads.html
index 2e61a351fc..843c4b72ba 100644
--- a/downloads.html
+++ b/downloads.html
@@ -68,29 +68,29 @@
 get started with React. The starter kit includes React, the in-browser JSX transformer, and some simple example apps.

Development vs. Production Builds #

We provide two versions of React: an uncompressed version for development and a minified version for production. The development version includes extra warnings about common mistakes, whereas the production version includes extra performance optimizations and strips all error messages.

If you're just starting out, make sure to use the development version.

-

Individual Downloads #

React 0.13.1 (development) #

+

Individual Downloads #

React 0.13.2 (development) #

The uncompressed, development version of React core with inline documentation.

-
<script src="http://fb.me/react-0.13.1.js"></script>
-

React 0.13.1 (production) #

+
<script src="http://fb.me/react-0.13.2.js"></script>
+

React 0.13.2 (production) #

The compressed, production version of React core.

-
<script src="http://fb.me/react-0.13.1.min.js"></script>
-

React with Add-Ons 0.13.1 (development) #

+
<script src="http://fb.me/react-0.13.2.min.js"></script>
+

React with Add-Ons 0.13.2 (development) #

The uncompressed, development version of React with add-ons.

-
<script src="http://fb.me/react-with-addons-0.13.1.js"></script>
-

React with Add-Ons 0.13.1 (production) #

+
<script src="http://fb.me/react-with-addons-0.13.2.js"></script>
+

React with Add-Ons 0.13.2 (production) #

The compressed, production version of React with add-ons.

-
<script src="http://fb.me/react-with-addons-0.13.1.min.js"></script>
-

JSX Transformer #

+
<script src="http://fb.me/react-with-addons-0.13.2.min.js"></script>
+

JSX Transformer #

The JSX transformer used to support XML syntax in JavaScript.

-
<script src="http://fb.me/JSXTransformer-0.13.1.js"></script>
+
<script src="http://fb.me/JSXTransformer-0.13.2.js"></script>
 

All scripts are also available via CDNJS.

npm #

diff --git a/downloads/react-0.13.2.zip b/downloads/react-0.13.2.zip new file mode 100644 index 0000000000..9565e04c15 Binary files /dev/null and b/downloads/react-0.13.2.zip differ diff --git a/feed.xml b/feed.xml index 84c2ec4a71..9a1132423d 100644 --- a/feed.xml +++ b/feed.xml @@ -6,6 +6,58 @@ http://facebook.github.io/react + + React v0.13.2 + <p>Yesterday Vjeux and team <a href="/react/blog/2015/04/17/react-native-v0.4.html">shipped React Native v0.4</a>. Those of us working on the web team couldn&#39;t just be shown up like that so we&#39;re shipping v0.13.2 today as well! This is a bug fix release to address a few things while we continue to work towards v0.14.</p> + +<p>The release is now available for download:</p> + +<ul> +<li><strong>React</strong><br> +Dev build with warnings: <a href="https://fb.me/react-0.13.2.js">https://fb.me/react-0.13.2.js</a><br> +Minified build for production: <a href="https://fb.me/react-0.13.2.min.js">https://fb.me/react-0.13.2.min.js</a><br></li> +<li><strong>React with Add-Ons</strong><br> +Dev build with warnings: <a href="https://fb.me/react-with-addons-0.13.2.js">https://fb.me/react-with-addons-0.13.2.js</a><br> +Minified build for production: <a href="https://fb.me/react-with-addons-0.13.2.min.js">https://fb.me/react-with-addons-0.13.2.min.js</a><br></li> +<li><strong>In-Browser JSX transformer</strong><br> +<a href="https://fb.me/JSXTransformer-0.13.2.js">https://fb.me/JSXTransformer-0.13.2.js</a></li> +</ul> + +<p>We&#39;ve also published version <code>0.13.2</code> of the <code>react</code> and <code>react-tools</code> packages on npm and the <code>react</code> package on bower.</p> + +<hr> +<h2><a class="anchor" name="changelog"></a>Changelog <a class="hash-link" href="#changelog">#</a></h2><h3><a class="anchor" name="react-core"></a>React Core <a class="hash-link" href="#react-core">#</a></h3><h4><a class="anchor" name="new-features"></a>New Features <a class="hash-link" href="#new-features">#</a></h4> +<ul> +<li>Added <code>strokeDashoffset</code>, <code>flexPositive</code>, <code>flexNegative</code> to the list of unitless CSS properties</li> +<li>Added support for more DOM properties: + +<ul> +<li><code>scoped</code> - for <code>&lt;style&gt;</code> elements</li> +<li><code>high</code>, <code>low</code>, <code>optimum</code> - for <code>&lt;meter&gt;</code> elements</li> +<li><code>unselectable</code> - IE-specific property to prevent user selection</li> +</ul></li> +</ul> +<h4><a class="anchor" name="bug-fixes"></a>Bug Fixes <a class="hash-link" href="#bug-fixes">#</a></h4> +<ul> +<li>Fixed a case where re-rendering after rendering null didn&#39;t properly pass context</li> +<li>Fixed a case where re-rendering after rendering with <code>style={null}</code> didn&#39;t properly update <code>style</code></li> +<li>Update <code>uglify</code> dependency to prevent a bug in IE8</li> +<li>Improved warnings</li> +</ul> +<h3><a class="anchor" name="react-with-add-ons"></a>React with Add-Ons <a class="hash-link" href="#react-with-add-ons">#</a></h3><h4><a class="anchor" name="bug-fixes"></a>Bug Fixes <a class="hash-link" href="#bug-fixes">#</a></h4> +<ul> +<li>Immutabilty Helpers: Ensure it supports <code>hasOwnProperty</code> as an object key</li> +</ul> +<h3><a class="anchor" name="react-tools"></a>React Tools <a class="hash-link" href="#react-tools">#</a></h3> +<ul> +<li>Improve documentation for new options</li> +</ul> + + 2015-04-18T00:00:00-07:00 + http://facebook.github.io/react/blog/2015/04/18/react-v0.13.2.html + http://facebook.github.io/react/blog/2015/04/18/react-v0.13.2.html + + React Native v0.4 <p>It&#39;s been three weeks since we open sourced React Native and there&#39;s been some insane amount of activity already: over 12.5k stars, 1000 commits, 500 issues, 380 pull requests, and 100 contributors, plus <a href="http://react.parts/native-ios">35 plugins</a> and <a href="http://herman.asia/building-a-flashcard-app-with-react-native">1 app in the app store</a>! We were expecting some buzz around the project but this is way beyond anything we imagined. Thank you!</p> @@ -620,160 +672,5 @@ Minified build for production: <a href="http://fb.me/react-with-addons-0 http://facebook.github.io/react/blog/2015/02/24/react-v0.13-rc1.html - - Streamlining React Elements - <p>React v0.13 is right around the corner and so we wanted to discuss some upcoming changes to ReactElement. In particular, we added several warnings to some esoteric use cases of ReactElement. There are no runtime behavior changes for ReactElement - we&#39;re adding these warnings in the hope that we can change some behavior in v0.14 if the changes are valuable to the community.</p> - -<p>If you use React in an idiomatic way, chances are, you’ll never see any of these warnings. In that case, you can skip this blog post. You can just enjoy the benefits! These changes will unlock simplified semantics, better error messages, stack traces and compiler optimizations!</p> -<h2><a class="anchor" name="immutable-props"></a>Immutable Props <a class="hash-link" href="#immutable-props">#</a></h2> -<p>In React 0.12, the props object was mutable. It allows you to do patterns like this:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="nx">bar</span><span class="o">=</span><span class="p">{</span><span class="kc">false</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">;</span> -<span class="k">if</span> <span class="p">(</span><span class="nx">shouldUseFoo</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">element</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">foo</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> - <span class="nx">element</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">bar</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> -<span class="p">}</span> -</code></pre></div> -<p>The problem is that we don’t have a convenient way to tell when you’re done mutating.</p> -<h3><a class="anchor" name="problem-mutating-props-you-dont-own"></a>Problem: Mutating Props You Don’t Own <a class="hash-link" href="#problem-mutating-props-you-dont-own">#</a></h3> -<p>If you mutate something, you destroy the original value. Therefore, there is nothing to diff against. Imagine something like this:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">child</span><span class="p">;</span> -<span class="nx">element</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">count</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">count</span><span class="p">;</span> -<span class="k">return</span> <span class="nx">element</span><span class="p">;</span> -</code></pre></div> -<p>You take a ReactElement through <code>props.child</code> and mutate its property before rendering it. If this component&#39;s state updates, this render function won&#39;t actually get a new ReactElement in <code>props.child</code>. It will be the same one. You&#39;re mutating the same props.</p> - -<p>You could imagine that this would work. However, this disables the ability for any component to use <code>shouldComponentUpdate</code>. It looks like the component never changed because the previous value is always the same as the next one. Since the DOM layer does diffing, this pattern doesn&#39;t even work in this case. The change will never propagate down to the DOM except the first time.</p> - -<p>Additionally, if this element is reused in other places or used to switch back and forth between two modes, then you have all kinds of weird race conditions.</p> - -<p>It has always been broken to mutate the props of something passed into you. The problem is that we can’t warn you about this special case if you accidentally do this.</p> -<h3><a class="anchor" name="problem-too-late-validation"></a>Problem: Too Late Validation <a class="hash-link" href="#problem-too-late-validation">#</a></h3> -<p>In React 0.12, we do PropType validation very deep inside React during mounting. This means that by the time you get an error, the debugger stack is long gone. This makes it difficult to find complex issues during debugging. We have to do this since it is fairly common for extra props to be added between the call to React.createElement and the mount time. So the type is incomplete until then.</p> - -<p>The static analysis in Flow is also impaired by this. There is no convenient place in the code where Flow can determine that the props are finalized.</p> -<h3><a class="anchor" name="solution-immutable-props"></a>Solution: Immutable Props <a class="hash-link" href="#solution-immutable-props">#</a></h3> -<p>Therefore, we would like to be able to freeze the element.props object so that it is immediately immutable at the JSX callsite (or createElement). In React 0.13 we will start warning you if you mutate <code>element.props</code> after this point.</p> - -<p>You can generally refactor these pattern to simply use two different JSX calls:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="k">if</span> <span class="p">(</span><span class="nx">shouldUseFoo</span><span class="p">)</span> <span class="p">{</span> - <span class="k">return</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="nx">foo</span><span class="o">=</span><span class="p">{</span><span class="mi">10</span><span class="p">}</span> <span class="nx">bar</span><span class="o">=</span><span class="p">{</span><span class="kc">true</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">;</span> -<span class="p">}</span> <span class="k">else</span> <span class="p">{</span> - <span class="k">return</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="nx">bar</span><span class="o">=</span><span class="p">{</span><span class="kc">false</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">;</span> -<span class="p">}</span> -</code></pre></div> -<p>However, if you really need to dynamically build up your props you can just use a temporary object and spread it into JSX:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">props</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">bar</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span> -<span class="k">if</span> <span class="p">(</span><span class="nx">shouldUseFoo</span><span class="p">)</span> <span class="p">{</span> - <span class="nx">props</span><span class="p">.</span><span class="nx">foo</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> - <span class="nx">props</span><span class="p">.</span><span class="nx">bar</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> -<span class="p">}</span> -<span class="k">return</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="p">{...</span><span class="nx">props</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">;</span> -</code></pre></div> -<p>It is still OK to do deep mutations of objects. E.g:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="k">return</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="nx">nestedObject</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">myModel</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">;</span> -</code></pre></div> -<p>In this case it&#39;s still ok to mutate the myModel object in state. We recommend that you use fully immutable models. E.g. by using immutable-js. However, we realize that mutable models are still convenient in many cases. Therefore we&#39;re only considering shallow freezing the props object that belongs to the ReactElement itself. Not nested objects.</p> -<h3><a class="anchor" name="solution-early-proptype-warnings"></a>Solution: Early PropType Warnings <a class="hash-link" href="#solution-early-proptype-warnings">#</a></h3> -<p>We will also start warning you for PropTypes at the JSX or createElement callsite. This will help debugging as you’ll have the stack trace right there. Similarly, Flow also validates PropTypes at this callsite.</p> - -<p>Note: There are valid patterns that clones a ReactElement and adds additional props to it. In that case these additional props needs to be optional.</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">element1</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">Foo</span> <span class="o">/&gt;</span><span class="p">;</span> <span class="c1">// extra prop is optional</span> -<span class="kd">var</span> <span class="nx">element2</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">addons</span><span class="p">.</span><span class="nx">cloneWithProps</span><span class="p">(</span><span class="nx">element1</span><span class="p">,</span> <span class="p">{</span> <span class="nx">extra</span><span class="o">:</span> <span class="s1">&#39;prop&#39;</span> <span class="p">});</span> -</code></pre></div><h2><a class="anchor" name="owner"></a>Owner <a class="hash-link" href="#owner">#</a></h2> -<p>In React each child has both a &quot;parent&quot; and an “owner”. The owner is the component that created a ReactElement. I.e. the render method which contains the JSX or createElement callsite.</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kr">class</span> <span class="nx">Foo</span> <span class="p">{</span> - <span class="nx">render</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="o">/&gt;&lt;</span><span class="err">/div&gt;;</span> - <span class="p">}</span> -<span class="p">}</span> -</code></pre></div> -<p>In this example, the owner of the <code>span</code> is <code>Foo</code> but the parent is the <code>div</code>.</p> - -<p>There is also an undocumented feature called &quot;context&quot; that also relies on the concept of an “owner” to pass hidden props down the tree.</p> -<h3><a class="anchor" name="problem-the-semantics-are-opaque-and-confusing"></a>Problem: The Semantics are Opaque and Confusing <a class="hash-link" href="#problem-the-semantics-are-opaque-and-confusing">#</a></h3> -<p>The problem is that these are hidden artifacts attached to the ReactElement. In fact, you probably didn’t even know about it. It silently changes semantics. Take this for example:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&quot;foo&quot;</span> <span class="o">/&gt;</span><span class="p">;</span> -<span class="kr">class</span> <span class="nx">Component</span> <span class="p">{</span> - <span class="nx">render</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="nx">bar</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&quot;bar&quot;</span> <span class="o">/&gt;</span> <span class="o">:</span> <span class="nx">foo</span><span class="p">;</span> - <span class="p">}</span> -<span class="p">}</span> -</code></pre></div> -<p>These two inputs have different owners, therefore React will not keep its state when the conditional switches. There is nothing in the code to indicate that. Similarly, if you use <code>React.addons.cloneWithProps</code>, the owner changes.</p> -<h3><a class="anchor" name="problem-timing-matters"></a>Problem: Timing Matters <a class="hash-link" href="#problem-timing-matters">#</a></h3> -<p>The owner is tracked by the currently executing stack. This means that the semantics of a ReactElement varies depending on when it is executed. Take this example:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kr">class</span> <span class="nx">A</span> <span class="p">{</span> - <span class="nx">render</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="o">&lt;</span><span class="nx">B</span> <span class="nx">renderer</span><span class="o">=</span><span class="p">{</span><span class="nx">text</span> <span class="o">=&gt;</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">text</span><span class="p">}</span><span class="o">&lt;</span><span class="sr">/span&gt;} /</span><span class="o">&gt;</span><span class="p">;</span> - <span class="p">}</span> -<span class="p">}</span> -<span class="kr">class</span> <span class="nx">B</span> <span class="p">{</span> - <span class="nx">render</span><span class="p">()</span> <span class="p">{</span> - <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">renderer</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span> - <span class="p">}</span> -<span class="p">}</span> -</code></pre></div> -<p>The owner of the <code>span</code> is actually <code>B</code>, not <code>A</code> because of the timing of the callback. This all adds complexity and suffers from similar problems as mutation.</p> -<h3><a class="anchor" name="problem-it-couples-jsx-to-react"></a>Problem: It Couples JSX to React <a class="hash-link" href="#problem-it-couples-jsx-to-react">#</a></h3> -<p>Have you wondered why JSX depends on React? Couldn’t the transpiler have that built-in to its runtime? The reason you need to have <code>React.createElement</code> in scope is because we depend on internal state of React to capture the current &quot;owner&quot;. Without this, you wouldn’t need to have React in scope.</p> -<h3><a class="anchor" name="solution-make-context-parent-based-instead-of-owner-based"></a>Solution: Make Context Parent-Based Instead of Owner-Based <a class="hash-link" href="#solution-make-context-parent-based-instead-of-owner-based">#</a></h3> -<p>The first thing we’re doing is warning you if you’re using the &quot;owner&quot; feature in a way that relies on it propagating through owners. Instead, we’re planning on propagating it through parents to its children. In almost all cases, this shouldn’t matter. In fact, parent-based contexts is simply a superset.</p> -<h3><a class="anchor" name="solution-remove-the-semantic-implications-of-owner"></a>Solution: Remove the Semantic Implications of Owner <a class="hash-link" href="#solution-remove-the-semantic-implications-of-owner">#</a></h3> -<p>It turns out that there are very few cases where owners are actually important part of state-semantics. As a precaution, we’ll warn you if it turns out that the owner is important to determine state. In almost every case this shouldn’t matter. Unless you’re doing some weird optimizations, you shouldn’t see this warning.</p> -<h3><a class="anchor" name="pending-change-the-refs-semantics"></a>Pending: Change the refs Semantics <a class="hash-link" href="#pending-change-the-refs-semantics">#</a></h3> -<p>Refs are still based on &quot;owner&quot;. We haven’t fully solved this special case just yet.</p> - -<p>In 0.13 we introduced a new callback-refs API that doesn’t suffer from these problems but we’ll keep on a nice declarative alternative to the current semantics for refs. As always, we won’t deprecate something until we’re sure that you’ll have a nice upgrade path.</p> -<h2><a class="anchor" name="keyed-objects-as-maps"></a>Keyed Objects as Maps <a class="hash-link" href="#keyed-objects-as-maps">#</a></h2> -<p>In React 0.12, and earlier, you could use keyed objects to provide an external key to an element or a set. This pattern isn’t actually widely used. It shouldn’t be an issue for most of you.</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span><span class="p">{</span> <span class="p">{</span><span class="nx">a</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="o">/&gt;</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="o">/&gt;</span><span class="p">}</span> <span class="p">}</span><span class="o">&lt;</span><span class="err">/div&gt;</span> -</code></pre></div><h3><a class="anchor" name="problem-relies-on-enumeration-order"></a>Problem: Relies on Enumeration Order <a class="hash-link" href="#problem-relies-on-enumeration-order">#</a></h3> -<p>The problem with this pattern is that it relies on enumeration order of objects. This is technically unspecified, even though implementations now agree to use insertion order. Except for the special case when numeric keys are used.</p> -<h3><a class="anchor" name="problem-using-objects-as-maps-is-bad"></a>Problem: Using Objects as Maps is Bad <a class="hash-link" href="#problem-using-objects-as-maps-is-bad">#</a></h3> -<p>It is generally accepted that using objects as maps screw up type systems, VM optimizations, compilers etc. It is much better to use a dedicated data structure like ES6 Maps.</p> - -<p>More importantly, this can have important security implications. For example this has a potential security problem:</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">children</span> <span class="o">=</span> <span class="p">{};</span> -<span class="nx">items</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">item</span> <span class="o">=&gt;</span> <span class="nx">children</span><span class="p">[</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="p">]</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="o">/&gt;</span><span class="p">);</span> -<span class="k">return</span> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">children</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/div&gt;;</span> -</code></pre></div> -<p>Imagine if <code>item.title === &#39;__proto__&#39;</code> for example.</p> -<h3><a class="anchor" name="problem-cant-be-differentiated-from-arbitrary-objects"></a>Problem: Can’t be Differentiated from Arbitrary Objects <a class="hash-link" href="#problem-cant-be-differentiated-from-arbitrary-objects">#</a></h3> -<p>Since these objects can have any keys with almost any value, we can’t differentiate them from a mistake. If you put some random object, we will try our best to traverse it and render it, instead of failing with a helpful warning. In fact, this is one of the few places where you can accidentally get an infinite loop in React.</p> - -<p>To differentiate ReactElements from one of these objects, we have to tag them with <code>_isReactElement</code>. This is another issue preventing us from inlining ReactElements as simple object literals.</p> -<h3><a class="anchor" name="solution-just-use-an-array-and-key"></a>Solution: Just use an Array and key={…} <a class="hash-link" href="#solution-just-use-an-array-and-key">#</a></h3> -<p>Most of the time you can just use an array with keyed ReactElements.</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="kd">var</span> <span class="nx">children</span> <span class="o">=</span> <span class="nx">items</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">item</span> <span class="o">=&gt;</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">);</span> -<span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">children</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/div&gt;</span> -</code></pre></div><h3><a class="anchor" name="solution-react.addons.createfragment"></a>Solution: React.addons.createFragment <a class="hash-link" href="#solution-react.addons.createfragment">#</a></h3> -<p>However, this is not always possible if you’re trying to add a prefix key to an unknown set (e.g. this.props.children). It is also not always the easiest upgrade path. Therefore, we are adding a helper to <code>React.addons</code> called <code>createFragment()</code>. This accepts a keyed object and returns an opaque type.</p> -<div class="highlight"><pre><code class="language-js" data-lang="js"><span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">React</span><span class="p">.</span><span class="nx">addons</span><span class="p">.</span><span class="nx">createFragment</span><span class="p">({</span> <span class="nx">a</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">div</span> <span class="o">/&gt;</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">children</span> <span class="p">})}</span><span class="o">&lt;</span><span class="err">/div&gt;</span> -</code></pre></div> -<p>The exact signature of this kind of fragment will be determined later. It will likely be some kind of immutable sequence.</p> - -<p>Note: This will still not be valid as the direct return value of <code>render()</code>. Unfortunately, they still need to be wrapped in a <code>&lt;div /&gt;</code> or some other element.</p> -<h2><a class="anchor" name="compiler-optimizations-unlocked"></a>Compiler Optimizations: Unlocked! <a class="hash-link" href="#compiler-optimizations-unlocked">#</a></h2> -<p>These changes also unlock several possible compiler optimizations for static content in React 0.14. These optimizations were previously only available to template-based frameworks. They will now also be possible for React code! Both for JSX and <code>React.createElement/Factory</code>*!</p> - -<p>See these GitHub Issues for a deep dive into compiler optimizations:</p> - -<ul> -<li><a href="https://github.com/facebook/react/issues/3226">Reuse Constant Value Types</a></li> -<li><a href="https://github.com/facebook/react/issues/3227">Tagging ReactElements</a></li> -<li><a href="https://github.com/facebook/react/issues/3228">Inline ReactElements</a></li> -</ul> - -<p>* If you use the recommended pattern of explicit React.createFactory calls on the consumer side - since they are easily statically analyzed.</p> -<h2><a class="anchor" name="rationale"></a>Rationale <a class="hash-link" href="#rationale">#</a></h2> -<p>I thought that these changes were particularly important because the mere existence of these patterns means that even components that DON’T use these patterns have to pay the price. There are other problematic patterns such as mutating state, but they’re at least localized to a component subtree so they don’t harm the ecosystem.</p> - -<p>As always, we’d love to hear your feedback and if you have any trouble upgrading, please let us know.</p> - - 2015-02-24T11:00:00-08:00 - http://facebook.github.io/react/blog/2015/02/24/streamlining-react-elements.html - http://facebook.github.io/react/blog/2015/02/24/streamlining-react-elements.html - - diff --git a/index.html b/index.html index 91d5bab4b5..219d4425b7 100644 --- a/index.html +++ b/index.html @@ -68,7 +68,7 @@
@@ -159,7 +159,7 @@

diff --git a/js/JSXTransformer.js b/js/JSXTransformer.js index ad8bdbde21..19a5fc0f82 100644 --- a/js/JSXTransformer.js +++ b/js/JSXTransformer.js @@ -1,5 +1,5 @@ /** - * JSXTransformer v0.13.1 + * JSXTransformer v0.13.2 */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSXTransformer = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o>>= 0 // coerce to uint32 - var self = this if (Buffer.TYPED_ARRAY_SUPPORT) { // Preferred: Return an augmented `Uint8Array` instance for best performance - /*eslint-disable consistent-this */ - self = Buffer._augment(new Uint8Array(length)) - /*eslint-enable consistent-this */ + self = Buffer._augment(new Uint8Array(length)) // eslint-disable-line consistent-this } else { // Fallback: Return THIS instance of Buffer (created by `new`) self.length = length @@ -557,7 +555,7 @@ function Buffer (subject, encoding, noZero) { } } else if (type === 'string') { self.write(subject, 0, encoding) - } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { + } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT) { for (i = 0; i < length; i++) { self[i] = 0 } @@ -568,10 +566,10 @@ function Buffer (subject, encoding, noZero) { return self } -function SlowBuffer (subject, encoding, noZero) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding, noZero) +function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) - var buf = new Buffer(subject, encoding, noZero) + var buf = new Buffer(subject, encoding) delete buf.parent return buf } @@ -619,7 +617,7 @@ Buffer.isEncoding = function isEncoding (encoding) { } Buffer.concat = function concat (list, totalLength) { - if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') if (list.length === 0) { return new Buffer(0) @@ -1012,7 +1010,7 @@ Buffer.prototype.slice = function slice (start, end) { newBuf = Buffer._augment(this.subarray(start, end)) } else { var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined, true) + newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; i++) { newBuf[i] = this[i + start] } @@ -1456,8 +1454,6 @@ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, target_start, start, end) { - var self = this // source - if (!start) start = 0 if (!end && end !== 0) end = this.length if (target_start >= target.length) target_start = target.length @@ -1466,13 +1462,13 @@ Buffer.prototype.copy = function copy (target, target_start, start, end) { // Copy 0 bytes; we're done if (end === start) return 0 - if (target.length === 0 || self.length === 0) return 0 + if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (target_start < 0) { throw new RangeError('targetStart out of bounds') } - if (start < 0 || start >= self.length) throw new RangeError('sourceStart out of bounds') + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? @@ -1557,8 +1553,7 @@ Buffer._augment = function _augment (arr) { arr.constructor = Buffer arr._isBuffer = true - // save reference to original Uint8Array get/set methods before overwriting - arr._get = arr.get + // save reference to original Uint8Array set method before overwriting arr._set = arr.set // deprecated, will be removed in node 0.13+ diff --git a/js/react.js b/js/react.js index 2b767c8d6d..4233aec5f2 100644 --- a/js/react.js +++ b/js/react.js @@ -1,5 +1,5 @@ /** - * React v0.13.1 + * React v0.13.2 */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.React = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oSometimes you do want to keep the CSS properties unitless. Here's a list of properties that won't get the automatic "px" suffix:

    +
  • boxFlex
  • +
  • boxFlexGroup
  • columnCount
  • fillOpacity
  • flex
  • flexGrow
  • +
  • flexPositive
  • flexShrink
  • +
  • flexNegative
  • fontWeight
  • lineClamp
  • lineHeight