Compare commits

...

859 Commits

Author SHA1 Message Date
Paul O’Shannessy
f308c03455 v0.13.1 2015-03-16 16:50:30 -07:00
Paul O’Shannessy
d4424e87a7 Update Readme for 0.13.1 2015-03-16 16:41:33 -07:00
Paul O’Shannessy
3003dcc0b1 Changelog for 0.13.1 2015-03-16 16:40:40 -07:00
Paul O’Shannessy
8436732a23 Merge pull request #3427 from zpao/full-page-dom-components
Ensure FullPageComponents are treated as DOM components
(cherry picked from commit dacd4db1fa)
2015-03-16 16:27:28 -07:00
Ben Alpert
a82e70ed34 Merge pull request #3414 from spicyj/gh-3407
Fix up Perf a bit better for 0.13
(cherry picked from commit 0a312bba89)
2015-03-16 16:27:28 -07:00
Ben Alpert
2e72fd8e43 Merge pull request #3412 from spicyj/gh-3329
Squash getDOMNode warning from isDOMComponent
(cherry picked from commit ed257cb691)
2015-03-16 16:27:28 -07:00
Ben Alpert
6cc7567eff Merge pull request #3410 from robertknight/3409-style-null-to-nonnull
Fix incorrect update of style when props.style transitions from null to non-null
(cherry picked from commit bcd70ad500)
2015-03-16 16:27:27 -07:00
Paul O’Shannessy
cfbf1d559f Merge pull request #3402 from vkramskikh/fix-empty-selects-with-value
Fix for empty <select> elements with value
(cherry picked from commit 68a2f89cc6)
2015-03-16 16:27:27 -07:00
Paul O’Shannessy
ce9fd5f028 Merge pull request #3381 from zpao/jsx-nonstrictmodule
Fix module option parsing of jsx command
(cherry picked from commit b0a59a643a)
2015-03-16 16:27:27 -07:00
Paul O’Shannessy
9432aceb4d version bump for dev 2015-03-16 16:27:27 -07:00
Paul O’Shannessy
9f95d8793e Merge pull request #3419 from xmo-odoo/patch-1
Link to inserting raw HTML document
2015-03-16 16:24:13 -07:00
Jim
9e0954abdd Merge pull request #3422 from jviereck/doc-typo-fix
Fix small typo ("of" instead of "or")
2015-03-16 16:24:08 -07:00
Paul O’Shannessy
71f65d3da6 Merge pull request #3394 from cody/getDOMNode
Fix in docs: getDOMNode --> findDOMNode
2015-03-16 16:24:03 -07:00
Paul O’Shannessy
fe8d706c1c v0.13 starter kit 2015-03-10 14:47:44 -07:00
Paul O’Shannessy
edb8f7f4af v0.13.0 2015-03-10 14:45:29 -07:00
Paul O’Shannessy
594f816930 Update readme for 0.13 2015-03-10 14:45:29 -07:00
Paul O’Shannessy
94bf54a328 shrinkwrap 2015-03-10 14:45:29 -07:00
Ben Alpert
df18770a0c with the exception for -> with the exception of 2015-03-10 14:44:44 -07:00
Ben Alpert
ab7084f71d Merge pull request #3366 from sebmarkbage/docs2
ES6 Class Docs
2015-03-10 14:44:23 -07:00
Sebastian Markbage
efebdb2925 ES6 Class Docs
Some minor burried docs.
2015-03-10 14:41:42 -07:00
Ben Alpert
085bf8635c Add deprecation note to blog post and changelog 2015-03-10 14:22:03 -07:00
Paul O’Shannessy
5f791be022 [docs] Update acknowledgements
Missed updating this in #3283 before merging.
2015-03-10 13:57:44 -07:00
Paul O’Shannessy
139012cd6a Merge pull request #3283 from zpao/0.13-authors
Update AUTHORS for 0.13
2015-03-10 13:56:52 -07:00
Paul O’Shannessy
a95d6ff0df Update AUTHORS for 0.13 2015-03-10 13:55:55 -07:00
Paul O’Shannessy
5e79bd5c4f Changelog for 0.13 2015-03-10 13:47:15 -07:00
Paul O’Shannessy
deeb55b6e7 Merge pull request #3363 from zpao/0.13-docs-cloneelement
[docs] React.cloneElement
2015-03-10 13:46:12 -07:00
Paul O’Shannessy
a5bdc92990 A couple small changes to the changelog for 0.13 2015-03-10 13:43:15 -07:00
Jim
565e2ecbac Merge pull request #3364 from jsfb/refs-docs
Added docs about the ref-as-callback.
2015-03-10 13:02:18 -07:00
Jim
f3811e68fa Added docs about the ref-as-callback. 2015-03-10 13:01:07 -07:00
Ben Alpert
4fb9644823 0.13 blog post 2015-03-10 12:57:50 -07:00
Paul O’Shannessy
62d5d646db Merge pull request #3362 from jsfb/docs-for-setstate
Added docs about the first-parameter-is-function version of setState.
2015-03-10 12:29:25 -07:00
Paul O’Shannessy
969d92a411 Merge pull request #3354 from zpao/0.13-examples
Update the examples for 0.13
2015-03-10 11:57:35 -07:00
Paul O’Shannessy
ce66a796ee Update the examples for 0.13
The only substantial difference here is that I made the harmony example use ES6
classes. The server rendering example was pretty wacky and hard to run but
I did confirm that it works.
2015-03-10 11:56:25 -07:00
Jim
7569e810e7 Added docs about the first-parameter-is-function version of setState. 2015-03-10 11:47:00 -07:00
Paul O’Shannessy
45cc5006d7 [docs] React.cloneElement 2015-03-10 11:19:11 -07:00
Paul O’Shannessy
ee019d6cc5 Merge pull request #3360 from zpao/0.13-docs-api-deprecations
Add deprecation note for deprecated component APIs
2015-03-10 11:07:47 -07:00
Paul O’Shannessy
b4962eff43 Merge pull request #3361 from zpao/deprecate-replaceprops
Deprecate replaceProps
2015-03-10 11:07:34 -07:00
Paul O’Shannessy
9d58e9a27b Deprecate replaceProps
This isn't supported on plain JS classes anyway, so this is just adding
a warning in DEV before the code throws.
2015-03-10 10:44:47 -07:00
Paul O’Shannessy
b038943653 Add deprecation note for deprecated component APIs 2015-03-10 10:44:24 -07:00
Ben Alpert
79a34e80b1 Merge pull request #3358 from coliff/patch-1
Update relevant URLS to HTTPS
2015-03-10 10:03:59 -07:00
Paul O’Shannessy
f41904cf99 Merge pull request #2963 from graue/document-shallow-testing
Add documentation for shallow testing
2015-03-10 09:39:47 -07:00
Ben Alpert
ca08f7546e Merge pull request #3353 from spicyj/frag
Add docs for createFragment
2015-03-10 09:17:51 -07:00
Ben Alpert
b7732ba7c0 Add docs for createFragment 2015-03-10 09:17:34 -07:00
Christian
dbba47d5d2 Update relevant URLS to HTTPS
Update relevant URLS to HTTPS
2015-03-10 18:11:29 +09:00
Paul O’Shannessy
dd6b8ab8b9 Merge pull request #3347 from koba04/fix-perf-displayname
Fix addons.Perf displayName with ES6 classes
2015-03-09 21:32:24 -07:00
Toru Kobayashi
29506cec54 Fix Perf displayName with ES6 classes 2015-03-10 09:45:40 +09:00
Paul O’Shannessy
62ee384d7b Merge pull request #3330 from spicyj/no-render
Add warning when using non-component element types
2015-03-09 13:47:39 -07:00
Paul O’Shannessy
eaed4d7804 Merge pull request #3345 from zertosh/update-derequire
Update derequire (and greatly improve build speed)
2015-03-09 13:46:49 -07:00
Paul O’Shannessy
769e1cea03 Merge pull request #3337 from facebook/cpojer-patch-2
"Better" duck typing in reactComponentExpect
2015-03-09 13:45:50 -07:00
Paul O’Shannessy
8a3dd040a0 Merge pull request #3331 from zpao/null-frag-proptypes
Allow null and undefined values in non-frag object passed to PropTypes.node
2015-03-09 13:43:26 -07:00
Paul O’Shannessy
57bed796ef Merge pull request #3339 from gabelevi/patch-1
Update jstransform and esprima-fb dependencies
2015-03-09 13:19:41 -07:00
Jim
ccb5ccd5a0 Merge pull request #3341 from rickbeerendonk/3338-documentation-issue
Add documentation about JSX and displayName.
2015-03-09 10:35:28 -07:00
Andres Suarez
9941095dc3 Update to derequire@^2.0.0 2015-03-08 23:43:47 -04:00
Ben Alpert
208b258519 Merge pull request #3343 from BinaryMuse/docs/bkt-add-contextmenu-event
Add onContextMenu to events doc
2015-03-07 20:27:57 -08:00
BinaryMuse
1aa9580484 Add onContextMenu to events doc 2015-03-07 20:22:10 -08:00
Rick Beerendonk
2184162e38 Add documentation about JSX and displayName.
The section that described how JSX transform handles displayName was lost in commit 9b1ee4de46

Fixes #3338
2015-03-07 19:01:58 +01:00
Gabe Levi
ac5af1ec45 Update jstransform and esprima-fb dependencies 2015-03-06 18:31:29 -05:00
Ben Alpert
b95ad296da Merge pull request #3336 from facebook/cpojer-patch-1
Fix documentation typo in ReactComponent
2015-03-06 10:07:45 -08:00
Christoph Pojer
8ce9e2b194 Update reactComponentExpect.js 2015-03-06 02:46:33 -08:00
Christoph Pojer
419038f846 Fix documentation typo in ReactComponent 2015-03-06 01:33:56 -08:00
Paul O’Shannessy
0e797dffe4 Allow null and undefined values in non-frag object passed to PropTypes.node 2015-03-05 17:56:50 -08:00
Jim
c7c2e05c33 Merge pull request #2802 from jsfb/findDOMNode-in-docs
Updated docs examples/recommendations to use findDOMNode instead of getDOMNode
2015-03-05 16:51:13 -08:00
Jim
030fc752ba Updated docs examples/recommendations to use findDOMNode instead of getDOMNode 2015-03-05 16:42:43 -08:00
Ben Alpert
6dbef56da3 Merge pull request #3333 from ariabuckles/docs
[Docs] Add 'ing' to make "opening" and "closing" line up
2015-03-05 16:28:04 -08:00
Aria Buckles
7eb6f68e7c [Docs] Add 'ing' to make "opening" and "closing" line up
Test Plan:
None
2015-03-05 16:25:41 -08:00
Ben Alpert
6b7e4dc8e8 Add warning when using non-component element types
This should make debugging easier for people who missed callsites when fixing up their JSX/non-JSX usage.
2015-03-05 15:24:31 -08:00
Paul O’Shannessy
fa8961118a Merge pull request #3294 from zpao/jsxcompiler-linenumbers
[docs] show line numbers in online jsx compiler
2015-03-04 18:45:18 -08:00
Paul O’Shannessy
bda845cf4c [docs] Fox Ryan's name: #3311 2015-03-04 12:32:41 -08:00
Christopher Chedeau
4485903d40 Update round-up 25
(cherry picked from commit 40336d8144)
2015-03-04 12:32:37 -08:00
Christopher Chedeau
af400ab17b Merge pull request #3304 from facebook/matthewjohnston4-croundup-1
Community Roundup #25 blog post
2015-03-04 09:06:38 -08:00
Jim
71675bb400 Merge pull request #3305 from brafdlog/patch-1
There was a redundant word in the sentence
2015-03-03 14:04:05 -08:00
Paul O’Shannessy
811057aae2 Facebook, not FaceBook 2015-03-03 12:49:02 -08:00
Paul O’Shannessy
a3642d3995 v0.13 rc blog post 2015-03-03 12:42:57 -08:00
brafdlog
457c8e397d There was a redundant word in the sentence 2015-03-03 22:03:53 +02:00
Paul O’Shannessy
2d46d589a1 v0.13.0-rc2 starter kit 2015-03-03 11:46:01 -08:00
Paul O’Shannessy
21b41480a5 v0.13.0-rc2 2015-03-03 11:46:01 -08:00
Paul O’Shannessy
71e583844b Update bower release task
This makes it so we only delete some files during the buld process. We were
losing the LICENSE and PATENTS files.
2015-03-03 11:46:01 -08:00
Paul O’Shannessy
e8ffb80586 [lint] fix errors from new test 2015-03-03 11:23:45 -08:00
Paul O’Shannessy
e114988a2c Sync out another jsx transform test.
We added this test internally and it never got added here. We haven't broken it
with any transforms *yet* but it's still good to actually run all of our tests
here too.
2015-03-03 10:40:07 -08:00
Matthew Johnston
a850603e1c Update 2015-03-03-community-roundup-25.md 2015-03-03 18:34:07 +00:00
Paul O’Shannessy
2e2d79758d Merge pull request #3264 from zpao/transform-jsx
XJS -> JSX
2015-03-03 10:33:08 -08:00
Matthew Johnston
2417b7f4de Update 2015-03-03-community-roundup-25.md 2015-03-03 18:31:45 +00:00
Matthew Johnston
49d5722467 Update 2015-03-03-community-roundup-25.md 2015-03-03 17:56:53 +00:00
Matthew Johnston
e99ef894b8 Community Roundup #25 blog post 2015-03-03 14:20:41 +00:00
Paul O’Shannessy
272ae10b48 Merge pull request #3299 from sebmarkbage/fixwarningformats
Always use a static message formats
2015-03-02 13:19:01 -08:00
Sebastian Markbage
a27c6d1690 Always use a static message formats
These are the only places that seems to be including environment specific
variables in the message format.

By ensuring that they're static, we make it easier to group logs by
format. I also ensure that I keep each addendum separate so that they can
be filtered/grouped separately.
2015-03-02 13:18:38 -08:00
Paul O’Shannessy
4bad1aacb6 Merge pull request #3275 from spicyj/gh-3222
Don't use undefined as parent name in key warning
2015-03-02 12:47:52 -08:00
Paul O’Shannessy
8fdf4bbffc Merge pull request #3276 from spicyj/gh-2978
Add regression test for scry order
2015-03-02 12:46:55 -08:00
Sebastian Markbåge
ecc4ad569a Merge pull request #3266 from sebmarkbage/cloneelement
Add cloneElement Implementation
2015-03-02 12:15:20 -08:00
Sebastian Markbåge
edddd57d28 Merge pull request #3293 from spicyj/gh-3286
ReactFragment counts as a node without warning
2015-03-02 12:10:50 -08:00
Jim
f2c7d9ac81 Merge pull request #3284 from delftswa2014/bugfix/blog/https-urls
Fixed the http url in the blog pages
2015-03-02 11:20:10 -08:00
Paul O’Shannessy
57bd8fe3bb Merge pull request #3295 from koba04/patch-1
Add a code format in 2015-02-24-react-v0.13-rc1.md
2015-03-01 20:48:25 -08:00
Toru Kobayashi
1744977201 Add a code format in 2015-02-24-react-v0.13-rc1.md 2015-03-02 09:33:36 +09:00
Paul O’Shannessy
b2161bd51d [docs] show line numbers in online jsx compiler 2015-03-01 11:53:06 -08:00
Ben Alpert
7ebf7c46f5 ReactFragment counts as a node without warning
Fixes #3286.
2015-03-01 11:50:07 -08:00
Paul O’Shannessy
dc92fa480a Upgrade package dependencies for new esprima/jstransform 2015-03-01 11:25:16 -08:00
Ben Alpert
7346ce5c0b Merge pull request #3288 from apaatsio/remove-unnecessary-variable-in-test
Remove unnecessary variable from test
2015-02-28 13:31:50 -08:00
Antti Ahti
323789540a Remove unnecessary variable from test 2015-02-28 15:23:34 +02:00
Paul O’Shannessy
48e54da484 XJS -> JSX
Part 1: change all of our methods and AST node types.
Part 2: Rename files so there is no trace of XJS
2015-02-27 18:23:18 -08:00
Ben Alpert
673874dc87 Merge pull request #3263 from wmertens/patch-1
beta1 blog entry: Fix CoffeeScript example
2015-02-27 15:28:22 -08:00
PNikray
0e355fc8c4 Fixed the url in community-roundup-9
using http resulted in an error, changing it to https fixes it
2015-02-27 23:43:50 +01:00
PNikray
77ec7da124 Fixed the url in community-roundup-5
using http resulted in an error, changing it to https fixes it
2015-02-27 23:42:14 +01:00
PNikray
94fa077a76 Changed the url of the video in community-round-up-4
The url was using http instead of https, which results in an error.
2015-02-27 23:39:17 +01:00
Ben Alpert
de1f8682d5 Add note about enter/leave bubbling
Fixes #2826.
2015-02-26 16:29:18 -08:00
Ben Alpert
feae9ad0a8 Add regression test for scry order
Fixes #2978.
2015-02-26 15:54:50 -08:00
Ben Alpert
d5fa14de1a Don't use undefined as parent name in key warning
Fixes #3222.
2015-02-26 15:20:37 -08:00
Sebastian Markbåge
1c697ab141 Merge pull request #3265 from sebmarkbage/shouldupdaterefs
Avoid passing `this` of a static object
2015-02-26 13:33:35 -08:00
Sebastian Markbage
4adcee69a0 Add cloneElement Implementation
This is a new version of cloneWithProps but this one is moving out of
add-ons. Unlike cloneWithProps, this one doesn't have special logic for
style, className and children.

This one also preserves the original ref. This is critical when upgrading
from a mutative pattern where a child might have a ref on it.

It also preserves context, which is similar to how context would work when
it is parent based. It also ensures that we're compatible with the old
mutative pattern which makes updates easier.
2015-02-26 01:17:05 -08:00
Sebastian Markbage
061c6fc13c Avoid passing this of a static object
Refactoring artifact.
2015-02-25 18:37:02 -08:00
Ben Alpert
618bbdc531 Merge pull request #3239 from rralian/update/docs-clarify-forceUpdate
Docs: clarifies forceUpdate method
2015-02-25 17:35:07 -08:00
Wout Mertens
ce7190537f beta1 blog entry: Fix CoffeeScript example
Fix the constructor call and make code more idiomatic.
2015-02-26 00:26:16 +01:00
Paul O’Shannessy
84ddd9deaf Merge pull request #3257 from danmane/update-tutorial-md
Add mention of go and php server implementations in React tutorial
2015-02-25 12:46:17 -08:00
Daniel Mané
a7ae40e90d Add mention of go and php server implementations in React tutorial 2015-02-24 15:10:11 -08:00
Paul O’Shannessy
63146e1f16 v0.13 RC blog post
Note: we need to manually specify date in these files so that the sort order is
correct (2 posts on the same day). Otherwise it will just be ABC order, which
is wrong.

Closes: #3256
2015-02-24 14:05:57 -08:00
Paul O’Shannessy
7269422825 Fix typo
(cherry picked from commit 4d90b9bdf3)
2015-02-24 12:49:19 -08:00
Paul O’Shannessy
888daccf9f Merge pull request #3255 from chenglou/fix-blog-post
[Blog] Fix post code snippet display
2015-02-24 12:39:28 -08:00
Cheng Lou
99d23a54bc [Blog] Fix post code snippet display
I think nokogiri (is that what we use?) accidentally escaped this
snippet. Simply putting spaces between braces fixes it.
2015-02-24 15:22:25 -05:00
Paul O’Shannessy
2f20091520 Merge pull request #3250 from sebmarkbage/blogpost
Add Blog Post about ReactElement Changes in 0.13
2015-02-24 11:26:55 -08:00
Sebastian Markbage
cd47798c59 Add Blog Post about ReactElement Changes in 0.13
Explains some of the rationale for the new warnings added in 0.13.
2015-02-24 10:54:03 -08:00
Paul O’Shannessy
44d91295cb Merge pull request #3251 from Simek/empty-docs-prevnext-fix
do not show empty "docs-prevnext" div on single page
2015-02-24 09:24:23 -08:00
Bartosz Kaszubowski
f785dd09ea do not show empty "docs-prevnext" div on single page
to remove additional necessary spacing between content and footer
2015-02-24 16:28:47 +01:00
Bob Ralian
8d29520dc7 clarifies forceUpdate method 2015-02-23 10:34:41 -06:00
Paul O’Shannessy
95206fe5dc Make cloneWithProps typechecks static-only 2015-02-22 14:40:39 -08:00
Paul O’Shannessy
a30e25467d v0.13.0-rc1 starter kit 2015-02-22 13:32:25 -08:00
Paul O’Shannessy
06126ad3f4 v0.13.0-rc1 2015-02-22 13:26:13 -08:00
Paul O’Shannessy
4f26cc1414 Update dependencies 2015-02-22 13:26:13 -08:00
Paul O’Shannessy
d83fa6a6bf Merge pull request #3224 from Simek/patch-2
wider Twitter timeline on support page
2015-02-22 13:10:43 -08:00
Paul O’Shannessy
fe16c8292c Merge pull request #3232 from artnez/master
Add vendor/inline-source-map.js to package.json
2015-02-22 13:01:05 -08:00
Paul O’Shannessy
029e64bb56 Merge pull request #3233 from artnez/es6-call-spread
Add support for jstransform es6-call-spread
2015-02-22 12:57:25 -08:00
Artem Nezvigin
0bc4aafb74 Add support for jstransform es6-call-spread 2015-02-22 11:57:06 -08:00
Artem Nezvigin
d7791a7cbb Add vendor/inline-source-map.js to package.json 2015-02-22 11:11:48 -08:00
Bartosz Kaszubowski
087cd7b27a wider Twitter timeline on support page 2015-02-21 23:20:09 +01:00
Paul O’Shannessy
5ab7fdecfe Merge pull request #2994 from chenglou/docs-classset
[Docs] Add note on classSet deprecation
2015-02-20 17:00:36 -08:00
Paul O’Shannessy
4046b92487 Merge pull request #2847 from zpao/jsx-es5
Expose --target=esversion flag on jsx executable
2015-02-20 15:19:37 -08:00
Paul O’Shannessy
d40be68d2c Expose --target flag on jsx executable
Valid values are 'es3' and 'es5'.
es3: perform reserved words quoting, don't use defineProperty
es5: default, don't do the above, class methods non-enumerable
2015-02-20 13:37:42 -08:00
Paul O’Shannessy
821383165f Merge pull request #3212 from denis-sokolov/patch-1
Contributing: cleanup quote style
2015-02-20 08:20:18 -08:00
Denis Sokolov
ae3e85d9e4 Contributing: cleanup quote style
The line above it recommends `'` over `"`, and yet the line in question uses `"`.
2015-02-20 12:06:33 +02:00
Greg Hurrell
531add88c4 Add Relay blog post
closes #3174
2015-02-19 21:27:45 -08:00
Paul O’Shannessy
85baea4404 Merge pull request #3209 from chicoxyzzy/eslint-everywhere
lint from root
2015-02-19 20:59:44 -08:00
Paul O’Shannessy
362e9595c4 Fix long lines in vendor/fbtransform/visitors
I meant to do this with #3206 but forgot to add them.
2015-02-19 18:43:06 -08:00
Paul O’Shannessy
a3ee6a9548 Merge pull request #2993 from chenglou/classset-ded
Put deprecation warning for classSet
2015-02-19 18:36:36 -08:00
Jim
8326a9f11e Merge pull request #2921 from hanski07/updateTransferringPropsDocs
Update transferring props docs
2015-02-19 17:52:02 -08:00
chico
90ce7f67d7 lint vendor/*.js 2015-02-20 04:37:45 +03:00
chico
ed6d02e1a8 fix .eslintignore 2015-02-20 04:31:21 +03:00
Jim
8913a07ada Merge pull request #3161 from koba04/fix-clone-with-props-document
Fix a doc. cloneWithProps clones a ReactElement.
2015-02-19 17:14:53 -08:00
chico
1876bc2432 remove ballmer example 2015-02-20 04:13:07 +03:00
Toru Kobayashi
60e96edce2 Fix a doc. cloneWithProps clones a ReactElement. 2015-02-20 10:08:46 +09:00
chico
466f4faf4e lint from root 2015-02-20 04:06:15 +03:00
Jim
d69329a17c Merge pull request #3208 from jsfb/clonewithprops-jsdocs
Fixed mistake in jsdocs types for cloneWithProps
2015-02-19 17:02:28 -08:00
Jim
bad85fafa1 Fixed mistake in jsdocs types for cloneWithProps 2015-02-19 16:38:25 -08:00
Cheng Lou
835316bc13 Put deprecation warning for classSet
Also removes the one test that used the module.
2015-02-19 19:31:54 -05:00
Paul O’Shannessy
c889f409bf Merge pull request #3191 from zpao/jsxtransformer-use-shared-code
Use same pathways for browser transforms as we use in react-tools
2015-02-19 16:09:41 -08:00
Paul O’Shannessy
cb3e797236 Merge pull request #3206 from zpao/lint-fbtransform
Lint vendor/fbtransform as well
2015-02-19 16:06:38 -08:00
Paul O’Shannessy
e60db7316f Merge pull request #3198 from zpao/jsx-option-parsing
Move option parsing into react-tools proper.
2015-02-19 15:54:11 -08:00
Paul O’Shannessy
0f85884fa4 Merge pull request #3201 from zpao/non-factory-invariant
Warn when using constructor function directly
2015-02-19 15:53:50 -08:00
Sebastian Markbåge
977204991b Merge pull request #3205 from sebmarkbage/warningfixes
More warnings to ReactFragment.create
2015-02-19 15:43:18 -08:00
Paul O’Shannessy
e830cea050 Lint vendor/fbtransform as well 2015-02-19 15:26:27 -08:00
Sebastian Markbage
5a2c80382c More warnings to ReactFragment.create
Apparently I could've used these too because if you accept an arbitrary
node, then these could end up being objects, but those objects might
also be arrays or elements.
2015-02-19 15:11:49 -08:00
Paul O’Shannessy
02d225f26e Merge pull request #3193 from fisherwebdev/remove_lodash
Remove lodash devDependency
2015-02-19 14:22:34 -08:00
Paul O’Shannessy
ad31cfa4dc Warn when using constructor function directly
We no longer support the legacy factory style of calling component constructors
directly. We only support createElement or the wrapping of classes with
createFactory. Instead of letting this fail in a gross way as we try to run,
add a nice warning that shows up before the gross TypeError.
2015-02-19 13:57:48 -08:00
Jim
a2f77208e6 Merge pull request #3180 from cody/https
Using https URLs for embedded fiddles
2015-02-19 13:18:34 -08:00
Paul O’Shannessy
21a9e8b6e8 Merge pull request #3189 from hzoo/more-lint
More lint - remove spaces in object braces / array brackets
2015-02-19 11:42:02 -08:00
Paul O’Shannessy
629d400774 Merge pull request #3165 from oiva/jquery-mobile-example
Change how components are rendered in jQuery Mobile example. Fixes #2880
2015-02-19 10:48:26 -08:00
Paul O’Shannessy
112f7aa249 Move option parsing into react-tools proper.
We were doing some preprocessing for module options in the command line. Since
we also expose the same API via react-tools (and JSXTransformer), we need to do
the same processing from the API. So just move it all to the same place.
2015-02-19 09:46:25 -08:00
fisherwebdev
10d336d4eb Remove lodash devDependency 2015-02-18 22:41:58 -08:00
Steven Luscher
f1288d1055 Added the immutability talk to the React.js Conf update.
(cherry picked from commit de8b3eb9d4)
2015-02-18 21:42:11 -08:00
Paul O’Shannessy
0e0a8f65c5 Use same pathways for browser transforms as we use in react-tools
This makes sure we can use the same options everywhere, even from react-rails,
without having to specify each one separately in JSXTransformer as well.
2015-02-18 21:40:16 -08:00
Henry Zhu
eba5d1365c lint: remove spaces from array brackets 2015-02-19 00:13:36 -05:00
Henry Zhu
07cfd66028 lint: remove spaces from object braces 2015-02-19 00:10:31 -05:00
Timothy Yung
b0789c9582 Merge pull request #3187 from yungsters/shallow
Support unmounting in ReactShallowRenderer
2015-02-18 17:47:12 -08:00
yungsters
e9e33b984f Support unmounting in ReactShallowRenderer
Reviewers: @sebmarkbage, @zpao

Test Plan:

```
$ npm test ReactTestUtils
```
2015-02-18 17:45:42 -08:00
Paul O’Shannessy
6c29eba035 Merge pull request #2821 from zpao/unitless-css-boxflex
Add boxFlex and boxFlexGroup to CSS Unitless Properties
2015-02-18 17:22:56 -08:00
Stefan Dombrowski
8ba3ba49d2 Using https for embedded fiddles
Official announcement from jsfiddle:
https://twitter.com/jsfiddle/status/565041134435852289
2015-02-18 23:07:48 +01:00
Paul O’Shannessy
6f7b9a97bf Merge pull request #3108 from zpao/quadratic-example
Replace Ballmer Peak example with Quadratic Formula
2015-02-18 14:02:17 -08:00
Paul O’Shannessy
1caeda30ea Replace Ballmer Peak example with Quadratic Formula 2015-02-18 13:59:26 -08:00
Steven Luscher
85a6462062 Added special edition round-up for React.js Conf 2015
(cherry picked from commit 233980826c)
2015-02-18 13:30:26 -08:00
Sebastian Markbåge
5499321d63 Merge pull request #3183 from yungsters/master
Support rendering to null in ShallowComponentRenderer
2015-02-18 11:43:07 -08:00
yungsters
e952869ff8 Support rendering to null in ShallowComponentRenderer
Reviewers: @sema, @zpao

Test Plan:
```
$ npm jest
```
2015-02-18 11:31:02 -08:00
Sebastian Markbåge
00a3b9233f Merge pull request #3177 from sebmarkbage/fixbindwarningstring
Forgotten string
2015-02-17 18:26:32 -08:00
Sebastian Markbage
377319b863 Forgotten string
We forgot this `%s` as this was converted.
2015-02-17 18:26:12 -08:00
Sebastian Markbåge
c61207588d Merge pull request #3175 from sebmarkbage/fixhasownorder
Avoid reading the property if hasOwnProperty is false
2015-02-17 16:02:18 -08:00
Sebastian Markbage
67cf95c16d Avoid reading the property if hasOwnProperty is false
Easy with an Object.assign polyfill
2015-02-17 15:59:01 -08:00
Sebastian Markbåge
de3ecabd6c Merge pull request #3148 from hmarr/fix-nan-mutation-warning
Prevent NaN props from triggering warnings
2015-02-17 15:41:18 -08:00
Sebastian Markbåge
cf4bef8bd7 Merge pull request #3171 from sebmarkbage/moarwarnings
Moar Warnings
2015-02-17 15:09:33 -08:00
Oiva Eskola
4c32fb487e Wrap jQuery Mobile example's components with React.createFactory to fix on v0.13.0. Fixes #2880 2015-02-18 00:13:13 +02:00
Jim
f6920ba377 Merge pull request #3170 from adelevie/patch-1
Make tutorial CDN URLs use https
2015-02-17 11:50:54 -08:00
Sebastian Markbage
2490289c4a Warn if getDOMNode or isMounted is accessed in render
This is an anti-pattern that can be easily avoided by putting the logic
in componentDidMount and componentDidUpdate instead.

It creates a dependency on stale data inside render without enforcing
a two-pass render.
2015-02-17 11:49:20 -08:00
Alan deLevie
4980bcb0f3 Make tutorial CDN URLs use https 2015-02-17 14:34:01 -05:00
Sebastian Markbage
91194126d8 Warn if using Maps as children
We're not sure if this is the way we want to support this API. It creates
two ways of doing things.

It is convenient to avoid needing to explicitly redefine the key of Maps.
However, this use case isn't as common as having an iterable where the
key is on the value, not the key.
2015-02-17 11:23:12 -08:00
Paul O’Shannessy
a8d9bff3ca Merge pull request #3168 from briankung/docs-jsx-namespacing
[Docs] Clarify section on namespaced components
2015-02-17 11:10:33 -08:00
Paul O’Shannessy
9e2da7a0ae Merge pull request #3164 from oiva/master
Fix sourcemap filenames when using transformWithDetails. Fixes #3140
2015-02-17 11:07:19 -08:00
Sebastian Markbage
3587460675 Warn if accessing .type on a factory
This was an important convenience as an upgrade path but shouldn't be
necessary if you're using best-practice of calling createFactory in the
consuming component.
2015-02-17 11:06:54 -08:00
Paul O’Shannessy
68a8e4491f Merge pull request #3147 from hzoo/lint-fixes
lint whitespace , trailing comma
2015-02-17 10:58:42 -08:00
Paul O’Shannessy
6cd7ab5254 Merge pull request #3154 from iamdustan/patch-1
s/upate/update
2015-02-17 10:55:42 -08:00
Brian Kung
26e0b1a298 [Docs] Clarify section on namespaced components
While going through the docs, I wasn't sure if the first example was
something I should do or not. This makes the wording a bit more clear.
2015-02-17 06:40:48 -06:00
Ben Alpert
6d97c708a9 Merge pull request #3167 from MichelleTodd/docs-grammar
[Docs] Reword section on React without JSX
2015-02-16 17:26:23 -08:00
Michelle Todd
17f2c26139 [Docs] Reword section on React without JSX
Summary:
This section was confusing. I reworded it from:

"JSX is completely optional. You don't have to use JSX with React.
You can create these trees through `React.createElement`. The first
argument is the tag, pass a properties object as the second
argument and children to the third argument."

to:

"JSX is completely optional; you don't have to use JSX with React.
You can create React elements in plain JavaScript using
`React.createElement`, which takes a tag name or component, a
properties object, and variable number of optional child
arguments."

and additionally added another child element to the example code.

Test Plan:
Read the new paragraph!
2015-02-16 17:12:19 -08:00
Ben Alpert
6729acf370 Merge pull request #3162 from vsiao/mount-element
Fix ReactMount._renderNewRootComponent signature
2015-02-16 16:05:08 -08:00
Oiva Eskola
35e24759f1 fix sourcemap filenames when using transformWithDetails. Fixes #3140 2015-02-16 22:21:51 +02:00
Vincent Siao
96e4e3cbbc Fix ReactMount._renderNewRootComponent signature (ReactComponent -> ReactElement) 2015-02-15 19:25:18 -08:00
Dustan Kasten
dc21dca50e s/upate/update 2015-02-14 22:09:31 -05:00
Henry Zhu
cb49492f88 lint whitespace
- use spaces
- remove space before paren in function
-  remove space before colon in object
2015-02-14 11:12:18 -05:00
Harry Marr
198aabaafb Prevent NaN props from triggering warnings
Previously, `checkAndWarnForMutatedProps` would flag `NaN` props as
having been mutated, because `NaN !== NaN`. This prevents that warning
from being emitted by explicitly checking for `NaN`s.
2015-02-14 10:06:55 +00:00
Henry Zhu
74726f0af5 remove space before round brace in function expressions 2015-02-13 23:41:53 -05:00
Henry Zhu
e2a57920da lint whitespace , trailing comma 2015-02-13 23:13:47 -05:00
Paul O’Shannessy
5126cee0f5 v0.13.0-beta.2 2015-02-13 18:28:03 -08:00
Paul O’Shannessy
432e378687 Remove references to vendor_deprecated 2015-02-13 18:27:22 -08:00
Paul O’Shannessy
ad01f21469 Merge pull request #3145 from jsfb/dedup-is-owner-important
Dedupe owner-is-important warning.
2015-02-13 18:26:49 -08:00
Jim
207b03c56d Dedupe owner-is-important warning. 2015-02-13 18:05:18 -08:00
Paul O’Shannessy
0b5331c155 Update license for jsx_orphaned_brackets_transformer 2015-02-13 15:45:01 -08:00
Paul O’Shannessy
3751f85260 Merge pull request #3139 from brianpchsu/master
Fixed Copyright year for three files and react.js licence to BSD-license
2015-02-13 15:44:03 -08:00
Jeff Morrison
8e803cba23 Merge pull request #3143 from jeffmo/flow_0_3_0
Update jsx binary to latest jstransform + latest flow syntax features
2015-02-13 15:37:41 -08:00
jeffmo
332a782d28 Add --es6module and --non-strict-es6module flags to jsx bin 2015-02-13 17:51:35 -05:00
jeffmo
34bb8e85a2 Bump jstransform version to 9.1.0 to include new flow updates 2015-02-13 17:40:52 -05:00
Jim
5512d0d4d0 Merge pull request #3132 from jsfb/warn-less-for-owner-necessary
Only monitor components that are likely stateful (inputs and composites)
2015-02-13 13:55:06 -08:00
Brian Hsu
7e609c6903 Fixed Copyright year for three files and react.js licence to BSD-license. 2015-02-13 12:15:49 -08:00
Paul O’Shannessy
2a3f43184a Merge pull request #3123 from chicoxyzzy/remove-jshint
ESLint coverage
2015-02-13 11:39:11 -08:00
Paul O’Shannessy
5714510ea4 Merge pull request #3134 from briankung/update-safe_yaml
Fix for the jekyll docs build process
2015-02-13 11:22:47 -08:00
Jim
f18dfdc00d Only monitor components that are likely stateful (inputs and composites) 2015-02-12 17:22:42 -08:00
chico
862f7d6a41 fix linting 2015-02-13 02:45:50 +03:00
chico
96677d5da5 update eslint rules 2015-02-13 02:44:32 +03:00
chico
e02a303e3e .eslint in src is not necessary anymore 2015-02-13 02:44:32 +03:00
chico
1511fff598 eslint 2015-02-13 02:43:42 +03:00
Brian Kung
892200ae38 Bumps safe_yaml to 1.0.4 (was 1.0.3) to fix bug
safe_yaml 1.0.3 has some issues with Ruby 2.2.0:
https://github.com/dtao/safe_yaml/issues/67
2015-02-12 17:40:57 -06:00
Paul O’Shannessy
fffe135931 Merge pull request #3133 from zpao/more-lint
More lint rules, fixes
2015-02-12 15:37:22 -08:00
Paul O’Shannessy
7e5eb4b2b2 Add indent lint rule, fix code 2015-02-12 14:31:55 -08:00
Paul O’Shannessy
52b32d83d0 Remove newline at beginning of file 2015-02-12 14:28:54 -08:00
Paul O’Shannessy
12808e81c1 Fix license header to use BSD 2015-02-12 14:28:32 -08:00
Paul O’Shannessy
af8ad59a5b Add space-before-blocks rules, fix code 2015-02-12 14:28:01 -08:00
Sebastian Markbåge
a411f3e0dc Merge pull request #3130 from sebmarkbage/identifiablewarnings
Moar warnings with solid prefixes!
2015-02-12 13:47:53 -08:00
Sebastian Markbage
f5038829d8 Moar warnings with solid prefixes!
This ensures that we have a prefix that can be easily identified in logs
so that we can filter out warnings based on their prefix.

This also turns the remaining two monitorCodeUse callers into warnings.
We'll probably still use monitorCodeUse until we know if we want to
deprecate but most releases should only have warnings.
2015-02-12 13:37:19 -08:00
Paul O’Shannessy
d2fcdfc7df Merge pull request #3126 from Sourdoughh/patch-1
Update to CLA, CONTRIBUTING.md
2015-02-11 16:46:53 -08:00
Jason Ly
462f3ca245 Update to CLA, CONTRIBUTING.md 2015-02-11 13:56:25 -08:00
Christopher Chedeau
6c549d2899 update image perf 2015-02-11 12:45:58 -08:00
Sebastian Markbåge
032fb6ce11 Merge pull request #3107 from sebmarkbage/fragments
Warn if a non-object value is used in ReactFragment.create
2015-02-11 11:58:46 -08:00
Paul O’Shannessy
c07657fde1 Merge pull request #3114 from chicoxyzzy/master
rename `Id` suffix to `ID` to apply naming conventions
2015-02-11 11:35:17 -08:00
Paul O’Shannessy
ea29768a2b Merge pull request #3118 from rkho/patch-1
Updated CONTRIBUTING.md: Mention of "facebook.com" was not a link
2015-02-11 11:34:48 -08:00
Christopher Chedeau
83e4409a72 Tweaks on Advanced Performance 2015-02-11 11:14:59 -08:00
Christopher Chedeau
ab512af57f Advanced Performance Doc 2015-02-11 10:53:57 -08:00
chico
fbe88c7e46 fix Microdata properties' commentaries 2015-02-11 15:50:59 +03:00
Jim
130a164c8d Merge pull request #3117 from jsfb/use-warning-module
Flip console.warn to use warning module.
2015-02-10 17:08:12 -08:00
Jim
4e5543965d Flip console.warn to use warning module so users can intercept all warnings by shimming the warning module.
The two remaining console.warns are:

/Users/jsproch/react/src/test/mock-modules.js:
   19      return mocks.generateFromMetadata(mocks.getMetadata(exports));
   20    } catch (err) {
   21:     console.warn(err);
   22      return exports;
   23    }

/Users/jsproch/react/src/vendor/core/warning.js:
   39        var argIndex = 0;
   40        var message = 'Warning: ' + format.replace(/%s/g, () => args[argIndex++]);
   41:       console.warn(message);
   42        try {
   43          // --- Welcome to debugging React ---
2015-02-10 15:23:24 -08:00
Richard Kho
9c19135c34 Updated CONTRIBUTING.md: Mention of "facebook.com" was not a link
Updated the mention of "facebook.com" on line 3 of the CONTRIBUTING.md file to link to Facebook. Previously, this mention was just in plain text.

Changed from `facebook.com` to `[facebook.com](https://facebook.com)`

No other content has been changed. Content has not been removed from this file in any way.
2015-02-10 14:44:23 -08:00
chico
58d705110e rename Id suffix to ID to apply naming conventions 2015-02-10 21:40:30 +03:00
Paul O’Shannessy
f6f0bab237 Merge pull request #3103 from zpao/lifecyle-warn-not-throw
Warn when calling setState & other methods at wrong time
2015-02-10 09:58:34 -08:00
Sebastian Markbage
093ab00085 Warn if a non-object value is used in ReactFragment.create
I made this mistake while upgrading a few callers.

I'm leaving this as warning so that it is always safe to wrap any existing
child in React.addons.createFragment without breaking prod.

This makes upgrading easier.
2015-02-10 09:44:14 -08:00
Paul O’Shannessy
01ef83feef Merge pull request #3105 from matiassingers/jasmine-call-count-consistency
Jasmine spies call count property consistency
2015-02-09 18:17:16 -08:00
Matias Singers
b9310a8fa5 Consistently use calls.length instead of callCount for Jasmine spies 2015-02-10 10:11:22 +08:00
Paul O’Shannessy
5967915ec4 Warn when calling setState & other methods at wrong time
Currently we use an invariant to prevent this code pattern. That is really
aggressive for something that doesn't actually put React in a bad state. This
diff replaces invariants with warnings and makes those code paths no-ops.
2015-02-09 17:04:13 -08:00
Sebastian Markbåge
7b0ce2c11f Merge pull request #3100 from sebmarkbage/fragments
Dead code
2015-02-09 14:58:21 -08:00
Sebastian Markbage
18c9a6e54a Dead code
Missed this because lint was off
2015-02-09 14:57:07 -08:00
Sebastian Markbåge
0fdd2a74e2 Merge pull request #3030 from sebmarkbage/fragments
Make keyed object fragments an opaque type
2015-02-09 14:50:46 -08:00
Paul O’Shannessy
d59a039ebd Merge pull request #3097 from zpao/upgrade-eslint
Upgrade to newer eslint, use esprima-fb
2015-02-09 14:32:28 -08:00
Paul O’Shannessy
1455001caa Merge pull request #2998 from rickbeerendonk/docs-conferences
Add Conferences section to the Community Resources on the website
2015-02-09 14:32:04 -08:00
Paul O’Shannessy
dae1dc6292 Upgrade to newer eslint, use esprima-fb
Eslint now allows us to use a different parser, which allows us to use
esprima-fb explicitly. This means we don't have to wait for espree to add
things like rest-param parsing. Though we do need eslint to upgrade its rules
to handle that AST.

I had hoped to enable parsing of our tests but we can't do that until we
change esprima-fb's XJS nodes to JSX.

While I was here, I also enabled the no-unused-vars rule since eslint
understands template strings. I also made the single quote enforcement
actually fail instead of just warn.
2015-02-09 14:27:28 -08:00
Sebastian Markbage
56f51156ba Make keyed object fragments an opaque type
This triggers a warning if you try to pass a keyed object as a child.

You now have to wrap it in React.addons.createFragment(object) which
creates a proxy (in dev) which warns if it is accessed. The purpose of
this is to make these into opaque objects so that nobody relies on its
data structure.

After that we can turn it into a different data structure such as a
ReactFragment node or an iterable of flattened ReactElements.
2015-02-09 14:24:56 -08:00
Rick Beerendonk
1b86246d64 Remove zerowidth space at the beginning of file 2015-02-09 22:17:33 +01:00
Paul O’Shannessy
44634c062a Merge pull request #3082 from hzoo/patch-1
Add React.js Conf Keynote talk (with playlist)
2015-02-09 10:17:37 -08:00
Paul O’Shannessy
358e70cedd Merge pull request #3089 from iamdanfox/fix-markdown-parsing-error-3075
Fix markdown parsing error
2015-02-09 10:12:17 -08:00
Paul O’Shannessy
cb833710af Merge pull request #2968 from ClimbsRocks/patch-5
Reordered 'Using Props' before 'Component Properties'
2015-02-09 10:08:44 -08:00
Paul O’Shannessy
a6a64d1ed4 Merge pull request #2854 from cedrics/add-iframe-component
Adds a composite component for an iframe to handle load events
2015-02-09 09:59:01 -08:00
Dan Fox
462ab93d83 Fix markdown parsing error
closes #3075
2015-02-08 11:31:48 +00:00
Paul O’Shannessy
60c2f56e6e Merge pull request #3074 from noyobo/master
fix Chinese docs typos
2015-02-06 17:17:46 -08:00
Paul O’Shannessy
7853260788 Merge pull request #3080 from zpao/upgrade-internal-modules
Upgrade internal modules
2015-02-06 17:17:00 -08:00
Henry Zhu
bcdf8f2375 Add React.js Conf Keynote talk (with playlist) 2015-02-06 18:31:00 -05:00
Jim
3740c51616 Merge pull request #3078 from vincentriemer/patch-1
Fixed pure-render-mixin documentation
2015-02-06 13:33:06 -08:00
Cheng Lou
b6980ab980 [Docs] Add note on classSet deprecation 2015-02-06 16:25:48 -05:00
Jim
c69a9206a4 Merge pull request #3073 from gsklee/patch-3
Fix typos in animation.md
2015-02-06 13:14:30 -08:00
Paul O’Shannessy
705353fbaf Move keyMirror to vendor to match internal move 2015-02-06 12:09:36 -08:00
Vincent Riemer
0bf88f26a4 Corrected pure-render-mixin documentation
Fixed the PureRenderMixin documentation which was incorrectly importing the base React library instead of ReactWithAddons.
2015-02-06 14:34:09 -05:00
Paul O’Shannessy
3525d01b9b Remove more upstream modules that aren't used
Immutable* hasn't been used... ever?
copyProperties, merge were deprecated as part of 0.12. We've replaced
them with Object.assign.
2015-02-06 09:54:52 -08:00
noyobo
7f6c575d9d Chinese docs Typesetting beautification & relate links 2015-02-06 19:44:14 +08:00
noyobo
9296f15682 Chinese docs typo 2015-02-06 17:31:33 +08:00
YouBao Nong
8197bface7 sync up Chinese docs links 2015-02-06 16:26:43 +08:00
YouBao Nong
7cb1b9bdb2 fix next page link typo
下一页链接错误
2015-02-06 15:53:45 +08:00
Preston Parry
0903120ad1 Update tutorial.md 2015-02-05 22:57:36 -08:00
G. Kay Lee
678ec31e41 Fix typos 2015-02-06 14:47:56 +08:00
Paul O’Shannessy
8ab0ecba13 Sync internal modules
We've actually diverged more with some modules, but we don't want
a cascade of dependencies out here. Mostly, the changes internally that
we don't want are tied to FB infrastructure but otherwise are
functionally equivalent (usually around error reporting, code monitoring).
2015-02-05 16:31:54 -08:00
Sebastian Markbåge
007207bac4 Merge pull request #3068 from sebmarkbage/dedupwarning
Warn only once for each class when accessing .type
2015-02-05 15:36:37 -08:00
Sebastian Markbage
140d9b4192 Warn only once for each class when accessing .type
Currently it is a bit too spammy.
2015-02-05 12:32:15 -08:00
Andreas Svensson
c7e4f55eb0 Merge pull request #3047 from syranide/escbrow2
Drop processAttributeNameAndPrefix and invalid attribute name escaping
2015-02-05 20:53:47 +01:00
Paul O’Shannessy
123d218eaf Merge pull request #3046 from cobbweb/patch-1
Add autoFocus to supported HTML attributes
2015-02-05 10:50:38 -08:00
syranide
6af987c524 Drop processAttributeNameAndPrefix and invalid attribute name escaping 2015-02-05 09:43:26 +01:00
Andreas Svensson
04e6d02e40 Merge pull request #1599 from syranide/escbrow
Split escapeTextForBrowser into escapeTextContentForBrowser and quoteAttributeValueForBrowser
2015-02-05 09:41:36 +01:00
Andrew Cobby
a4c96d6e9c Add autoFocus to supported HTML attributes
It appears to be supported http://jsfiddle.net/9f48wbsa/1/
2015-02-05 16:45:27 +10:00
Paul O’Shannessy
787200631b Merge pull request #3045 from milanlandaverde/removes-validation-msg
remove extraneous argument to createChainableTypeChecker in ReactPropTypes
2015-02-04 19:36:11 -08:00
Marlon Landaverde
876fdd0190 removes loose validation message 2015-02-04 21:13:59 -06:00
Paul O’Shannessy
7e6c820cd2 Merge pull request #3022 from btholt/master
Added itemRef and itemId for complete microdata support.
2015-02-04 16:57:03 -08:00
Paul O’Shannessy
f2cd1a0591 Merge pull request #2969 from gsklee/patch-1
Update thinking-in-react.md
2015-02-04 15:22:37 -08:00
Paul O’Shannessy
ac4b64059e Merge pull request #3013 from akheron/patch-2
Document React.addons.TestUtils.isElement()
2015-02-04 15:19:08 -08:00
Sebastian Markbåge
3abfe00ae7 Merge pull request #3039 from sebmarkbage/fixismounted
Fix isMounted inside of render
2015-02-04 11:53:07 -08:00
Sebastian Markbage
263800e09b Fix isMounted inside of render
This is apparently used to determine if you can access refs.

Bad pattern, but a pattern nonetheless.
2015-02-04 11:50:04 -08:00
Paul O’Shannessy
99a2ef30ae Merge pull request #3032 from germ13/patch-1
Corrected documentation
2015-02-04 11:46:27 -08:00
Paul O’Shannessy
f77e86834b Merge pull request #3036 from jergason/master
Fix list formatting in glossary
2015-02-04 11:45:05 -08:00
Andreas Svensson
6672a7ec62 Merge pull request #2135 from syranide/ie8enctype
IE8 does not have a setter for property "enctype"
2015-02-04 13:47:54 +01:00
Andreas Svensson
8ca058ac4e Split escapeTextForBrowser into escapeTextContentForBrowser and quoteAttributeValueForBrowser 2015-02-04 13:44:38 +01:00
Jamison Dance
d74d0e3215 Fix list formatting in glossary 2015-02-03 23:34:43 -07:00
juan serrano
3a0534e1b8 Corrected documentation 2015-02-03 18:41:47 -08:00
Lee Byron
9174501771 Merge pull request #2991 from leebyron/state-queue
Set state takes a function
2015-02-03 19:52:26 -05:00
Lee Byron
279b956c9b Set state takes a function
This diff enables setState to accept a function in addition to a state partial. If you provide a function, it will be called with the up-to-date `state, props, context` as arguments.

This enables some nicer syntax for complex setState patterns:

If setState is doing an increment and wants to guarantee atomicy, you need a function:

```
this.setState(state => ({ number: state.number + 1 }));
```

This atomicy is particularly important if setState is called multiple times in a single frame of execution as the result of complex user actions. It's a tricky bug to chase down and difficult to determine how to fix when you find it. The current pattern of reaching into _pendingState relies on an implementation detail.

In this example: props.doAction() may result in your ancestor re-rendering and providing you with new props. If setState is called directly with an object literal referencing `this.props`, it will use the *old* version of props, not the new value. Using a function solves for this case:

```
this.props.doAction();
this.setState((state, props) => ({ number: state.number * props.multiplier }));
```
2015-02-03 19:49:17 -05:00
Paul O’Shannessy
3f60a99cd9 Merge pull request #3016 from hnordt/patch-1
Removing unnecessary returns
2015-02-03 10:46:21 -08:00
Jeff Morrison
acca4b3993 Merge pull request #3020 from syranide/jsxbracketcodemod
Added jsx_orphaned_brackets_transformer for breaking JSX parser change
2015-02-03 09:56:28 -08:00
Héliton Nordt
62213e08df Fix highlighting 2015-02-03 08:38:16 -02:00
Sebastian Markbåge
c8833daf53 Merge pull request #3026 from sebmarkbage/fixdependency
Hot fix cyclic dependency
2015-02-02 23:57:46 -08:00
Sebastian Markbage
e3f95ea293 Hot fix cyclic dependency
We accidentally created an unfortunate cyclic dependency because of the
auto-wrapper hack that uses ReactClass.

Making it injected instead.
2015-02-02 23:55:34 -08:00
Sebastian Markbåge
50c38bbc75 Merge pull request #3023 from sebmarkbage/devtoolsfix
Expose ReactReconciler
2015-02-02 22:07:28 -08:00
Sebastian Markbåge
1172f636cb Merge pull request #3025 from sebmarkbage/fixrendercallback
Always trigger an update when a callback is enqueued.
2015-02-02 22:07:13 -08:00
Brian Holt
7b92d71744 Changed itemId to itemID and added clarity to the comments of where it is specified. 2015-02-02 21:58:00 -08:00
Sebastian Markbage
2702281a13 Always trigger an update when a callback is enqueued.
enqueueCallbackInternal forgot to schedule an update.

We could rely on the implicit contract of enqueueElement to do it. However,
if we're currently outside a transaction, it'll flush synchronously. Before
we enqueue the callback. We could also enqueueCallback before we
enqueueElement, but that causes a fragile relationship between them. E.g.
enqueueElement should not need to schedule an update if it is the same
element.
2015-02-02 20:42:15 -08:00
Sebastian Markbage
e67ff7ee78 Expose ReactReconciler
This can be used by devtools to monkey patch the reconciler and therefore
get notified whenever any internal instance is updated.
2015-02-02 18:15:31 -08:00
Brian Holt
ea67a1d436 Added itemRef and itemId for complete microdata support. 2015-02-02 17:17:04 -08:00
syranide
f3271ad53b Added jsx_orphaned_brackets_transformer for breaking JSX parser change 2015-02-02 23:24:15 +01:00
Andreas Svensson
63c3461af7 Merge pull request #1864 from syranide/ie8text2
Newlines handled incorrectly by innerText in IE8
2015-02-02 21:33:48 +01:00
Andreas Svensson
c371709d23 Newlines handled incorrectly in innerText in IE8 2015-02-02 21:27:27 +01:00
Andreas Svensson
8d6c8a7793 Merge pull request #3017 from syranide/trydefine
Try/catch property deprecation warnings to support IE8
2015-02-02 21:26:18 +01:00
Jim
381a01a19b Merge pull request #3018 from jsfb/assert-not-throw
Expecting transform not to throw.  Removed meaningless comment.
2015-02-02 12:21:05 -08:00
Jim
b207b8698c Expecting transform not to throw. Removed meaningless comment. 2015-02-02 12:19:47 -08:00
Andreas Svensson
387adae3de Merge pull request #3000 from syranide/openbool
Set HTML DOM property "open" to HAS_BOOLEAN_VALUE
2015-02-02 21:11:10 +01:00
syranide
0a1cd56ead Try/catch property deprecation warnings to support IE8 2015-02-02 21:00:04 +01:00
Paul O’Shannessy
6c36b528e2 Merge pull request #2997 from rickbeerendonk/2943-jsx-build-tool-documentation
Documents that JSX tool is transforming files with .js extension (and no...
2015-02-02 11:25:32 -08:00
Paul O’Shannessy
f922664e86 Merge pull request #3007 from JoelOtter/patch-2
Add note linking to up-to-date doc on Flux website
2015-02-02 11:22:45 -08:00
Sebastian Markbåge
534d23d903 Merge pull request #3012 from sebmarkbage/typescript
Use TypeScript Compiler API Directly
2015-02-02 11:21:40 -08:00
Héliton Nordt
8fc4f23cdb Removing unnecessary returns 2015-02-02 17:20:38 -02:00
Paul O’Shannessy
bab94bf2af Merge pull request #3011 from koba04/fix-coponent-api-doc
Fix consistency of component api document
2015-02-02 11:18:10 -08:00
Paul O’Shannessy
8b1cd7509d Merge pull request #3001 from rgarcia/patch-1
remove extraneous comma in tutorial
2015-02-02 11:16:28 -08:00
Paul O’Shannessy
2aeb8a2a6b Merge pull request #2995 from rickbeerendonk/copyright-2015
Update copyright headers for 2015
2015-02-02 11:15:30 -08:00
Paul O’Shannessy
e04bdd8c9b Merge pull request #2999 from sedovsek/master
Changed unit to pixels due to inconsistent font-size rendering of code elements.
2015-02-02 11:05:35 -08:00
Petri Lehtinen
2e232f83bc Document React.addons.TestUtils.isElement() 2015-02-02 10:22:52 +02:00
Sebastian Markbage
f6fd4a8506 Use TypeScript Compiler API Directly
In 1.4.0 we can use the TypeScript API directly to preprocess our files.
This lets us get rid of a dependency.

https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API

We can also use this to provide our default libraries so that we don't
need to keep the references in the test file.
2015-02-01 22:41:00 -08:00
Toru Kobayashi
b7860b7da4 Fix consistency of component api document 2015-02-02 09:52:08 +09:00
Joel Auterson
344d07d7de Add note linking to up-to-date doc on Flux website 2015-02-01 15:26:29 +00:00
Rafael
246fdebf82 remove extraneous comma in tutorial 2015-01-31 12:31:14 -10:00
syranide
aa9edc2a9c Set HTML DOM property "open" to HAS_BOOLEAN_VALUE 2015-01-31 23:11:08 +01:00
Robert Sedovsek
ea94ec8c0e Changed unit to pixels due to inconsitent font-size rendering of code elements. 2015-01-31 22:53:21 +01:00
Rick Beerendonk
f1bd869350 Add Conferences section to the Community Resources on the website 2015-01-31 22:46:03 +01:00
Rick Beerendonk
2de44cf668 Documents that JSX tool is transforming files with .js extension (and not .jsx) by default 2015-01-31 20:59:18 +01:00
Rick Beerendonk
3e0750a4ad Update copyright headers for 2015 2015-01-31 20:18:25 +01:00
Andreas Svensson
905bfcec60 Merge pull request #1912 from syranide/safereuse
Warn if mounting into node with dirty rendered markup
2015-01-31 19:56:34 +01:00
Andreas Svensson
c460ad660b Warn if mounting into node with dirty rendered markup 2015-01-31 19:36:12 +01:00
Andreas Svensson
a170629128 Merge pull request #1568 from syranide/dompurge
Only purgeID on ReactDOMComponent and ReactDOMTextComponent unmount
2015-01-31 18:21:22 +01:00
Lee Byron
508b625313 Merge pull request #2990 from jeffkole/patch-1
Documents that `classSet` concatenates its arguments
2015-01-30 21:45:54 -05:00
Jeff Kolesky
b7530e19eb Documents that classSet concatenates its arguments
Just wanted it to be noted that `classSet` operates in two ways, both of which are valuable.
2015-01-30 16:47:44 -08:00
syranide
a7f0fb7c4f Only purgeID on ReactDOMComponent and ReactDOMTextComponent unmount 2015-01-30 21:32:58 +01:00
Paul O’Shannessy
9f9d833065 Merge pull request #2987 from jsfb/fix-markdown-output-wrap
Fixed linewrap issue on markdown output css.  Fixes #2986
2015-01-30 12:22:44 -08:00
Jim
2ea00ea772 Fixed linewrap issue on markdown output css. Fixes #2986 2015-01-30 12:19:18 -08:00
Jim
ddb1c7470e Merge pull request #2960 from jsfb/add-detectable-prefix-to-reactelement-warning
Add detectable prefix to ReactElement proptype warning.
2015-01-30 12:14:33 -08:00
Paul O’Shannessy
bab59cd090 Pull in 0.13 beta blog post from 0.12-stable branch 2015-01-30 11:49:40 -08:00
Jim
b2f77e6de3 Add detectable prefix to ReactElement proptype warning. 2015-01-30 11:43:57 -08:00
G. Kay Lee
140627b1b2 Update thinking-in-react.md
Make style consistent with `tutorial.md`
2015-01-28 16:59:03 +08:00
Paul O’Shannessy
5bd078508a v0.13.0-beta.1 2015-01-27 21:13:35 -08:00
Paul O’Shannessy
bd56b731de Merge pull request #2967 from zpao/jest-match-internal
[jest] Use persistModuleRegistryBetweenSpecs
2015-01-27 20:54:19 -08:00
Paul O’Shannessy
657e30771a Merge pull request #2966 from zpao/grunt-jest
Run jest with grunt, add to travis
2015-01-27 20:51:39 -08:00
Paul O’Shannessy
e2d3370aa9 Merge pull request #2964 from zertosh/no-derequire-when-minifying
Remove "derequire" from minified bundles
2015-01-27 20:51:08 -08:00
Preston Parry
5776dc7918 Update tutorial.md 2015-01-27 20:27:16 -08:00
Paul O’Shannessy
14d88d4e38 [jest] Use persistModuleRegistryBetweenSpecs
This more closely matches how we have jest configured at FB, so when we
pull in and run internally we will have fewer things to waste time on.
2015-01-27 19:17:31 -08:00
Paul O’Shannessy
49eb84efdd Run jest with grunt, add to travis
This is to make sure we don't end up with differences in our different
testing methods. We may switch out the failure allowances later (maybe
just jest will be good enough and we can let phantom fail for a little
bit).
2015-01-27 18:04:58 -08:00
Scott Feeney
76f5453cc7 Mention shallow rendering's limitations
Also, move it to the bottom of the test utils documentation and mention that it's experimental.
2015-01-27 17:09:16 -08:00
Paul O’Shannessy
dbdeb078ce [testing] dump the cache when depending on warning messages
It's possible to configure Jest to not dump the module cache between
specs. This makes it tricky when we silence warnings one a 2nd call.

In this case, the same message was getting logged so when we expected
the count of warning calls to increment, it didn't.
2015-01-27 16:02:00 -08:00
Jim
2ea1f51fe8 Merge pull request #2965 from ClimbsRocks/patch-4
Docs wording tweak: subject verb agreement
2015-01-27 14:45:15 -08:00
Preston Parry
e4352efc21 Update 04-multiple-components.md 2015-01-27 14:34:35 -08:00
Andres Suarez
5c5fc5e316 Remove "derequire" from minified bundles 2015-01-27 16:53:18 -05:00
Scott Feeney
f6804d2504 Add documentation for shallow testing
See #2393 for the original issue, and #2497 for the implementation.
2015-01-27 13:44:20 -08:00
Paul O’Shannessy
9801f2d8ab Merge pull request #2940 from kevinold/2749-consistent-use-of-spys-or-mocks
update to use spyOn for console.warn #2749
2015-01-27 13:38:56 -08:00
Ben Alpert
513433b370 Merge pull request #2962 from ClimbsRocks/patch-3
Docs wording tweak for clarity
2015-01-27 11:59:00 -08:00
Ben Alpert
8174262135 Merge pull request #2961 from ClimbsRocks/patch-1
Rewording for clarity
2015-01-27 11:58:36 -08:00
Preston Parry
33ecec07cb Update 02.1-jsx-in-depth.md 2015-01-27 11:22:21 -08:00
Preston Parry
cadbe1d27e Rewording for clarity 2015-01-27 11:04:21 -08:00
Sebastian Markbåge
8bbaa95a49 Merge pull request #2948 from jergason/master
do not validate propTypes in production
2015-01-27 10:55:14 -08:00
Sebastian Markbåge
61c4497d58 Merge pull request #2959 from sebmarkbage/createmixin
We don't currently have a way to trace the origin of a mixin
2015-01-27 10:39:25 -08:00
Sebastian Markbåge
b3f96d97f9 Merge pull request #2957 from sebmarkbage/renamecomponent
Rename ReactComponentBase -> ReactComponent
2015-01-27 10:39:07 -08:00
Sebastian Markbage
295ef0063b We don't currently have a way to trace the origin of a mixin
This makes it more difficult to find bugs in mixins both dynamically
and using a static type system.

We also don't have a way to find these to be upgraded to a new mixin
syntax if we needed to.

This hook is currently an optional noop but could be made required to
create a mixin class.
2015-01-27 09:36:14 -08:00
Sebastian Markbage
c3c98084b9 Rename ReactComponentBase -> ReactComponent
We freed up this internal name by removing the internal base class.
We're now free to use this name as it was intended.

ReactDOMComponent and ReactCompositeComponent are still confusing as
they're internal but we'll rename them later.
2015-01-27 09:22:07 -08:00
Jamison Dance
f61ca8d307 don't validate propTypes in production
Switch to warnings so code execution doesn't differ between prod and
dev.
2015-01-27 09:45:20 -07:00
Sebastian Markbåge
16a56afada Merge pull request #2936 from sebmarkbage/refactorlifecycles
Use Singleton LifeCycle State
2015-01-27 01:26:30 -08:00
Sebastian Markbage
bebc568ceb Use Singleton LifeCycle State
All entry points are for reconciliation are within batching strategies.

Since we don't have any batching strategies with synchronous updates,
there can't be more than one life-cycle method on the stack at any given
time.

Therefore, it's safe to move the composite life cycle flag to a singleton.
This saves us some memory management.

I think that we can get rid of these life cycle states completely in the
future.
2015-01-27 01:19:31 -08:00
Sebastian Markbåge
7e6251887f Merge pull request #2935 from sebmarkbage/batchupdates
Batch updates in initial render
2015-01-27 01:06:56 -08:00
Sebastian Markbage
9811b10aaa Batch updates in initial render
Currently, the first setState that happens during initial render will
start a new batch. Any subsequent updates will be batched. That means that
the first setState is synchronous but any subsequent setStates are
asynchronous.

This commit makes it so that the batching starts at the root. That way all
the setStates that happen within life-cycle methods are asynchronous.
2015-01-27 01:00:59 -08:00
Sebastian Markbåge
b3df7cabb7 Merge pull request #2930 from sebmarkbage/updatequeue
Extract setState, setProps etc into ReactUpdateQueue
2015-01-27 00:57:44 -08:00
Sebastian Markbage
ed7332c749 Extract setState, setProps etc into ReactUpdateQueue
I originally did this work so that we could allow setState to be called
before the internal ReactCompositeComponent was constructed. It's unlikely
that we'll go down that route now but this still seems like a better
abstraction. It communicates that this is not immediately updating an
object oriented class. It's just a queue which a minor optimization.
It also avoids bloating the ReactCompositeComponent file.

Since they both depend on the life cycle I break that out into a common
shared dependency. In a follow up I'll refactor the life-cycle management.
2015-01-27 00:55:25 -08:00
Sebastian Markbage
103bf101ae Fix broken jest test
jest accidentally picked up this .d.ts file as a test.

I'll just move it out to fix it.
2015-01-26 23:37:30 -08:00
Sebastian Markbåge
9b23807cfd Merge pull request #2953 from sebmarkbage/callbacktests
Add Tests to Callbacks of the Life Cycles
2015-01-26 23:30:14 -08:00
Sebastian Markbage
fd077d7492 Add Tests to Callbacks of the Life Cycles
This adds some much needed tests of the callbacks to setState, setProps
and render.
2015-01-26 23:26:24 -08:00
Jim
61ee74b562 Merge pull request #2941 from kevinold/2870-update-warning-calls
Update warning calls to use %s #2870
2015-01-26 22:06:42 -08:00
Kevin Old
f0ea2b5979 update to use spyOn for console.warn #2749 2015-01-26 21:51:42 -06:00
Kevin Old
e8ef06783a Update warning calls to use %s #2870 2015-01-26 21:39:43 -06:00
Paul O’Shannessy
c6d1904f24 Merge pull request #2951 from mzabriskie/semicolon
Provide warning when using styles containing a semicolon
2015-01-26 18:32:57 -08:00
Jim
c3522b80a5 Merge pull request #2920 from jsfb/move-proptype-validation
Move propType validation to element instead of class.
2015-01-26 17:21:01 -08:00
Sebastian Markbåge
46ae2f4e55 Merge pull request #2952 from sebmarkbage/typescript
Add Basic TypeScript Class Test
2015-01-26 17:19:18 -08:00
Jim
6ee5299b4a Move propType validation to element instead of class.
Conflicts:
	src/classic/element/ReactElementValidator.js
2015-01-26 17:16:49 -08:00
Sebastian Markbage
f837cc289e Move component class instantiation into ReactCompositeComponent
We need to move instantiation into the mount phase for context purposes.

To do this I moved the shallow rendering stuff into ReactTestUtils and
reused more of the existing code for it by instantiating a noop child.

Everywhere we refer to the "type" we should pass it to ReactNativeComponent
to resolve any string value into the underlying composite.
2015-01-26 17:16:21 -08:00
mzabriskie
ae5a124745 Using %s in warning message 2015-01-26 18:09:21 -07:00
mzabriskie
fca0fdc115 Better tests 2015-01-26 18:08:51 -07:00
Sebastian Markbage
6c145c31f5 Add Basic TypeScript Class Test
As part of the new class effort it is now possible to define React
Components using any type of generic JavaScript class syntax.

This includes TypeScript classes. This test ensures that we don't regress
that support, and also serves as an example for using React in TypeScript.
TypeScript provides a good demo of where we think property initializers
are going.

We don't have any official *type* support for TypeScript yet.

This test trails the ReactES6Class-test file. Some manual tweaking is
required when converting tests.
2015-01-26 16:59:11 -08:00
mzabriskie
b6edbae3fc Renaming assertValidStyle to warnValidStyle 2015-01-26 17:50:35 -07:00
mzabriskie
94fb463c06 Moar tests 2015-01-26 17:45:51 -07:00
mzabriskie
05e2bc6b5c Fixing lint failures 2015-01-26 17:41:54 -07:00
mzabriskie
4054bb13cd Provide warning when using styles containing a semicolon 2015-01-26 17:33:44 -07:00
Paul O’Shannessy
96058a10ee Merge pull request #2939 from patlaughlin/patch-1
Update 06-transferring-props.md
2015-01-26 16:32:09 -08:00
Sebastian Markbåge
d750cf7401 Merge pull request #2942 from sebmarkbage/metamatchers
Add Meta Matchers for Testing Tests
2015-01-26 16:05:40 -08:00
Sebastian Markbage
3bbf6ce1a5 Add Meta Matchers for Testing Tests
This adds a matcher called toEqualSpecsIn which executes two test suites,
without reporting the result. It then compares the specs and the number
of expects executed by each spec.

This will be used to ensure that tests written in other languages test the
same thing as the base line, ES6 classes.

Sets up CoffeeScript equivalence test.
2015-01-26 15:50:57 -08:00
Sebastian Markbåge
e6672a3a03 Merge pull request #2944 from sebmarkbage/coffeescript
Add CoffeeScript Class Test
2015-01-26 11:10:18 -08:00
Sebastian Markbage
5f150822e6 Add CoffeeScript Class Test
As part of the new class effort it is now possible to define React
Components using any type of generic JavaScript class syntax.

This includes CoffeeScript. This test ensures that we don't regress that
support, and also serves as an example for using React in CoffeeScript.

This test fail trails the ReactES6Class-test file. Some manual tweaking is
required when converting tests.
2015-01-26 02:19:35 -08:00
Patrick Laughlin
51e0610a62 Update 06-transferring-props.md 2015-01-25 22:03:57 -05:00
Sebastian Markbåge
4486a17c24 Merge pull request #2933 from sebmarkbage/pendingcontext
Remove _pendingContext
2015-01-24 21:54:36 -08:00
Sebastian Markbage
adabfe2f49 Remove _pendingContext
There is no way to queue an update to a context so there is no need for
this field. The only way to get a new context is from above.

Soon _pendingElement will get the same treatment. Once _setPropsInternal
can be removed.
2015-01-24 20:09:14 -08:00
Sebastian Markbåge
1c90efbf7c Merge pull request #2923 from sebmarkbage/dropcomponentmixin
Replace ReactComponentMixin with ReactReconciler
2015-01-23 18:06:50 -08:00
Sebastian Markbage
690409a912 Replace ReactComponentMixin with ReactReconciler
Instead of putting the shared code in a base class method, we use a wrapper
call around all invokations. That way they're free to add code before AND
after the non-shared code.

That way we ensure that component extensions don't need to implement
ReactComponentMixin and do super() calls into it. This helps to create a
tighter API for custom component extensions.

This provides the first step towards moving these methods to static
methods which allows to use a different dispatch mechanism instead of
virtual method calls. E.g. pattern matching.
2015-01-23 17:27:42 -08:00
Ben Alpert
ac7677bb11 Update .mailmap for me 2015-01-23 11:10:22 -08:00
Sebastian Markbåge
0e108b180a Merge pull request #2918 from sebmarkbage/fixcontexts
Move Component Class Instantiation into ReactCompositeComponent
2015-01-23 10:41:47 -08:00
Sebastian Markbage
9abd1133c9 Pass context to the constructor
This should reenable reading this.context from getInitialState.

Added a bunch of tests for this too.
2015-01-23 10:09:45 -08:00
Sebastian Markbage
766a79c695 Move component class instantiation into ReactCompositeComponent
We need to move instantiation into the mount phase for context purposes.

To do this I moved the shallow rendering stuff into ReactTestUtils and
reused more of the existing code for it by instantiating a noop child.

Everywhere we refer to the "type" we should pass it to ReactNativeComponent
to resolve any string value into the underlying composite.
2015-01-23 10:09:45 -08:00
Kirk Steven Hansen
3d37c95533 Typo in first commit. 2015-01-22 23:34:14 -06:00
Kirk Steven Hansen
b4007e85b8 Updated tutorial to be more clear about the dependence on the --harmony flag. 2015-01-22 23:30:02 -06:00
Sebastian Markbåge
8616a6f60e Merge pull request #2919 from sebmarkbage/removecreateref
Remove React.createRef API
2015-01-22 19:13:55 -08:00
Sebastian Markbage
a3a464c8fc Remove React.createRef API
This API was removed so this won't work.
2015-01-22 19:11:11 -08:00
Ben Alpert
f9821de909 Merge pull request #2917 from spicyj/ref-composite
Switch first-class refs to use functions
2015-01-22 18:19:05 -08:00
Ben Alpert
322bde6eb0 Switch first-class refs to use functions
Closes #1373.

Test Plan: jest
2015-01-22 18:10:25 -08:00
Jim
734aedb977 Merge pull request #2892 from jsfb/fbme-url-for-dangerouslySetInnerHtml
Added fb.me url to error message.
2015-01-22 17:07:28 -08:00
Ben Alpert
a534264c1e Merge pull request #2916 from spicyj/ref-composite
Move ref code to ReactCompositeComponent
2015-01-22 16:01:51 -08:00
Ben Alpert
9c3d6b8881 Move ref code to ReactCompositeComponent
You can only get a ref to a ReactCompositeComponent, so move the ref code here which gives us more flexibility to put it at the correct time in the lifecycle.

There should be no behavior change in this commit.

Test Plan: jest
2015-01-22 15:36:59 -08:00
Paul O’Shannessy
3d109aa11b Merge pull request #2915 from zpao/lint-fixup
Fix a couple small lint issues
2015-01-22 14:56:25 -08:00
Paul O’Shannessy
c33d443c0b Fix a couple small lint issues
These aren't caught by eslint yet :(
2015-01-22 14:39:08 -08:00
Sebastian Markbåge
8a5c5ba69d Merge pull request #2913 from sebmarkbage/typewarning
Add warning when accessing .type on a component class
2015-01-22 13:39:07 -08:00
Sebastian Markbage
1ed1d7a158 Add warning when accessing .type on a component class
Since we removed the wrapper factory around classes, the class is just
the class now so there is no need for this indirection property.
2015-01-22 13:26:34 -08:00
Paul O’Shannessy
6588a84a0f Merge pull request #2765 from zpao/jsxtransformerlinenumber
Check for lineNumber support before using it
2015-01-22 12:58:51 -08:00
Jim
b94adc9724 Added fb.me url to error message. 2015-01-22 12:56:52 -08:00
Paul O’Shannessy
f8a214137a Merge pull request #2903 from tendant/merge-conflicts-in-translation
Update documents for Chinese translation
2015-01-22 12:55:53 -08:00
Paul O’Shannessy
92e361709c [docs] Use current date in copyright footer
This will be based on the site generation time, making doc generation
slightly less deterministic but that's ok. Now we won't depend on
helpful community members updating it for us (#2874) when we forget,
it'll just happen naturally the next time the site is generated.
2015-01-22 12:50:52 -08:00
Jim
54b565de93 Merge pull request #2518 from jsfb/documentation-for-dangerouslySetInnerHtml
Document justification for dangerouslySetInnerHTML, fixes #2256
2015-01-22 10:52:47 -08:00
Ben Alpert
76e1d5a542 Merge pull request #2902 from swestwood/patch-2
Correctly highlight changed line in tutorial.
2015-01-22 08:27:29 -08:00
Lei
943c2aa77a Add Chinese translation of reusable-components 2015-01-21 19:43:24 -08:00
Lei
833fcb6593 Add Chinese translation of multiple-components 2015-01-21 19:34:40 -08:00
Paul O’Shannessy
6247f30103 Merge pull request #2890 from amykyta/patch-1
Update 02.1-jsx-in-depth.md
2015-01-21 19:07:01 -08:00
Timothy Yung
b403af192d Merge pull request #2900 from wincent/test-desc-fix
Fix inaccurate spec description
2015-01-21 18:56:33 -08:00
Paul O’Shannessy
4b2e89dd99 Add npm run build
It's a "shortcut" to `grunt build`
2015-01-21 17:23:36 -08:00
Sophia Westwood
a19966f2ea Correctly highlight changed line in tutorial.
This excerpt adds the onSubmit handler to the form element, but the line was not highlighted as having been modified.
2015-01-21 17:15:31 -08:00
Greg Hurrell
76fe572a97 Fix inaccurate spec description
The string here was initially accurate, but got out of sync with reality
when the commit was revised (as 892e357fd5).
2015-01-21 17:07:29 -08:00
Timothy Yung
892e357fd5 Merge pull request #2894 from yungsters/local-event-trap-mixin
Fix LocalEventTrapMixin for Bad Tree State
2015-01-21 15:34:32 -08:00
yungsters
a7aca51f1e Throw for Misue of LocalEventTrapMixin
Summary:
If `getDOMNode()` returns null in `LocalEventTrapMixin`, `listener` will also be null and `accumulateInto` will throw. This changes `LocalEventTrapMixin` to throw a more helpful error message.

Test Plan:
Ran unit test successfully:

```
npm test LocalEventTrapMixin-test.js
```
2015-01-21 15:30:04 -08:00
Jim
6f44f6049e Document justification for dangerouslySetInnerHTML, fixes #2256
Conflicts:
	docs/_data/nav_tips.yml
	docs/tips/17-children-undefined.md
2015-01-21 12:47:36 -08:00
Isaac Salier-Hellendag
972befe0b6 Merge pull request #2889 from salier/react-default-perf
Repair ReactDefaultPerf
2015-01-21 13:28:53 -06:00
amykyta
b8f3c7f7fb Update 02.1-jsx-in-depth.md 2015-01-21 12:22:29 -05:00
Isaac Salier-Hellendag
de54d84051 Repair ReactDefaultPerf
Update ReactDefaultPerf to properly record component names.
2015-01-21 10:52:43 -06:00
Cedric Sohrauer
5f837074f9 adds a composite component for an iframe to handle load events
This is basically a copy of ReactDOMImg
2015-01-21 10:33:34 +01:00
Paul O’Shannessy
ce5346f2ce Merge pull request #2884 from chenglou/fix-ex-source-map
Temporarily comment out bundle-collapser for JSXTransformer
2015-01-20 18:55:39 -08:00
Paul O’Shannessy
f9c393f4fb Fix strict mode violoation in test 2015-01-20 18:26:51 -08:00
Cheng Lou
51d74ca36c Temporarily comment out bundle-collapser for JSXTransformer
This will at least make the examples run while we fix the issue.
2015-01-20 20:27:59 -05:00
Paul O’Shannessy
06de3f31f0 Merge pull request #2875 from kchia/patch-2
Update 03-interactivity-and-dynamic-uis.md: correct typo
2015-01-20 16:42:27 -08:00
Paul O’Shannessy
0a62a04909 Merge pull request #2881 from camsong/master
Add Chinese translation to several pages.
2015-01-20 16:41:58 -08:00
Sebastian Markbage
a5657d213c Fix lint 2015-01-20 14:40:19 -08:00
Paul O’Shannessy
c778e61da0 Fix ES6Class test so it runs in browsers
document.createElement throws an error if you don't pass it any
arguments. Neither PhantomJS nor jest (via jsdom at version jest is
using) behave as browsers do now so this went unnoticed.
2015-01-20 14:30:33 -08:00
Sebastian Markbåge
2d75b11097 Merge pull request #2808 from sebmarkbage/modernclasses
New class instantiation and initialization process
2015-01-20 14:28:40 -08:00
Sebastian Markbage
291a92c4a6 New class instantiation and initialization process
This allows state to be set up in the constructor instead of through
getInitialState. getInitialState is now considered part of "classic".
Therefore, they move into ReactClass's constructor.

As a consequence of this, we no longer have a mapping between the internal
representation and the public instance during the mounting process.
Because the constructor hasn't returned yet.

We used to have a special case for calling setState in getInitialState
which was just ignored. This makes that throw and the component is
considered unmounted during the construction phase.
2015-01-20 14:27:28 -08:00
Jim
f92967c886 Merge pull request #2853 from jsfb/warn-only-on-read
Eliminate context warnings when component isn't reading the conflicting context variable
2015-01-20 11:57:30 -08:00
Cam Song
1694aff89e Add Chinese translation to 7 more pages.
Translate 'Note' to '注意' instead of '提示' to make it more sensible.
2015-01-20 00:15:16 +08:00
Hou Chia
9f18ccdce9 Update 03-interactivity-and-dynamic-uis.md: correct typo
My file change corrects a typo in the document.

Best, 
Hou
2015-01-18 00:35:27 -08:00
Paul O’Shannessy
c6686768eb Merge pull request #2874 from Carlsson87/patch-1
Update footer with correct year
2015-01-17 12:21:21 -08:00
Daniel Carlsson
4ffdbefaa2 Friends don't let friends look foolish on the internet
Updated your footer =)
2015-01-17 20:16:24 +01:00
Paul O’Shannessy
f656f1966e Merge pull request #2297 from pedronauck/docs-namespace-in-jsx
Add a section at 'jsx-in-depth' talking about namespaced components
2015-01-16 16:21:22 -08:00
Paul O’Shannessy
4f50071de0 Merge pull request #2675 from af/topLevelAPIDocs
Top level api docs for createFactory
2015-01-16 13:18:28 -08:00
Paul O’Shannessy
d6aa588dfc Merge pull request #2360 from beausmith/patch-1
Highlighted changed lines in examples
2015-01-16 13:10:00 -08:00
Paul O’Shannessy
31002e0cc1 Merge pull request #2707 from camsong/master
More Chinese Doc Translation
2015-01-16 13:06:40 -08:00
Paul O’Shannessy
1b85e611ad Merge pull request #2734 from Minwe/master
add Forms and Event System docs Chinese translation
2015-01-16 13:06:12 -08:00
Paul O’Shannessy
d471fb4c0b Merge pull request #2795 from chenglou/tips-lib
[Docs] Tip on integration with other libraries
2015-01-16 13:05:43 -08:00
Paul O’Shannessy
69d40d1be3 Merge pull request #2824 from zpao/docs-tutorial-server
[docs] Talk about running a server in tutorial
2015-01-16 13:05:19 -08:00
Ben Alpert
1428ea7823 Merge pull request #2502 from fabiomcosta/patch-4
Removing unecessary resize listener
2015-01-16 12:08:34 -08:00
Paul O’Shannessy
deae575dae v0.13.0-alpha.2 2015-01-16 10:33:42 -08:00
Paul O’Shannessy
588032da51 Update package deps 2015-01-16 10:33:42 -08:00
Paul O’Shannessy
2de1545eae Merge pull request #2867 from zpao/no-warn-mock-methods
Don't warn about plain classes when in mocked components
2015-01-15 16:45:05 -08:00
Paul O’Shannessy
069aec1d42 Don't warn about plain classes when in mocked components
Mocking both doesn't copy properties that start with an underscore, nor
does it copy values, only nested objects.
2015-01-15 16:39:57 -08:00
Sebastian Markbåge
c01507fd11 Merge pull request #2866 from sebmarkbage/fixbindwarning
Don't bind callbacks to setState, setProps etc.
2015-01-15 15:36:50 -08:00
Paul O’Shannessy
45c0747a17 Merge pull request #2851 from jsfb/unique-key-in-dev-only
The unique key warning should only happen in dev.
2015-01-15 15:08:43 -08:00
Sebastian Markbage
d7d3ea5560 Don't bind callbacks to setState, setProps etc.
We added a bind to the public instance, but instead we can just pass the
public instance as the context when we execute.

This avoids a warning that fires when we call bind on auto-bound methods.
2015-01-15 14:00:45 -08:00
Paul O’Shannessy
8e6e98b387 Merge pull request #2865 from zpao/revert-jasmine-helper
Revert "Merge pull request #2814 from jsfb/testutils-consolemock"
2015-01-15 13:47:34 -08:00
Paul O’Shannessy
967435b249 Revert "Merge pull request #2814 from jsfb/testutils-consolemock"
This reverts commit 9514861d93, reversing
changes made to cdec83732d.
2015-01-15 13:35:57 -08:00
Cheng Lou
251d31a515 Merge pull request #2859 from javawizard/patch-1
ref-08-reconciliation.md: grammar/punctuation fixes
2015-01-15 14:36:27 -05:00
Alex Boyd
941cba679e ref-08-reconciliation.md: grammar/punctuation fixes 2015-01-14 22:40:29 -07:00
Ben Alpert
8d5838af72 Merge pull request #2540 from spicyj/no-mutate-props
Warn when mutating props on a ReactElement
2015-01-14 11:37:43 -08:00
Paul O’Shannessy
892f0a59fe Fix lint on travis
PR #2852 was not quite correct
2015-01-13 16:55:10 -08:00
Paul O’Shannessy
29ca22c2ff Merge pull request #2852 from zpao/lint-fail-travis
Add eslint grunt task, fail travis for it
2015-01-13 16:12:15 -08:00
Paul O’Shannessy
84c83dca2d Add eslint grunt task, fail travis for it
This is it...
2015-01-13 16:11:42 -08:00
Jim
8aa6171fd6 Eliminate context warnings when component isn't reading the conflicting context variable. 2015-01-13 15:34:46 -08:00
Paul O’Shannessy
54c82da15f Merge pull request #2751 from zpao/eslint-fixup
Eslint fixup
2015-01-13 15:27:54 -08:00
Paul O’Shannessy
47ee780caf [lint] fix consistent-returns 2015-01-13 15:26:33 -08:00
Paul O’Shannessy
2126600c37 [lint] disable a couple rules since rest args aren't processed right 2015-01-13 15:26:33 -08:00
Paul O’Shannessy
847357e42e [lint] Fix reasonable lines to 80
I don't agree with 80 on principal but it's what we have for now.

This fixes the reasonable cases. Most of the long lines are in docblocks
with long type information or containing links.
2015-01-13 15:26:33 -08:00
Paul O’Shannessy
e27da99731 [lint] Fix majority of issues eslint found 2015-01-13 15:26:33 -08:00
Paul O’Shannessy
df2ddc5dfa [lint] convert to single quotes 2015-01-13 15:26:33 -08:00
Paul O’Shannessy
df64a67b7f codemod "use strict" to 'use strict' for better linting 2015-01-13 15:26:32 -08:00
Jim
fa40eefa00 Merge pull request #2818 from jsfb/unmasked-context-in-performContextUpdate
Context warning should fire on update, not just initial mount.
Renamed a couple instances of context
2015-01-13 15:05:45 -08:00
Paul O’Shannessy
aeffbef21f Merge pull request #2662 from zpao/eslint
Use eslint
2015-01-13 14:03:16 -08:00
Jim
6b5b1b3f17 The unique key warning should only happen in dev. 2015-01-13 14:03:00 -08:00
Paul O’Shannessy
3f8d4eaa63 Use eslint
These rules are very close to what we have internally. We may still miss
a couple things (jsdoc params being a big one) but it's good enough.
This is also more restrictive than what we enforce internally, but it's
for the best.
2015-01-13 14:01:34 -08:00
Sebastian Markbåge
7a3083af36 Merge pull request #2806 from sebmarkbage/baseclass
Warn when defined methods are used in plain JS classes
2015-01-13 11:40:52 -08:00
Sebastian Markbage
2330962d25 Warn when defined methods are used in plain JS classes
In ReactClass we use early validation to warn you if a accidentally defined
propTypes in the wrong place or if you mispelled componentShouldUpdate.

For plain JS classes there is no early validation process. Therefore, we
wait to do this validation until the component is mounted before we issue
the warning.

This should bring us to warning-parity with ReactClass.
2015-01-13 11:29:28 -08:00
Sebastian Markbåge
d138f9a35b Merge pull request #2805 from sebmarkbage/baseclass1
Introducing ReactComponentBase base class
2015-01-13 11:00:56 -08:00
Sebastian Markbage
ff032dc857 Introducing ReactComponentBase base class
This is the base class that will be used by ES6 classes.

I'm only moving setState and forceUpdate to this base class and the other
functions are disabled for modern classes as we're intending to deprecate
them. The base classes only have getters that warn if accessed. It's as if
they didn't exist.

ReactClass now extends ReactComponentBase but also adds the deprecated
methods. They are not yet fully deprecated on the ReactClass API.

I added some extra tests to composite component which we weren't testing
to avoid regressions.

I also added some test for ES6 classes. These are not testing the new
state initialization process. That's coming in a follow up.
2015-01-13 10:54:19 -08:00
Jim
e4842b4ae2 Context warning should fire on update, not just initial mount.
Renamed a couple instances of context to make it clear if it was masked/unmasked
2015-01-12 16:40:08 -08:00
Ben Alpert
90053da7bd Merge pull request #2844 from kchia/patch-1
Update README.md insert comma
2015-01-12 09:45:52 -10:00
Hou Chia
08c7c556de Update README.md insert comma
The file change inserts a missing comma.

Best,
Hou
2015-01-12 11:29:17 -08:00
Jim
d94acc0363 Merge pull request #2830 from jsfb/remove-tag-warning
Removed unknown tag warning/whitelist.
2015-01-12 10:42:44 -08:00
Ben Alpert
a5aacb947f Warn when mutating props on a ReactElement
Test Plan: jest. Also used ballmer-peak in IE8 to verify that it still works.
2015-01-11 10:45:37 -10:00
Christopher Chedeau
f50da7ec63 Merge pull request #2832 from kikyous/patch-1
Update 07-forms.md
2015-01-10 13:54:05 -08:00
Jim
61f7a5613b Removed unknown tag warning/whitelist. 2015-01-09 11:46:47 -08:00
chen
bb52715f1c Update 07-forms.md 2015-01-09 10:19:42 +08:00
Paul O’Shannessy
8babd0ada3 [docs] Talk about running a server in tutorial
We've talked about this a few times and even half done it. This is for
real.
2015-01-07 17:26:54 -08:00
Paul O’Shannessy
5394acdb4b Merge pull request #2799 from stkb/master
Wrap setInnerHTML in Windows 8 apps (Fixes #441)
2015-01-07 16:47:32 -08:00
Paul O’Shannessy
4772967e29 Remove period from findDOMNode test filename 2015-01-07 15:16:31 -08:00
Paul O’Shannessy
6204aeec7d Merge pull request #2822 from zpao/rm-immutable
Remove LegacyImmutableObject
2015-01-07 13:27:21 -08:00
Jim
9514861d93 Merge pull request #2814 from jsfb/testutils-consolemock
Added jasmine matcher that expects calls to console.warn.
2015-01-07 13:10:53 -08:00
Paul O’Shannessy
7863175cd9 Remove LegacyImmutableObject
We don't use it and it's not part of the build so nobody else is using
it. You should probably use immutable instead anyway.
2015-01-07 11:37:52 -08:00
Paul O’Shannessy
52e8ba4a40 Add boxFlex and boxFlexGroup to CSS Unitless Properties
Fixes #2812
2015-01-07 11:27:43 -08:00
Jason Bonta
cdec83732d suggesting the use of immutable js for comparisons 2015-01-07 10:46:50 -08:00
Jim
bd4aff062d Added jasmine matcher that expects calls to console.warn. 2015-01-06 14:05:37 -08:00
Paul O’Shannessy
a45472e050 Merge pull request #2793 from huang47/improve/use-bundle-collapser-to-reduce-file-size
use bundle-collapser to reduce browserified file size
2015-01-05 15:43:04 -08:00
Paul O’Shannessy
680bfd54a6 Merge pull request #2807 from JoshSGman/patch-1
Fix Outdated Copyright Year
2015-01-05 15:42:12 -08:00
Jim
e5b3f9aefa Merge pull request #2520 from jsfb/warn-for-dangerouslySetInnerHtml
Added checks for incorrect usage of innerHTML. Fixes #1370
2015-01-05 13:39:16 -08:00
Jim
158e0dd35a Merge pull request #2614 from jsfb/monitor-should-update-owner-is-useful
Find cases where shouldUpdateReactComponent is det
2015-01-05 13:32:43 -08:00
Jim
2a28189bea Merge pull request #2800 from jsfb/getDOMNode-becomes-findDOMNode
Minor updates to findDOMNode, as per additional post-commit CR feedback.
2015-01-05 13:29:14 -08:00
Jim
f507ba3c2b Minor updates to findDOMNode, as per additional post-commit CR feedback. 2015-01-05 13:26:35 -08:00
ShihChi Huang
9bc1961936 apply browserify bundle collapser to all build type 2015-01-05 13:15:16 -08:00
Joshua Goldberg
e926d4ff54 Fix Outdated Copyright Year
Fix outdated copyright year (update to 2015)
The copyright year was out of date. Copyright notices must reflect the current year. This commit updates the listed year to 2015.
2015-01-05 13:52:20 -05:00
Paul O’Shannessy
a7028c467f Merge pull request #2801 from jsfb/componentDidUpdate-docs
Update docs to indicate that componentDDidUpdate is fired after changes are flushed to the DOM.  Fix
2015-01-05 09:34:38 -08:00
Steve Baker
9c55b961d3 code formatting fixes 2015-01-05 18:21:53 +01:00
Paul O’Shannessy
26636e501d Merge pull request #2791 from rickbeerendonk/patch-1
Update ref-09-glossary.md
2015-01-05 09:05:46 -08:00
Paul O’Shannessy
7295f36b0f Merge pull request #2788 from mihaip/master
SyntheticEvent.timeStamp is a number, not a Date
2015-01-05 09:05:19 -08:00
Jim
08c5e42649 Update docs to indicate that componentDDidUpdate is fired after changes are flushed to the DOM. Fixes #2796 2015-01-02 14:02:44 -08:00
Steve Baker
3287ea52fe Wrap setInnerHTML in Windows 8 apps 2015-01-02 20:28:58 +01:00
Cheng Lou
d0f2e7db5f [Docs] Tip on integration with other libraries
Chose this title because it's more eye-catchy than "third-party integration".
2015-01-01 16:09:45 -05:00
ShihChi Huang
f214776a97 use bundle-collapser to reduce browserified file size 2014-12-30 23:16:04 -08:00
Rick Beerendonk
717b6d6249 Update ref-09-glossary.md
Minor grammatical fix.
2014-12-30 23:42:38 -05:00
Mihai Parparita
c0e33e8e76 SyntheticEvent.timeStamp is a number, not a Date
Also makes the a few other attribute types use lowercase (primitive) naming, to be consistent.
2014-12-30 12:06:49 -08:00
Paul O’Shannessy
ebf4cb4fab Merge pull request #2785 from c-das/patch-1
Update 02-displaying-data.md
2014-12-30 06:45:18 -08:00
Chitharanjan Das
b25e2e70d8 Update 02-displaying-data.md
Just a couple of minor grammatical fixes.
2014-12-30 10:49:44 +00:00
Sebastian Markbåge
82a30268a3 Merge pull request #2767 from sebmarkbage/moderntypevalidation
Add late class validation warnings for statics
2014-12-29 12:45:49 -05:00
Sebastian Markbage
82d15c8fd5 Add late class validation warnings for statics
ES6 classes won't have an early validation step. Therefore I added some
extra validation later on in the process. These would've normally have
been caught by createClass in classic React.
2014-12-29 12:43:40 -05:00
Sebastian Markbåge
9cd290a8c8 Merge pull request #2783 from dylanharrington/master
Fix typo in warning for invalid reused markup
2014-12-29 12:14:22 -05:00
Sebastian Markbåge
bd5a91a55c Merge pull request #2768 from sebmarkbage/duplicatetests
Removed some duplicate tests
2014-12-29 09:10:26 -08:00
Dylan Harrington
159ba54b8c Fix typo in warning message for invalid reused markup 2014-12-29 01:55:16 -08:00
Sebastian Markbåge
11f83c1fa0 Merge pull request #2769 from sebmarkbage/breakonwarning
Throw a caught error in the default warning module
2014-12-25 14:47:34 -08:00
Paul O’Shannessy
b98facd76e Merge pull request #2773 from vanesyan/patch-1
Update ref-01-top-level-api.md
2014-12-25 10:42:47 -08:00
Roman Vanesyan
172dec8351 Update ref-01-top-level-api.md
React isn't framework, it's library for UI!?
2014-12-24 14:39:37 +05:00
Paul O’Shannessy
6ca8bf82f5 Merge pull request #2772 from zpao/fixjsdoc
Fixup jsdoc for findDOMNode
2014-12-23 15:58:59 -08:00
Paul O’Shannessy
20c43d4ec8 Fixup jsdoc for findDOMNode 2014-12-23 15:56:05 -08:00
Paul O’Shannessy
41b919bb81 Merge pull request #2771 from zpao/temp-fix-empty-component
Temporarily fix EmptyComponents
2014-12-23 15:43:00 -08:00
Paul O’Shannessy
b2bf83ec85 Temporarily fix EmptyComponents
This a workaround for the problem described in #2770. It should be
temporary because this is really just working around the real problem.
2014-12-23 15:33:53 -08:00
Sebastian Markbage
f1bab136d0 Throw a caught error in the default warning module
This throws an error that is immediately caught. This allows you to use the
debugger's "break on caught exception" feature to break on warnings.

This should help with tracking down these warnings using the stack.

However, it could also add more noise to other debugging pattern.
2014-12-23 14:21:04 -08:00
Sebastian Markbage
8864692237 Removed some duplicate tests
These tests are duplicates of the same test in the same file. Copy/paste
fail.
2014-12-23 13:59:11 -08:00
Paul O’Shannessy
3fec78638d v0.13.0-alpha.1
Bumping version numbers so we can push to npm.
2014-12-23 12:04:23 -08:00
Paul O’Shannessy
343cda72d9 Merge pull request #2760 from alextsg/patch-3
Update 14-communicate-between-components.md for grammatical changes
2014-12-22 13:56:44 -08:00
Paul O’Shannessy
fe1edb60eb Merge pull request #2759 from alextsg/patch-2
Update 05-maximum-number-of-jsx-root-nodes.md for capitalization
2014-12-22 13:56:10 -08:00
Paul O’Shannessy
f0f431e428 Check for lineNumber support before using it 2014-12-22 13:43:59 -08:00
Jim
e0725341cf Merge pull request #2646 from jsfb/getDOMNode-becomes-findDOMNode
Added findDOMNode, as we move toward deprecating getDOMNode
2014-12-22 13:05:49 -08:00
Alexander Tseung
92c37ffb3d Update 14-communicate-between-components.md 2014-12-21 00:14:34 -08:00
Alexander Tseung
3fd6ac56c1 Update 05-maximum-number-of-jsx-root-nodes.md 2014-12-20 23:59:34 -08:00
Paul O’Shannessy
f7166d0c97 Merge pull request #2754 from songawee/fix_version_typo
Fix version typo in grunt task
2014-12-20 15:00:37 -08:00
Dennis Johnson
5216460246 Fix version typo in grunt task 2014-12-20 12:29:06 -07:00
Paul O’Shannessy
7ed36c30b1 Merge pull request #2752 from peterblazejewicz/fix/blog-typo
Fix conference year typo in blog post content
2014-12-19 14:30:06 -08:00
Peter Blazejewicz
ef4e75b031 Fix conference year typo in blog post content 2014-12-19 23:06:24 +01:00
Paul O’Shannessy
b7734a7000 Diversity Scholarship blog post 2014-12-19 13:22:23 -08:00
Sebastian Markbåge
6c6ffdb064 Merge pull request #2748 from sebmarkbage/modern
Separate createElement and JSX tests
2014-12-18 18:16:06 -08:00
Sebastian Markbage
cea2c38733 Separate createElement and JSX tests
This essentially copies all classic element creation tests to the modern
JSX tests. The classic tests doesn't use JSX and modern tests do.

The idea is that the JSX tests can start dropping dynamic checks once
we have Flow support for those features. JSX won't be necessary for
dropping dynamic checks. Plain object will also work. Flow will also not
be necessary for JSX. However, the tests should test for the suggested
combination (JSX + Flow).

This also moves some misplaced tests to ReactDOM and Validator.

Note that the modern tests uses ES6 classes. I will add separate tests for
those. However, these are not guaranteed to have .displayName so all our
error messages should check .name if available instead. This should be
better abstracted but I just adhoc fix this for now.
2014-12-18 16:13:29 -08:00
Sebastian Markbåge
60b2241ad4 Merge pull request #2745 from sebmarkbage/types
Add placeholders for static prop type tests
2014-12-18 15:13:36 -08:00
Jim
a463191bb2 Find cases where shouldUpdateReactComponent is determined by the owner. 2014-12-18 14:24:09 -08:00
Paul O’Shannessy
c63de4b79b Merge pull request #2586 from RileyTomasek/master
Fix typo in comment of jquery-bootstrap example
2014-12-18 14:15:30 -08:00
Jim
b46a6ce4bb Added findDOMNode, as we move toward deprecating getDOMNode 2014-12-18 13:55:44 -08:00
Sebastian Markbage
e31f23fc2a Add placeholders for static prop type tests
This is where tests of static prop types should go when we have the
infrastructure set up to handle it.
2014-12-18 13:52:56 -08:00
Sebastian Markbåge
435aac26af Merge pull request #2744 from sebmarkbage/types
Renamed classic/propTypes to classic/types
2014-12-18 13:42:45 -08:00
Sebastian Markbage
019028bec4 Renamed classic/propTypes to classic/types
I want to create a parallel folder for static type checking in the
"modern" folder so lets use the generic "types" name.
2014-12-18 13:40:32 -08:00
Paul O’Shannessy
d488f534ae 0.12.2 starter kit
(cherry picked from commit 6c5cb72cdc)
2014-12-18 12:47:33 -08:00
Paul O’Shannessy
378112f380 v0.12.2 blog post
(cherry picked from commit 2f6a95d5a2)
2014-12-18 12:47:32 -08:00
Paul O’Shannessy
2eb6cf6dd0 Readme + Changelog for 0.12.2
(cherry picked from commit 7468f092ae)
2014-12-18 12:47:32 -08:00
Paul O’Shannessy
3c2fc6440e update docs for 0.12.2 changes
(cherry picked from commit e6e60c4fa8)
2014-12-18 12:47:32 -08:00
Sebastian Markbåge
702eef0bf0 Merge pull request #2740 from facebook/revert-2613-monitor-cloneWithProps
Revert "Monitoring code use of cloneWithProps"
2014-12-18 12:13:34 -08:00
Sebastian Markbåge
7354a699ff Revert "Monitoring code use of cloneWithProps" 2014-12-18 12:13:09 -08:00
Riley Tomasek
84a93fbacf Improve comment in example code
This should make it more clear that even though `$` is used in 4 methods, only 2 of them are crucial for integrating the modal into the components lifecycle methods and the other 2 are just helpers.
2014-12-18 10:05:25 -05:00
minwe
309507955b add Event System doc Chinese translation 2014-12-18 13:10:02 +08:00
minwe
60ffe1e22e add Forms doc Chinese translation 2014-12-18 12:27:28 +08:00
Paul O’Shannessy
11785db573 Merge pull request #2727 from zpao/update-npm-deps
Update NPM dependencies
2014-12-17 16:56:14 -08:00
Paul O’Shannessy
c17ea85483 Merge pull request #2732 from zpao/travis-container
Use containers on TravisCI
2014-12-17 16:54:12 -08:00
Paul O’Shannessy
2620161d93 Merge pull request #2733 from morenoh149/patch-1
Added note for proper example display
2014-12-17 16:17:50 -08:00
Harry Moreno
9adb4447cd Added note for proper example display
jsfiddles weren't showing up for me. Upon further investigation I found that changing to http fixes the embedding.
2014-12-17 12:52:49 -08:00
Paul O’Shannessy
626023fc52 Merge pull request #2726 from zpao/createElement-undefined-null
Protect better against createElement(null/undefined)
2014-12-17 10:46:49 -08:00
Paul O’Shannessy
1bd8990fb2 Use containers on TravisCI
This *should* enabled the caching of node_modules for faster builds. We
may need to tweak this later to make sure node_modules gets updated

See http://blog.travis-ci.com/2014-12-17-faster-builds-with-container-based-infrastructure/
2014-12-17 10:44:07 -08:00
Paul O’Shannessy
50a0d69961 Protect better against createElement(null/undefined)
This adds a warning to React.createElement in __DEV__ about using null
or undefined. This is technically valid since element creation can be
considered safe and usable in multiple rendering environments. But
rendering in a DOM environment with an element with null/undefined type
is not safe.
2014-12-17 10:38:02 -08:00
Paul O’Shannessy
401d4dd108 Update NPM dependencies
This was mostly to update Jest, but the others were the safe ones from
`npm outdated --depth=0`
2014-12-16 14:17:10 -08:00
Paul O’Shannessy
5f4d759a2b Merge pull request #2718 from alextsg/patch-1
Update tutorial.md for grammatical changes
2014-12-16 09:48:23 -08:00
Paul O’Shannessy
558afae61a Changelog, Readme updates for v0.12.1
(cherry picked from commit a067fc0fee)
2014-12-16 09:44:00 -08:00
jeffmo
849e79fef4 Include 0.12.1 starter kit
(cherry picked from commit e9dde65341)
2014-12-16 09:44:00 -08:00
Alexander Tseung
a53270267f Update tutorial.md for grammatical changes
Update tutorial.md to improve grammatical parallelism in features list. Also added periods to follow first item's syntax.

BEFORE: "Live updates: as other users comment we'll pop them into the comment view in real time"
AFTER: "Live updates: other users' comments are popped into the comment view in real time."

BEFORE: "Markdown formatting: users can use Markdown to format their text"
AFTER: "Markdown formatting: users can use Markdown to format their text."
2014-12-15 23:43:26 -08:00
Paul O’Shannessy
f13b4641bb Merge pull request #2716 from RichardLitt/patch-2
Delete extraneous period
2014-12-15 13:16:38 -08:00
Richard Littauer
4f7b37f73a Delete extraneous period 2014-12-15 13:14:00 -08:00
Paul O’Shannessy
6abb1c9e84 Merge pull request #2710 from zpao/lint-fix-again
Fix lint
2014-12-14 22:12:43 -08:00
Aaron Franks
a5ae126630 Docs: ReactComponent -> ReactClass in a few places 2014-12-14 17:03:02 -08:00
Paul O’Shannessy
63d8e0c144 Fix lint 2014-12-14 15:22:24 -08:00
Paul O’Shannessy
0b0fa760cc Merge pull request #2647 from zpao/text-component-expect
Add toBeTextComponentWithValue to reactComponentExpect
2014-12-14 14:33:37 -08:00
Paul O’Shannessy
42ae61d065 Merge pull request #2655 from zpao/rm-deprecated
Remove deprecated methods since 0.12 shipped
2014-12-14 14:33:16 -08:00
Paul O’Shannessy
c46dadea55 Remove deprecated methods since 0.12 shipped 2014-12-14 14:19:44 -08:00
Paul O’Shannessy
c9fb5b258e Add toBeTextComponentWithValue to reactComponentExpect
This was previously possible by looking at renderedChildren and props
but this feels better.
2014-12-14 14:12:29 -08:00
Paul O’Shannessy
ca5d93ca0a Merge pull request #2708 from zpao/strip-types
Enable strip-types transform for internal code
2014-12-14 13:08:34 -08:00
Paul O’Shannessy
a818097a60 Merge pull request #2705 from Swader/patch-1
Update 02-displaying-data.md
2014-12-14 13:00:51 -08:00
Paul O’Shannessy
9016665c0e Enable strip-types transform for internal code
Flow is coming so we need to be ready.
2014-12-14 12:51:39 -08:00
Cam Song
09e0dee307 Sync up previous Chinese documents and several minor updates on formats. 2014-12-14 15:30:10 +08:00
Cam Song
db569f0c0a Add Chinese translation of interactivity-and-dynamic-uis 2014-12-14 15:30:00 +08:00
Bruno Škvorc
e507dc08d5 Update 02-displaying-data.md
Typo fix
2014-12-14 08:03:35 +01:00
Cam Song
f84ede6d34 Add Chinese translation of jsx-gotchas 2014-12-14 04:28:57 +08:00
Sebastian Markbåge
6bb77b5d4d Merge pull request #2700 from sebmarkbage/classic
Move ReactClass, ReactElement and ReactPropTypes into "classic"
2014-12-12 19:53:28 -08:00
Sebastian Markbage
801e953334 Move ReactClass, ReactElement and ReactPropTypes into "traditional"
This moves ReactClass, ReactElement and ReactPropTypes into a legacy folder
but since it's not quite legacy yet, I call it "classic".

These are "classic" because they are decoupled and can be replaced by
ES6 classes, JSX and Flow respectively.

This also extracts unit tests from ReactCompositeComponent, which was
terribly overloaded, into the new corresponding test suites.

There is one weird case for ReactContextValidator. This actually happens in
core, and technically belongs to ReactCompositeComponent. I'm not sure
we will be able to statically validate contexts so this might be a case
for dynamic checks even in the future. Leaving the unit tests in classic
until we can figure out what to do with them.
2014-12-12 17:54:35 -08:00
Paul O’Shannessy
d1ab4cda4b Merge pull request #2694 from camsong/master
Add Chinese translation of js-spread
2014-12-12 09:47:07 -08:00
Cam Song
9c7dc5f3b8 Add Chinese translation of js-spread 2014-12-12 09:33:01 +08:00
Paul O’Shannessy
80ed4d870a Merge pull request #2690 from salier/before-input
Combine BeforeInput and Composition event plugins
2014-12-11 17:08:26 -08:00
Jim
df81c9916b Merge pull request #2695 from jsfb/fix-scry2
Fixed ReactTestUtils scry for TextComponents.  Fix
2014-12-11 16:54:55 -08:00
Jim
74f5b21758 Fixed ReactTestUtils scry for TextComponents. Fixes issue #2654. 2014-12-11 13:12:35 -08:00
Paul O’Shannessy
91eb2e2f99 Merge pull request #2689 from camsong/master
Add Chinese translation of jsx-in-depth
2014-12-10 15:12:55 -08:00
Isaac Salier-Hellendag
9ad0e1d846 Update BeforeInputEventPlugin.js 2014-12-10 11:36:39 -05:00
Isaac Salier-Hellendag
ddaf215b03 Combine BeforeInput and Composition event plugins
In order to improve support for Chinese and Japanese IME input in
Internet Explorer, use a fallback composition state to determine
inserted text. IE composition events are mostly okay, except for
certain punctuation characters that are ignored. Using the fallback, we
can detect these characters.

The fallback is also useful for emitting `beforeInput` events, so it
makes sense to simply combine these plugins.

This change also incorporates a recent change to the Google Input Tools
browser extension that exposes a `data` field via the `detail` object
on the custom composition events it emits.
2014-12-10 11:32:53 -05:00
Cam Song
8621b4d338 Add Chinese translation of jsx-in-depth 2014-12-11 00:19:15 +08:00
Paul O’Shannessy
ed1803dc16 Merge pull request #2679 from tschaub/patch-1
Add missing verb in docs
2014-12-09 14:04:57 -08:00
Tim Schaub
877d00d9ba Add missing verb
This adds a missing verb in JSX-in-depth doc.
2014-12-08 15:08:57 -08:00
Paul O’Shannessy
ba95ce7b6f Merge pull request #2677 from zpao/lint-internal
Fix new lint errors
2014-12-08 12:22:06 -08:00
Paul O’Shannessy
739baa9092 Fix new lint errors
We'll get to lint parity soon and then not need to do this.
2014-12-08 12:18:41 -08:00
Aaron Franks
93ce334368 Add top-level API docs for React.createFactory. 2014-12-08 07:54:13 -08:00
Aaron Franks
09cfe453b8 Add type signature info to top-level API docs. 2014-12-07 23:17:27 -08:00
Ben Alpert
b97bb21ea2 Merge pull request #2672 from cookfront/master
The same problem in issue #2648
2014-12-06 23:50:43 -08:00
cookfront
7fad8fddf1 The same problem in issue #2648 2014-12-07 15:42:51 +08:00
Cheng Lou
cfe97641ce Merge pull request #2671 from benkeen/patch-1
Update 10.6-update.md
2014-12-06 20:12:21 -05:00
Benjamin Keen
2ee870e253 Update 10.6-update.md
Spelling fix.
2014-12-06 15:49:22 -08:00
Paul O’Shannessy
5c1589b81e Merge pull request #2658 from ianobermiller/margin-attrs
Support marginHeight and marginWidth attributes
2014-12-04 19:02:34 -08:00
Paul O’Shannessy
dd844bffc0 Merge pull request #2489 from cody/form
Add Attributes formAction, formEncType, formMethod and formTarget
2014-12-04 19:01:32 -08:00
Ian Obermiller
9d7467e225 Don't need MUST_USE_ATTRIBUTE for margin(Width|Height) 2014-12-04 11:02:35 -08:00
Ian Obermiller
96bd155cbd Support marginHeight and marginWidth attributes
marginHeight and marginWidth are used on iframes to set the default body margin inside the iframe.
2014-12-04 07:35:17 -08:00
Isaac Salier-Hellendag
0e1185cdbf Merge pull request #2653 from salier/ie-selection
Use getSelection in IE where available
2014-12-03 14:19:49 -08:00
Isaac Salier-Hellendag
6b46e80bb9 Use getSelection in IE where available
IE9+ has support for window.getSelection, but we’re still using
document.selection for IE9/10. Only use the old IE selection API if the
modern one is unavailable.
2014-12-03 14:03:26 -08:00
Paul O’Shannessy
3144485cb9 Merge pull request #2635 from zpao/docs/props-state-clarification
[docs] Clarify when state may duplicate props
2014-12-03 11:24:21 -08:00
Paul O’Shannessy
b3cd299ed7 Merge pull request #2639 from zpao/own-jsfiddle
Own our fiddles so we can update them more easily
2014-12-03 11:24:08 -08:00
Paul O’Shannessy
b1971a7e27 Merge pull request #2649 from cookfront/master
In `Transferring Props` guide, `Manual Transfer` section will lead an er...
2014-12-03 11:13:40 -08:00
Paul O’Shannessy
a66430aec3 Merge pull request #2651 from arnihermann/use-charat-not-string-index-markup-diff
Use String.charAt to lookup string characters by index
2014-12-03 10:57:30 -08:00
Árni Hermann Reynisson
fdffec73c3 Use String.charAt for character by index lookup
Using object property accessor for string character lookup breaks in
non-modern browsers.
2014-12-03 14:49:55 +00:00
张敏
218a9ae74d In Transferring Props guide, Manual Transfer section will lead an error
```c
var FancyCheckbox = React.createClass({
  render: function() {
    var fancyClass = this.props.checked ? 'FancyChecked' : 'FancyUnchecked';
    return (
      <div className={fancyClass} onClick={this.props.onClick}>
        {this.props.children}
      </div>
    );
  }
});
React.render(
  <FancyCheckbox checked={true} onClick={console.log}>
    Hello world!
  </FancyCheckbox>,
  document.body
);
```

When click `Hello world!` will lead a `Uncaught TypeError: Illegal invocation` error
2014-12-03 17:28:55 +08:00
Paul O’Shannessy
bd6b10887a Remove unused require from ReactDOM-test
This happened internally in a codemod
2014-12-02 14:39:19 -08:00
Paul O’Shannessy
1bcf6ad77b Merge pull request #2615 from af/createElement-docs
Add top-level API docs section for React.createElement.
2014-12-02 11:19:26 -08:00
Paul O’Shannessy
9021423be9 Merge pull request #2636 from zpao/docs/spread-assign-update
[docs] Remove generic spread, Object.assign  mentions
2014-12-02 11:10:33 -08:00
Paul O’Shannessy
45bddda0f9 Merge pull request #2622 from rafd/patch-1
add note re: handling events in capture phase
2014-12-02 11:10:20 -08:00
Paul O’Shannessy
a76ffd56b7 Merge pull request #2623 from jbhatab/patch-1
Screencast interfacing react + backbone
2014-12-02 10:54:05 -08:00
Blaine Hatab
e1be9c0ad8 Screencast interfacing react + backbone 2014-12-02 10:49:16 -06:00
Paul O’Shannessy
2c2cac00f9 Own our fiddles so we can update them more easily 2014-12-01 19:33:43 -08:00
Paul O’Shannessy
e347e2975f Merge pull request #2616 from christianalfoni/patch-3
Adding link to wiki
2014-12-01 16:03:16 -08:00
Paul O’Shannessy
fc91d2fd72 [docs] Remove generic spread, Object.assign mentions 2014-12-01 13:54:26 -08:00
Paul O’Shannessy
0a3a85bf52 [docs] Clarify when state may duplicate props 2014-12-01 13:46:59 -08:00
Rafal Dittwald
b3438c5f4b Update ref-05-events.md
use backticks and change example into its own sentence
2014-12-01 15:36:01 -05:00
Paul O’Shannessy
4cc2993a01 Merge pull request #2633 from koba04/fix-addons-document
Fix addons documentation of development only part
2014-12-01 12:13:30 -08:00
Jim
aef7c4d1a1 Added checks for incorrect usage of innerHTML. Fixes #1370 2014-12-01 11:10:52 -08:00
Toru Kobayashi
a9115134b5 Fix addons documentation of development only part 2014-12-01 23:17:53 +09:00
Christopher Chedeau
f5a9ea8e03 Merge pull request #2629 from arnihermann/diff-msg-on-checksum-fail
Give context aware message if markup reuse fails
2014-12-01 10:16:40 +00:00
Árni Hermann Reynisson
a352b94f57 Give context aware message if markup reuse fails
The context is an extra message with comparison of where server and
client markup started to differ.
2014-12-01 10:15:07 +00:00
Paul O’Shannessy
5daffbb2c3 Merge pull request #2630 from shamrin/patch-1
fix typo in addons.update() $splice command help
2014-11-30 10:48:24 -08:00
Alexey Shamrin
92862ed601 fix typo in addons.update() $splice command help 2014-11-30 20:20:34 +03:00
Rafal Dittwald
4bc7c46c62 add note re: handling events in capture phase 2014-11-28 15:38:15 -05:00
Christian Alfoni
f09a39d963 Adding link to wiki
Based on conversation in https://github.com/facebook/react/pull/2501. A good place to guide people further in finding the complete set of tools needed to build an application.
2014-11-27 08:48:16 +01:00
Aaron Franks
5e7e07b6d8 Add top-level API docs section for React.createElement. 2014-11-26 23:18:10 -08:00
Jim
5bd0b249b7 Merge pull request #2613 from jsfb/monitor-cloneWithProps
Monitoring code use of cloneWithProps
2014-11-26 16:37:00 -08:00
Jim
d42b285b0c Monitoring code use of cloneWithProps 2014-11-26 16:29:09 -08:00
Paul O’Shannessy
bb97482729 Merge pull request #2610 from zpao/update-commonjs-example
Update commonjs example for 0.12
2014-11-26 13:08:24 -08:00
Paul O’Shannessy
e2dcc4a863 Update commonjs example for 0.12 2014-11-26 13:08:08 -08:00
Paul O’Shannessy
45a19a290c Merge pull request #2553 from mhuggins/headers-attribute
Permit th `headers` attribute
2014-11-26 11:15:21 -08:00
Paul O’Shannessy
c48b877253 Merge pull request #2596 from sebmarkbage/rce
reactComponentExpect expects itself
2014-11-26 11:10:00 -08:00
Paul O’Shannessy
84e35615d2 Merge pull request #2600 from zpao/npm-test
Use jest for `npm test`
2014-11-26 11:09:39 -08:00
Jim
aee73cc463 Merge pull request #2602 from jsfb/context-tripple-equals
Warn if context values differ, related to issue #2
2014-11-25 16:52:09 -08:00
Jim
90d75ab099 Warn if context values differ, related to issue #2112 2014-11-25 16:44:09 -08:00
Paul O’Shannessy
b2ace55d9d Merge pull request #2603 from facebook/revert-2601-rm-fbtransform-syntax
Revert "Remove fbtransform/syntax.js"
2014-11-25 16:43:46 -08:00
Paul O’Shannessy
f7f3df3acc Revert "Remove fbtransform/syntax.js" 2014-11-25 16:42:20 -08:00
Paul O’Shannessy
ce699e4a32 Merge pull request #2601 from zpao/rm-fbtransform-syntax
Remove fbtransform/syntax.js
2014-11-25 15:42:13 -08:00
Jim
3a8fb5fc1e Merge pull request #2597 from jsfb/render-into-document
Replaced document.createElement with ReactTestUtil
2014-11-25 15:35:26 -08:00
Paul O’Shannessy
2a540b3fb7 Remove fbtransform/syntax.js
This was a file we probably never should have synced out in the first
place. We don't use it and it provides the same basic functionality that
bin/jsx provides.
2014-11-25 15:34:28 -08:00
Paul O’Shannessy
fd3f8e70e2 Merge pull request #2566 from zpao/style-fixup
Fix lint warnings, style fixups
2014-11-25 15:11:27 -08:00
Paul O’Shannessy
3ce88d7c17 Use jest for npm test
I've given in and this is easier than `npm run jest`. `grunt test` still
exists and is used by Travis so this has no CI implications.
2014-11-25 15:07:46 -08:00
Paul O’Shannessy
b7b74b7efe Fix lint warnings, style fixups
Followup work for recent PRs
2014-11-25 15:06:30 -08:00
Jim
89fafad255 Replaced document.createElement with ReactTestUtils.renderIntoDocument where container was not subsequently utilized.
Fixes #1250
2014-11-25 12:06:22 -08:00
Steven Luscher
e18d87b53b Merge pull request #2594 from steveluscher/community-round-up-24
Wrote Community Roundup #24
2014-11-25 10:24:47 -08:00
Sebastian Markbage
a530f1c379 reactComponentExpect expects itself
This was a bug when reactComponentExpectInternal was separated from
the normal reactComponentExpect flow.
2014-11-24 18:48:41 -08:00
Steven Luscher
0f488bfe71 Community #24: New Carousel link, spelled react-prism correctly, and removed the whale-speak. 2014-11-24 18:24:52 -08:00
Steven Luscher
c94a48be4f Wrote Community Roundup #24 2014-11-24 18:12:59 -08:00
Sebastian Markbåge
47e18c3ce6 Merge pull request #2593 from sebmarkbage/mountImage
Add additional field for ART reconciler
2014-11-24 17:08:13 -08:00
Sebastian Markbage
61349eb5a6 Add additional field for ART reconciler
ART, just like MultiChild adds an expando property to manage it's diffing
state. This is ugly and bad. We should be moving this state outside the
component for use by the diffing algorithm. This state is not needed by
components nested in composites, and varies by diffing algorithm.

It sucks that I have to add it to every component just to support ART,
but that's the quickest solution, other than disabling preventExtensions.

At least now we know that it sucks.
2014-11-24 17:02:11 -08:00
Jim
e7f4badf4a Merge pull request #2579 from jsfb/context-to-warning-module
Use warning module for context warning instead of invoking console.warn ...
2014-11-24 14:42:23 -08:00
Jim
9f7901fe1d Use warning module for context warning instead of invoking console.warn and monitorCodeUse directly. Depends on https://phabricator.fb.com/D1695279 2014-11-24 13:24:56 -08:00
Christopher Chedeau
f8aee772ce Mention that talks will be recorded 2014-11-24 11:28:42 +00:00
Christopher Chedeau
c32cf03d0b better wording thanks to @jwalke 2014-11-24 10:33:23 +00:00
Christopher Chedeau
fb2be69e9c react.js conf updates 2014-11-24 09:26:00 +00:00
Ben Alpert
582bc932e5 Merge pull request #2583 from spicyj/style-example
Add example for how to use `style` properly
2014-11-21 14:27:32 -08:00
Ben Alpert
1c5443175c Add example for how to use style properly
Test Plan: jest
2014-11-21 12:10:59 -08:00
Ben Alpert
c6ed9df7f3 Merge pull request #2582 from spicyj/rendercomponent
Finish renaming renderComponent -> render
2014-11-21 11:54:36 -08:00
Ben Alpert
23effb7034 Merge pull request #2581 from spicyj/rm-elt-docs
Update variable name and doc type to be accurate
2014-11-21 11:54:26 -08:00
Riley Tomasek
08b6b28902 Fix typo in comment of jquery-bootstrap example 2014-11-21 12:05:39 -05:00
Ben Alpert
d4e32a7b2c Finish renaming renderComponent -> render
Test Plan: jest
2014-11-20 23:07:58 -08:00
Ben Alpert
c4b9b938cf Update variable name and doc type to be accurate
Test Plan: Crossed fingers.
2014-11-20 23:03:03 -08:00
Sebastian Markbåge
68ba3b6d18 Merge pull request #2567 from sebmarkbage/childrenreconciler
Separate Child Reconciliation Step from Diffing
2014-11-20 11:48:54 -08:00
Sebastian Markbage
26ea341870 Separate Child Reconciliation Step from Diffing
This separates the reconciliation step of children into a separate module.
This is the first step towards prerendering.

The stateful instances are reconciled and put into a "rendered children"
set. Updates creates a new of these sets. These two sets are then diffed
to create insert/move/remove operations on the set.

The next step is to move the ReactChildReconciler step to before the
native DOM component. That way it's possible to rely on child
reconciliation without relying on diffing.
2014-11-20 11:45:02 -08:00
Jim
6ec952977e Merge pull request #2565 from jsfb/fixwhitespace
Removed context paremeter to renderToString/renderToStaticMarkup.
2014-11-19 15:49:33 -08:00
Jim
7768d91363 Removed context paremeter to renderToString/renderToStaticMarkup. 2014-11-19 15:16:23 -08:00
Timothy Yung
006bc28633 Merge pull request #2571 from yungsters/cleanup
Replace `mountDepth` with `isTopLevel`
2014-11-19 13:43:50 -08:00
yungsters
fc7cf2ff63 Replace mountDepth with isTopLevel
Summary:
After #2570, `mountDepth` is only used to enforce that `setProps` and `replaceProps` is only invoked on the top-level component. This replaces `mountDepth` with a simpler `isTopLevel` boolean set by `ReactMount` which reduces the surface area of the internal API and removes the need to thread `mountDepth` throughout React core.

Reviewers: @sebmarkbage @zpao

Test Plan:
Ran unit tests successfully:

```
npm run jest
```
2014-11-19 13:13:08 -08:00
Timothy Yung
70b1426ef0 Merge pull request #2570 from yungsters/updates
Update Dirty Components in Mount Ordering
2014-11-19 13:12:43 -08:00
yungsters
c7fd626b1f Summary:
Currently, `ReactUpdates` updates dirty components in increasing order of mount depth. However, mount depth is only relative to the component passed into `React.render`. This breaks down for components that invoke `React.render` as an implementation detail because the child components will be updated before the parent component.

This fixes the problem by using the order in which components are mounted (instead of their depth). The mount order transcends component trees (rooted at `React.render` calls).

Reviewers: @sebmarkbage @zpao

Test Plan:
Ran unit tests successfully:

```
npm run jest
```
2014-11-19 12:51:55 -08:00
Paul O’Shannessy
3a0f30480d Merge pull request #2544 from mjul/patch-1
Update 10.4-test-utils.md
2014-11-19 07:16:07 -08:00
Paul O’Shannessy
a07ab60ec0 Merge pull request #2554 from samccone/patch-1
Update tutorial language to be more explicit.
2014-11-19 06:15:35 -08:00
Cheng Lou
93bbb3ea5b Merge pull request #2555 from mfunkie/patch-1
Animation documentation for ReactTransitionGroup
2014-11-18 22:33:48 -05:00
Sebastian Markbåge
b0f6f5449c Merge pull request #2552 from sebmarkbage/cleanupinternals
Remove some unnecessary code in ReactComponents
2014-11-18 13:51:39 -08:00
Sebastian Markbage
13ed0317fa Remove some invariants and deadcode
These are not necessary if we enable type checks. Static or dynamic.

They're distracting my greppability.

Also, some dead code in shallow rendering.
2014-11-18 13:04:56 -08:00
Timothy Yung
df87ea1fa6 Merge pull request #2465 from yungsters/perf
Preserve Implicit Method Names
2014-11-18 12:51:08 -08:00
yungsters
bda199de04 Preserve Implicit Method Names
Summary:
Changes the way we instrument methods for `ReactPerf` so that developer tools can assign implicit method names to measured functions.

Reviewers: @zpao @sebmarkbage
2014-11-18 12:48:58 -08:00
Mark Funk
5b2ffde48d Animation documentation for ReactTransitionGroup
Update to the animation documentation for ReactTransitionGroup to clear the air on where one can use it.

If someone tries to use it off of React.addons.ReactTransitionGroup, which is undefined, instead of its real location, React.addons.TransitionGroup, they get a vague error about being unable to set defaultProps of undefined in the React createElement body.
2014-11-18 13:49:23 -05:00
Timothy Yung
ef35585468 Merge pull request #2464 from yungsters/immutable
Stop Mutating Merged Lifecycle Results
2014-11-18 10:02:07 -08:00
yungsters
8e15046283 Stop Mutating Merged Lifecycle Results
Summary:
Currently, `ReactClass` mutates values returned by `getDefaultProps`, `getInitialState`, and `getChildContext`. This is bad because the objects may, for example, be cached and re-used across instances of a React component.

This changes `ReactClass` to instead create a new object. In return for allocating a new object, I've replaced `mapObject` with a `for ... in` so that we are no longer allocating an unused object.

Fair trade, IMO.

Test Plan:
Ran unit tests successfully:

```
npm run jest
```

Conflicts:
	src/core/ReactCompositeComponent.js

Conflicts:
	src/class/ReactClass.js
2014-11-18 10:00:22 -08:00
Sam Saccone
8e47082fb6 Update tutorial language to be more explicit.
The word "Friends" does establish a relationship however it does not fit in the vernacular of react. 
This change makes the phrase more explicit and more familiar.
2014-11-18 12:36:20 -05:00
Matt Huggins
9a472ca8f1 Permit th attribute 2014-11-18 07:52:25 -07:00
Sebastian Markbåge
e3e0bf5de2 Merge pull request #2550 from sebmarkbage/cleanupinternals
Move ComponentEnvironment out of ReactComponent
2014-11-17 17:41:32 -08:00
Jim
ef3b348bef Merge pull request #2508 from jsfb/monitor-with-context
Start monitoring uses of withContext, related to issue #2112
2014-11-17 17:23:39 -08:00
Sebastian Markbage
5951a131db Move ComponentEnvironment out of ReactComponent
We currently have three DOM specific hooks that get injected. I move those
out to ReactComponentEnvironment. The idea is to eventually remove this
injection as the reconciler gets refactored.

There is also a BackendIDOperation which is specific to the DOM component
itself so I move this injection to be more specific to the DOMComponent.

E.g. it makes sense for it to be injectable for cross-worker DOM operations
but it doesn't make sense for ART components.
2014-11-17 17:21:41 -08:00
Jim
46bff98a3f Fixed 'imports' to resolve merge conflict 2014-11-17 17:14:00 -08:00
Jim
89aaf73ae8 Merge pull request #2509 from jsfb/use-parent-context
Initial implementation of issue #2112
2014-11-17 17:08:18 -08:00
Jim
081feeb2dd Added warning if owner-based and parent-based contexts differ. 2014-11-17 17:02:20 -08:00
Sebastian Markbåge
fba8be3b98 Merge pull request #2546 from sebmarkbage/cleanupinternals
Move more stuff out of ReactComponent
2014-11-17 14:47:34 -08:00
Sebastian Markbage
6dddd60e33 Unused variables 2014-11-17 13:31:19 -08:00
Sebastian Markbage
fb17e8ca56 Ensure that all internal instances have consistent properties
Use preventExtensions so that we can't add expando properties to internal
instances. This ensures that the hidden class is kept more consistent.
2014-11-17 12:54:21 -08:00
Sebastian Markbage
bc4dd411b0 Move _pendingX into ReactCompositeComponent
Since setProps can no longer be called on anything but composites, we can
move this complexity into ReactCompositeComponent.
2014-11-17 12:54:21 -08:00
Sebastian Markbage
974a4c84ce Move mountComponentIntoNode and setProps out of ReactComponent
This is part of moving more logic out of the base classes.

setProps, replaceProps etc. are not accessible from anything other than
ReactClass so we can safely move it to ReactCompositeComponent.

mountComponentIntoNode is tightly coupled to ReactMount. It's part of the
outer abstraction, the mount point, not the individual component.
2014-11-17 12:54:21 -08:00
Scott Feeney
d75512f211 Merge pull request #2497 from graue/2393-v1
Basic shallow rendering support (#2393)
2014-11-17 11:07:05 -08:00
Scott Feeney
bfadafe5d0 Shallow rendering support (#2393)
Now handles updating. Haven't looked at refs yet.
2014-11-17 10:47:18 -08:00
Martin Jul
50db9feb28 Update 10.4-test-utils.md
This adds minimal valid event data to the Simulate.change example for a text input field.
2014-11-17 13:14:11 +01:00
Sebastian Markbåge
e4218cb7dc Merge pull request #2539 from sebmarkbage/cleanupinternals
Clean up a bunch of internal methods and fields that are now unnecessary
2014-11-16 21:13:07 -08:00
Sebastian Markbage
63644d5e71 Add test for warning in ReactElementValidator
I previously had a mistake here, so I'm adding a unit test to ensure that I
don't make the same mistake again.
2014-11-16 21:07:31 -08:00
Sebastian Markbage
dac59d1032 Drop the _owner and _lifeCycle field on internal instances
The _owner field is unnecessary since it's reachable from _currentElement.

The _lifeCycle field is unnecessary because an internal component should
not even need to exist at all if it's unmounted. It should be dereferenced
internally, and never exposed externally.

The only case where it's important is for batching updates where we
currently avoid calling performUpdateIfNecessary if it's mounted. However,
this function is already only executed "if necessary" so we just make sure
that it's not necessary after unmount by resetting all the pending fields.
2014-11-16 21:05:12 -08:00
Sebastian Markbage
03ae0a906b Drop ReactOwner.Mixin
This is not used anywhere else. To avoid overabstraction we should just
inline this.
2014-11-16 21:04:07 -08:00
Sebastian Markbage
519ee322ca Drop this.props 2014-11-16 21:04:04 -08:00
Sebastian Markbage
8181272fe8 Drop inaccessible methods
These are no longer accessible and the isOwnedBy check is only used in
a method that is not accessible.
2014-11-16 21:02:40 -08:00
Ben Alpert
a194e51af0 Move logic for null to instantiateReactComponent
This cleans up the code a bit and also brings us closer to allowing any ReactNode to be rendered at the top level.

Test Plan: jest
2014-11-16 17:41:54 -08:00
Ben Alpert
c96ea9abf2 Remove transferPropsTo
I'd like to outlaw prop mutation altogether, and now seems like a fine time to remove transferPropsTo.

Test Plan: jest
2014-11-16 17:41:07 -08:00
Ben Alpert
f391b7b3ca Don't mutate .props.style in ReactDOMComponent
We currently make a copy of .style because we support mutating the style object in place. Instead of storing it back on props, store it separately on the component instance so that we don't mutate props anywhere. This is gross but should all be cleaned up after #2008 is resolved.

Test Plan: jest
2014-11-16 17:39:00 -08:00
Ben Alpert
505bc7595b Fix up variable names and types to be correct
Test Plan: jest
2014-11-16 17:37:40 -08:00
Sebastian Markbåge
3aa56039c6 Merge pull request #2537 from sebmarkbage/hidedomcomponentinternals
Wrap every DOM node in a Composite Component
2014-11-16 15:35:04 -08:00
Ben Alpert
e619d25d03 Inject browser mixin before full-page components
createFullPageComponent doesn't reference ReactBrowserComponentMixin directly so the mixin should get injected before the components are created. Previously, this test failed because getDOMNode wasn't present on the component instance.

Test Plan: jest
2014-11-16 12:59:44 -08:00
Sebastian Markbage
9c3e2d833d Wrap every DOM node in a Composite Component
...unless they already have a wrapper. Also, add tagName to every wrapper.

This ensures that refs are consistent. They always look like composite
components. This effectively hides the internal implementation details of
real DOM components since you can no longer get a ref to one.

In the future we might want to drop this wrapper and have refs refer
directly to the DOM node.

I currently use a hacky way of auto-wrapping inside of ReactNativeComponent
so that any given string can be wrapped. Better suggestions are welcome.
2014-11-16 10:32:46 -08:00
Christopher Chedeau
e8e79472aa Merge pull request #2527 from gabelevi/master
Update stripTypes transform to use fixed up jstransform transform
2014-11-15 16:57:25 -08:00
Ben Alpert
795290d1b0 Fix problems with empty component ID registration
Fixes #2493, also closes #2353 as it incorporates a variant of that fix.

- Instead of having getEmptyComponent return `<noscript />` directly, wrap it in a class that we can easily identify later as being an empty component
- Cache the empty component element instead of recreating one each time
- Avoid touching the nullComponentIdsRegistry dictionary at all when not dealing with empty components
- Move empty-component tests to a separate file

Test Plan: jest
2014-11-15 12:35:11 -08:00
Ben Alpert
230115da92 Make ReactTextComponent properly injectable
ReactTextComponent's implementation is DOM-specific; instead of flattenChildren creating the ReactTextComponent instances, ReactNativeComponent now takes care of having ReactTextComponent injected and creating the component instance. I also renamed ReactTextComponent to ReactDOMTextComponent and moved it to browser/ui/ where it belongs. ReactDOMTextComponent no longer inherits directly from ReactComponent and instead implements construct and {mount,receive,unmount}Component directly.

This diff removes `ReactTestUtils.isTextComponent` which should have previously never returned true when using public APIs.

Test Plan: jest, use ballmer-peak example.
2014-11-15 12:30:42 -08:00
Sebastian Markbåge
9b1c3226d0 Merge pull request #2385 from shripadk/bool-fix
Fix: Always return boolean from isNullComponentID
2014-11-15 11:43:27 -08:00
Gabe Levi
0d308add09 Update stripTypes transform to use fixed up jstransform transform 2014-11-14 18:25:11 -08:00
Ben Alpert
903db8bd14 Stop treating key={null} as an unspecified key
This reverts commit dd92786fb0, which was intended to be temporary for the 0.12 release.

Fixes #2394.
2014-11-14 16:52:43 -08:00
Ben Alpert
22da7b6fa5 Warn when casing CSS vendor prefixes incorrectly
Fixes #2487.

Test Plan: jest
2014-11-14 16:51:55 -08:00
Cheng Lou
0db323e42a Merge pull request #2514 from jvalente/patch-1
Update ref-09-glossary.md
2014-11-13 13:45:35 -05:00
Lee Byron
81d4d7bf24 Merge pull request #2512 from leebyron/transition-appear
Adding "appear" phase to ReactTransitionGroup and ReactCSSTransitionGroup
2014-11-13 13:44:56 -05:00
João Valente
485d84fb9b Update ref-09-glossary.md 2014-11-13 12:06:51 +00:00
Lee Byron
8760a70e73 Adding "appear" phase to ReactTransitionGroup and ReactCSSTransitionGroup.
"appear" differs from "enter" in that all children of a transition group at mount time will "appear" but will not "enter". All children later added to an existing transition group will "enter" but not "appear".

This extra transition phase allows for animation-on-mount effects.

A mirroring "appear" prop has been added to ReactCSSTransitionGroup, however for reverse-compatibility (and because "appear" is less common) it defaults to false.

Thanks to @afa for his work investigating the possible ways to implement this.
2014-11-12 21:30:56 -05:00
Fabio M. Costa
f6dd6ef772 Removing unecessary resize listener
monitorScrollValue is only called with `ViewportMetrics.refreshScrollValues` (https://github.com/facebook/react/blob/master/src/browser/ReactBrowserEventEmitter.js#L333-L334) and the window scroll properties (scrollTop and scrollLeft) don't change on resize (from my testings), so there is no need to listen for window resizes.
I also tried to see why the resize listener was added from the history but it was introduced on the initial commits.
I created a simple page that shows that http://jsbin.com/nuhice, open the console.
2014-11-12 00:08:30 -08:00
Paul O’Shannessy
06bf89db8e Merge pull request #2498 from ikr/patch-1
There's no isComponentOfType() anymore
2014-11-11 13:25:33 -08:00
Ivan Krechetov
13311639cc There's no isComponentOfType() anymore 2014-11-11 09:25:33 +01:00
Stefan Dombrowski
1bb29cab7c Add Attributes formAction, formEncType, formMethod and formTarget
This resolves #2425.
2014-11-11 06:37:26 +01:00
Ben Alpert
7a162ce731 Merge pull request #2482 from BinaryMuse/bkt/fix-stroke-opacity
Add strokeOpacity to unitless CSS properties
2014-11-07 22:26:03 -08:00
Brandon Tilley
96126e9ff4 Add strokeOpacity to unitless CSS properties 2014-11-07 21:20:01 -08:00
Paul O’Shannessy
78ec2501cf Merge pull request #2481 from mjul/fix-typos
Fix some minor typos in doc comments / code comments.
2014-11-07 16:58:49 -08:00
Paul O’Shannessy
b243f1eec6 Merge pull request #2480 from spicyj/text-stability
Test that text spans aren't remounted needlessly
2014-11-07 16:56:58 -08:00
Paul O’Shannessy
14d0a22ae8 Merge pull request #2479 from spicyj/nitfix
Fix odd formatting in ReactDOMComponent-test
2014-11-07 16:55:06 -08:00
Martin Jul
042c6c794c Fix some minor typos in doc comments / code comments. 2014-11-07 18:07:07 +01:00
Ben Alpert
ba418c6014 Test that text spans aren't remounted needlessly
While working on #2382, I accidentally broke this behavior (causing text components to get unmounted and remounted for any update) but we didn't have any unit test for it. Now we do.

Test Plan: jest TextComponent
2014-11-06 23:19:48 -08:00
Ben Alpert
a1dcdf1a64 Fix odd formatting in ReactDOMComponent-test
Test Plan: Crossed fingers.
2014-11-06 23:10:17 -08:00
Sebastian Markbåge
c10a39e82b Merge pull request #2445 from sebmarkbage/classes
Separate React Composite and Class
2014-11-06 19:53:10 -08:00
Sebastian Markbage
27c482a2b8 Separate React Composite and Class
ReactClass is now composed by ReactCompositeComponent rather than
inherit from it.

The state transition functions currently use ReactInstanceMap to map an
instance back to an internal representation.

I updated some tests to use public APIs. Other unit tests still reach into
internals but now we can find them using ReactInstanceMap.

I will do more cleanup in follow ups. The purpose of this diff is to
preserve semantics and most of the existing code.

This effectively enables support for ES6 classes. All you would need to
expose is ReactClassMixin.
2014-11-06 19:49:33 -08:00
Ben Alpert
bd02e17fec Merge pull request #2476 from jsfb/patch-1
Using semicolon instead of "and" conjunction
2014-11-06 15:15:39 -08:00
Jim
dbe16a357b Using semicolon instead of "and" conjunction
The use of the conjunction "and" leads to an improper assertion about what should/shouldn't be done.  Using a semicolon resolves this by indicating the contrasting alternative.
2014-11-06 14:50:35 -08:00
Paul O’Shannessy
cbada1e55a Merge pull request #2473 from zertosh/docs-ssr-at-sc
Add React at SoundCloud talk
2014-11-06 14:05:10 -08:00
Paul O’Shannessy
df24852ca1 Merge pull request #2475 from jsfb/master
Use adjective "too" instead of "to"
2014-11-06 14:04:33 -08:00
jsfb
7f37074c33 Use adjective "too" instead of "to"
The author clearly intended to use the adjective "too" to mean "excessively" instead of the preposition "to".
2014-11-06 13:42:19 -08:00
Paul O’Shannessy
d12ae9d5bb Merge pull request #2241 from syranide/selectvalue
ReactDOMSelect makeover, fix edge-case inconsistencies and remove state
2014-11-06 12:40:15 -08:00
Andres Suarez
d5810e46f9 Add SSR at SoundCloud talk 2014-11-06 10:54:05 -05:00
Ben Alpert
9edc6260a7 Initial implementation of new-style refs
cf. #1373

This implementation can be used in any situation that refs can currently be used (and can also be used without an owner, which is a plus).
2014-11-05 19:28:12 -08:00
Pedro Nauck
1adbc22fde bugfix: remove conflict comment 2014-11-06 01:23:51 -02:00
Paul O’Shannessy
dca7ffbe21 Merge pull request #2446 from enaqx/master
Add 'use strict' to statisfy linter rules
2014-11-05 16:25:38 -08:00
Paul O’Shannessy
3e60195bd4 Merge pull request #2408 from Peeja/patch-1
TodoMVC live demos have moved.
2014-11-05 13:49:23 -08:00
Paul O’Shannessy
462f8ea9f6 Merge pull request #2452 from Shahor/master
Trailing commas break old IE versions
2014-11-05 11:00:12 -08:00
Paul O’Shannessy
a3509e5b42 Fixing some newline-preserving issues
Done internally as part of
f9836a3912
2014-11-05 10:36:22 -08:00
Pedro Nauck
a7f157ebb1 update namespaced component to adapt with the v0.12 2014-11-05 12:32:16 -02:00
Pedro Nauck
b5bcaba77f Merge branch 'master' into docs-namespace-in-jsx
* master: (113 commits)
  Remove esprima-fb and use Syntax from jstransform
  Update React.renderToString argument type in docs
  [traverseAllChildren] fix out-of-scope var use.
  Use double quote for transformed `displayName` and `data-*`
  Remove unrelated comment
  Fix typo in If/Else JSX doc.
  Cleanup a couple unused variables
  Use dump cache and remove factory from ReactElement-test
  Update deprecated propTypes
  Bring in jsfiddle integration script, add harmony
  Extending period in which click events are ignored
  React.renderComponent --> React.render
  Followup fix for React.PropTypes.node
  Add comma for readability in tutorial
  Drop internal uses of .type on the class
  Drop Legacy Factories Around Classes
  Drop ReactDOM from internal DOM extensions
  Added comma to increase readability.
  Add 0.12 starter kit
  Change the date and the link url to match the proper roundup
  ...

Conflicts:
	docs/docs/02.1-jsx-in-depth.md
2014-11-05 12:30:37 -02:00
Paul O’Shannessy
1fd187b994 Merge pull request #2224 from zertosh/remove-esprima-fb-dep
Remove esprima-fb and use Syntax from jstransform
2014-11-04 14:38:09 -08:00
Paul O’Shannessy
4ba53e1839 Merge pull request #1708 from chenglou/displayName
Use double quote for transformed `displayName`
2014-11-04 14:36:19 -08:00
Andres Suarez
bf0a857a92 Remove esprima-fb and use Syntax from jstransform 2014-11-04 17:10:12 -05:00
Paul O’Shannessy
984055c2f5 Merge pull request #2463 from fson/render-to-string-docs
Update React.renderToString argument type in docs
2014-11-04 09:37:12 -08:00
Ville Immonen
9c3357eef5 Update React.renderToString argument type in docs
renderToString and renderToStaticMarkup now take a ReactElement.
Update the documentation to reflect this recent change.
2014-11-04 17:02:00 +02:00
Lee Byron
d4ac1229a6 Merge pull request #2458 from leebyron/fix-iterable
[traverseAllChildren] fix out-of-scope var use.
2014-11-03 21:25:01 -05:00
Lee Byron
a3608d27ab [traverseAllChildren] fix out-of-scope var use.
Dear ES6 gods, bring us `let` soon.

This fixes an issue where non-keyed iterables are used as children and the value of `i` would be undefined because its used out of scope. This adds a separately scoped iteration index value and appropriately increments it as iteration continues. Doi.

While I'm in there, make the usage of falsey `nameSoFar` more obvious and more consistent with the existing usage on L115

Test plan: first wrote a test covering this previously untested path. Saw an identical issue as was experienced in development environment. Then ensured test passed after this diff.
2014-11-03 21:19:28 -05:00
Andreas Svensson
2601b6a0b0 ReactDOMSelect makeover, fix edge-case inconsistencies and remove state 2014-11-03 23:19:01 +01:00
Alexandre Gaudencio
6379342b71 Trailing commas break old IE versions 2014-11-03 02:54:23 +01:00
Nick Raienko
bea9fbbf62 Add 'use strict' to statisfy linter rules 2014-11-01 07:05:46 +02:00
Cheng Lou
eddbb0cfef Use double quote for transformed displayName and data-*
JSX currently transforms everything to double quote except these two. This way, it's at least consistent and will satisfy half of the people who do put a strict quotation linting on their project.

Test: `jest`, check the double quoted transformed `data-bla="something"`.
2014-10-31 15:49:24 -04:00
Sebastian Markbåge
cb50a8698b Remove unrelated comment
This is no longer unwrapping a legacy factory (which are gone).
2014-10-31 12:39:38 -07:00
Paul O’Shannessy
1666661a06 Merge pull request #2433 from zpao/fiddle-integration
Bring in jsfiddle integration script, add harmony
2014-10-31 11:22:57 -07:00
Paul O’Shannessy
1abe716358 Merge pull request #2443 from kruppel/kurt/minor-tip-typo
Fix typo in If/Else JSX doc.
2014-10-31 10:11:32 -07:00
Kurt Ruppel
4b3b32e418 Fix typo in If/Else JSX doc. 2014-10-31 09:52:44 -07:00
Sebastian Markbåge
881c9b5be8 Merge pull request #2435 from sebmarkbage/fixretest
Use dump cache and remove factory from ReactElement-test
2014-10-30 12:06:21 -07:00
Paul O’Shannessy
d8ed3e5cf9 Merge pull request #2437 from zpao/lint-cleanup
Cleanup a couple unused variables
2014-10-30 12:05:38 -07:00
Paul O’Shannessy
295c1e3652 Cleanup a couple unused variables 2014-10-30 11:38:53 -07:00
Paul O’Shannessy
bf99ab1c89 Merge pull request #2434 from Shraymonks/propTypes-docs
Update deprecated propTypes
2014-10-30 09:43:02 -07:00
Sebastian Markbage
7f7b7f386a Use dump cache and remove factory from ReactElement-test
We need to use dump cache because we don't enable it by default internally.

While I'm at it, I might as well kill the ComponentFactory variable which
is now just an alias.
2014-10-30 02:50:28 -07:00
Raymond Ha
92d171a4fc Update deprecated propTypes 2014-10-29 21:00:32 -07:00
Paul O’Shannessy
0f5368341f Bring in jsfiddle integration script, add harmony 2014-10-29 19:35:27 -07:00
Paul O’Shannessy
7071d1c316 Merge pull request #2419 from johnheroy/patch-1
Add comma for readability in tutorial.md
2014-10-29 18:03:48 -07:00
Paul O’Shannessy
eb7f806566 Merge pull request #2431 from wassil/master
Extending period in which click events are ignored
2014-10-29 18:02:44 -07:00
Juraj Dudak
c563e19739 Extending period in which click events are ignored 2014-10-29 14:06:37 -07:00
Paul O’Shannessy
b2b8e5c08a Merge pull request #2428 from cody/fixes
React.renderComponent --> React.render
2014-10-29 11:44:35 -07:00
Stefan Dombrowski
93ac4d09a1 React.renderComponent --> React.render
Also fixed a spelling mistake.
2014-10-29 19:05:16 +01:00
Paul O’Shannessy
ce1b394529 Followup fix for React.PropTypes.node
This should have gone in as a part of #2343
2014-10-28 22:49:25 -07:00
Sebastian Markbåge
a54ed49eb0 Merge pull request #2375 from sebmarkbage/droplegacyfactories
Drop Legacy Factories
2014-10-28 18:00:32 -07:00
John Heroy
129d66a62e Add comma for readability in tutorial 2014-10-28 15:22:40 -07:00
Sebastian Markbage
9b36b04d75 Drop internal uses of .type on the class 2014-10-28 15:08:52 -07:00
Sebastian Markbage
199a7d6903 Drop Legacy Factories Around Classes
Classes are now pure classes without a legacy factory around them.

Since classes will become just any function that returns a valid instance,
let's drop isValidClass.

There's some hacks in here for auto-mocking frameworks (jest) that mock the
prototype of these classes. These hacks allow these classes to be mounted.
2014-10-28 15:08:52 -07:00
Sebastian Markbage
531c2bc4c9 Drop ReactDOM from internal DOM extensions
These used to be exposed as strings on the legacy factories but are now
gone.
2014-10-28 15:08:52 -07:00
Paul O’Shannessy
581085ea1b Merge pull request #2416 from zachasme/update-jstransform
Update jstransform version to 7.0
2014-10-28 15:01:57 -07:00
Paul O’Shannessy
22ffb57a93 Merge pull request #2415 from zpao/sync-internal
Sync internal
2014-10-28 14:30:06 -07:00
Cheng Lou
86336997cd Merge pull request #2418 from spencer48/patch-1
(docs) Added commas to increase readability.
2014-10-28 17:26:18 -04:00
Spencer Handley
a55a3f77a1 Added comma to increase readability.
When thumbing through the docs, I noticed a few missing commas. I inserted two commas and did not alter any source code.
2014-10-28 13:56:14 -07:00
Paul O’Shannessy
17b190bee2 Add 0.12 starter kit 2014-10-28 11:48:53 -07:00
Christopher Chedeau
26c8a70c1d Change the date and the link url to match the proper roundup 2014-10-28 11:36:12 -07:00
Paul O’Shannessy
9e895bc360 Correct changes from 0.12-stable merge 2014-10-28 11:20:33 -07:00
Paul O’Shannessy
8b041eaa5a Merge branch '0.12-stable' 2014-10-28 11:18:02 -07:00
Zacharias
c260c45db3 Update jstransform version to ^7.0.0 2014-10-28 13:48:48 +01:00
Tienchai Wirojsaksaree
ff12423d63 Fixing touch/mouse issues with TapEventPlugin
On ios device, browser simulates mouse events, but does that with
a delay, because of double tap gesture. The problem is that
TapEventPlugins listens to both types of events, so it fires twice

Everytime there is a touch event, we should ignore mouse events that
follow it.  This way, we still respond to both mouse and touch events,
just ignore the device generated ones.
2014-10-27 17:02:03 -07:00
Paul O’Shannessy
1c241b3ebc Ensure PropTypes test works when warning module is replaced
For example, warning might be replaced with a module that throws errors,
as is the case internally when running tests. Previously we were
whitelisting this test to provide time to update callsites. Now we
aren't and it fails.
2014-10-27 16:58:54 -07:00
Paul O’Shannessy
85930e63db Merge pull request #2413 from LeonFedotov/patch-1
Changing api documentation for jsx transformer
2014-10-27 16:32:07 -07:00
Cheng Lou
18066a301e Merge pull request #2414 from benleiken/patch-1
Moved key requirement note into 'getting started'
2014-10-27 18:47:24 -04:00
Benjamin Leiken
bb0c7b4ca9 Moved key requirement note into 'getting started'
It's an important note and it was buried too far down the page. Now it's more prominent and harder for people to miss (like I did).
2014-10-27 10:22:57 -07:00
Leon Fedotov
a29d496443 Changing api documentation for jsx transformer
Hi in chrome debugger, the files that use sourcemaps from the transformer get "null" as the filename during debug, https://github.com/facebook/react/blob/master/main.js#L15 "sourceFilename" is used instead of "filename" to specify the filename in the sourcemap.
2014-10-27 19:18:22 +02:00
Christopher Chedeau
64a5355444 React.js Conf blog post
Closes #2412
2014-10-27 10:12:09 -07:00
Paul O’Shannessy
d63aa0f113 Move Object.assign file to align with internal 2014-10-26 17:14:00 -07:00
Paul O’Shannessy
076a8285f7 Merge pull request #2409 from enaqx/master
Remove obsolete jshint options
2014-10-26 11:12:20 -07:00
Nick Raienko
eb3337b018 Remove obsolete jshint options 2014-10-26 12:18:24 +02:00
Peter Jaros
411a6a1f0c TodoMVC live demos have moved. 2014-10-24 09:57:27 -04:00
Sebastian Markbåge
ae8771fe2e Merge pull request #2084 from kimagure/unmount-comp-error
Error when unmountComponentAtNode receives non-node
2014-10-23 12:53:40 -07:00
Sebastian Markbåge
29bcda463e Merge pull request #2387 from fabiomcosta/avoid_double_scrollread
avoid reading the scroll position twice
2014-10-23 12:51:23 -07:00
Sebastian Markbåge
b7cd3e7d1d Merge pull request #2396 from sebmarkbage/classmodule
Move Class Creation Concerns into a ReactClass Module
2014-10-23 12:50:17 -07:00
Sebastian Markbage
7ce8c844bd Hide ReactElement constructor
This prevents feature tests like:

var ReactElement = React.createElement(...).constructor;

if (element.constructor === ReactElement)

This is intentional so that we have the option to make these plain objects.
E.g. for direct inlining or replacing them with value types.
2014-10-23 12:08:14 -07:00
Paul O’Shannessy
8de03c47dd Merge pull request #2397 from mjul/fix-gruntfile
Added missing semicolon after statement.
2014-10-23 12:01:55 -07:00
Martin Jul
994fc7d8a7 Merge remote-tracking branch 'upstream/master' into fix-gruntfile 2014-10-23 09:55:43 +02:00
Martin Jul
c9fb57feb3 Added missing semicolons identified by using grunt jshint:project. 2014-10-23 09:54:13 +02:00
Sebastian Markbage
d9fe40e147 Move Class Creation Concerns to ReactClass
This moves logic responsible for class creation and mixins into
the ReactClass module. This currently creates a class that extends
the ReactCompositeBase but in the future, this will be decoupled as
ReactCompositeComponent will compose these classes.

This is just a cut/paste.
2014-10-22 21:25:20 -07:00
Sebastian Markbage
c7bb936566 Introduce React Class as an alias for Composite Component
This is in preparation for the separation of Composite Component internals
from the Class abstraction.
2014-10-22 18:35:10 -07:00
Lee Byron
d545238fd9 Merge pull request #2376 from leebyron/iterable
Allow iterables in traverseAllChildren
2014-10-22 18:18:08 -07:00
Ben Alpert
de1dacdb28 Refactor composite component update flow
Fixes #1392.

Previously, ReactComponent.updateComponent set the new props and owner and updated the component's refs. Because it did the actual props assignment, it had to be called by ReactCompositeComponent between componentWillMount and componentDidMount, meaning that it was skipped if shouldComponentUpdate returned false. Now, updateComponent takes the old and new descriptors and only updates refs, allowing a subclass to call updateComponent at a convenient time (specifically, it can be before `this._descriptor` is updated if the subclass also overrides performUpdateIfNecessary).

The new update cycle for composites is:

- receiveComponent is called which stores `this._pendingDescriptor` and calls performUpdateIfNecessary directly or a state update is enqueued, in which case ReactUpdates will call performUpdateIfNecessary
- performUpdateIfNecessary ensures that an update is still pending (which might no longer be the case if an update is queued for a subcomponent that was updated through a parent's reconciliation) and calls updateComponent with the old and new descriptors
- updateComponent calls super to update refs, then calls componentWillReceiveProps (if applicable) and shouldComponentUpdate -- if shouldComponentUpdate returns false, `this._descriptor`, `this.props`, and `this.state` are updated and the update is skipped; else, _performComponentUpdate is called
- _performComponentUpdate calls componentWillUpdate and _updateRenderedComponent, and enqueues the componentDidUpdate call (in that order)
- _updateRenderedComponent calls render and updates the rendered component appropriately

For DOM components (essentially unchanged):

- receiveComponent is called which does a short-circuit check for descriptor equality and delegates to super (which stores `this._pendingDescriptor` and calls performUpdateIfNecessary)
- performUpdateIfNecessary (not overridden) sets new values for `this.props`, etc. and calls updateComponent
- updateComponent does the DOM property and children updates (some synchronously, some queued for the transaction close)

For text and ART components (unchanged):

- receiveComponent updates the DOM or ART directly based on the new props
- updateComponent is never called

Notable changes:

- When shouldComponentUpdate returns false, refs are still updated
- ReactDefaultPerf now includes lifecycle methods in component timings
- updateComponent's signature changed (technically this is part of the public API, though we've never documented it)

Test Plan: jest
2014-10-22 17:59:58 -07:00
Ben Alpert
9c2125599c Add \n after <textarea> to fix missing linebreaks
Same for <pre> and <listing>. Browsers are crazy.

Test Plan: jest, verify in Chrome that starting textareas with a value starting with two newlines renders both newlines instead of one newline, as it did before.
2014-10-22 17:24:24 -07:00
Martin Jul
70fdd5a287 Added missing semicolon after statement. 2014-10-22 23:46:54 +02:00
Paul O’Shannessy
b78fe39b60 Bump version to 0.13.0-alpha 2014-10-22 14:19:54 -07:00
Lee Byron
c07ea0ba34 Allow iterables in traverseAllChildren
This lets you use any kind of iterable as a container of react child elements. It also preserves keys when possible if the iterable is keyed.

 * Use an ES6 Map or Set to hold children.
 * Use an Immutable-js collection to hold children.
 * Use a function* which yields children.

Concretely, this removes the necessary conversion to JS objects if you're mapping over Immutable-js collections to get children, i.e.:

```
<div>
  {myImmutable.map(val => <span>{val}</span>).toJS()
</div>
```

Now we can remove the `toJS()` and the intermediate allocation along with it.

This also cleans up the traverseAllChildrenImpl method.
2014-10-21 15:18:53 -07:00
Fabio M. Costa
dafaf1a42e avoid reading the scroll position twice 2014-10-20 13:30:02 -07:00
Shripad K
edab4814da Fix: Always return boolean from isNullComponentID 2014-10-21 00:43:04 +05:30
Beau Smith
df36c258b3 Highlighted changed lines in examples 2014-10-15 23:01:05 -07:00
Pedro Nauck
8a4b2763dc change note comment about namespaced components 2014-10-08 01:41:48 -03:00
Justin Woo
9c8ddb3316 Error when unmountComponentAtNode receives non-node 2014-10-07 21:12:56 -04:00
Pedro Nauck
fd9ddab532 change the global variable to a new sample component 2014-10-07 13:06:16 -03:00
Pedro Nauck
748a4ef1b2 add a section at 'jsx-in-depth' talking about namespaced components 2014-10-07 03:09:24 -03:00
Andreas Svensson
05fa75d395 IE8 does not have a setter for property "enctype" 2014-09-04 12:11:01 +02:00
508 changed files with 24086 additions and 9261 deletions

19
.eslintignore Normal file
View File

@@ -0,0 +1,19 @@
# We can probably lint these later but not important at this point
src/vendor
# eslint uses JSX* node types to determine if using JSX. esprima-fb still uses
# XJS* nodes. When we fix that (https://github.com/facebook/esprima/pull/85) we
# can enable linting the tests and fix those errors.
src/**/__tests__/**
# This should be enabled but that folder has too much in it that doesn't belong
src/test
test/the-files-to-test.generated.js
# This is synced with a different file internally, don't want to lint it yet
vendor/fbtransform/syntax.js
vendor/jasmine/
vendor/jasmine-jsreporter/
# But not in docs/_js/examples/*
docs/_js/*.js
docs/js/
# This should be more like examples/**/thirdparty/** but
# we should fix https://github.com/facebook/esprima/pull/85 first
examples/

51
.eslintrc Normal file
View File

@@ -0,0 +1,51 @@
---
parser: esprima-fb
env:
browser: true
node: true
globals:
__DEV__: true
rules:
# ERRORS
space-before-blocks: 2
indent: [2, 2, indentSwitchCase: true]
brace-style: 2
space-after-keywords: 2
strict: 2
# We actually have a transform to support this and we fix this for bundled
# releases but not for the npm package, so enforce it strictly
no-comma-dangle: 2
# Make this a warning for now. We do this in a few places so we might need to
# disable
no-unused-expressions: 2
block-scoped-var: 2
eol-last: 2
dot-notation: 2
consistent-return: 2
no-unused-vars: [2, args: none]
quotes: [2, 'single']
# WARNINGS
# This is the only one that's hard to track since we don't lint just changes.
max-len: [1, 80]
# WISHLIST. One day...
# We'll need a custom version of this that does a subset of the whole rule.
# Otherwise this is just too noisy.
# valid-jsdoc: 1
# DISABLED. These aren't compatible with our style
# We use this for private/internal variables
no-underscore-dangle: 0
# We pass constructors around / access them from members
new-cap: 0
# We do this a lot.
no-use-before-define: 0
# We do this in a few places to align values
key-spacing: 0
# DISABLED. These currently cause errors when running.
no-multi-spaces: 0

View File

@@ -1,21 +0,0 @@
{
"node": true,
"boss": true,
"curly": true,
"devel": true,
"eqnull": true,
"expr": true,
"funcscope": true,
"globalstrict": true,
"loopfunc": true,
"newcap": false,
"noempty": true,
"nonstandard": true,
"onecase": true,
"sub": true,
"regexdash": true,
"trailing": true,
"undef": true,
"unused": "vars"
}

View File

@@ -1,8 +1,13 @@
Alex Mykyta <dancingwithcows@gmail.com>
Andreas Svensson <andreas@syranide.com>
Andres Suarez <zertosh@gmail.com>
Ben Alpert <ben@benalpert.com> <balpert@fb.com>
Ben Alpert <ben@benalpert.com> <spicyjalapeno@gmail.com>
Ben Newman <bn@cs.stanford.edu> <benjamn@fb.com>
Bill Fisher <fisherwebdev@gmail.com>
Brandon Tilley <brandon@brandontilley.com>
Cheng Lou <chenglou92@gmail.com> <chenglou@fb.com>
Christian Oliff <christianoliff@yahoo.com>
Christoph Pojer <christoph.pojer@gmail.com>
Christoph Pojer <christoph.pojer@gmail.com> <cpojer@fb.com>
Connor McSheffrey <c@conr.me> <connor.mcsheffrey@gmail.com>
@@ -14,10 +19,12 @@ Evan Coonrod <evan@paloalto.com>
Fabio M. Costa <fabiomcosta@gmail.com> <fabs@fb.com>
Felix Kling <felix.kling@gmx.net> <fkling@fb.com>
François-Xavier Bois <fxbois@gmail.com>
Gabe Levi <gabelevi@gmail.com> <glevi@fb.com>
Geert Pasteels <geert.pasteels@gmail.com>
George A Sisco III <george.sisco@gmail.com>
Harry Hull <harry.hull1@gmail.com>
Hendrik Swanepoel <hendrik.swanepoel@gmail.com>
Ian Obermiller <ian@obermillers.com> <iano@fb.com>
Ingvar Stepanyan <me@rreverser.com> <rreverser@ubuntu.rreverser.a4.internal.cloudapp.net>
Irae Carvalho <irae@irae.pro.br>
Ivan Vergiliev <ivan.vergiliev@gmail.com>
@@ -29,18 +36,25 @@ Jason Bonta <jbonta@gmail.com> <jasonbonta@fb.com>
Jason Trill <jason@jasontrill.com>
Jeff Morrison <jeff@anafx.com> <Jeff@anafx.com>
Jeff Morrison <jeff@anafx.com> <jeffmo@fb.com>
Jeff Morrison <jeff@anafx.com> <lbljeffmo@gmail.com>
Jeffrey Lin <lin.jeffrey@gmail.com> <jeffreylin@fb.com>
Jim Sproch <jsproch@fb.com>
Jim Sproch <jsproch@fb.com> <jsfb@github>
Jon Madison <jon@tfftech.com>
Jonathan Hsu <jhiswin@gmail.com>
Jordan Walke <jordojw@gmail.com>
Jordan Walke <jordojw@gmail.com> <jordanjcw@fb.com>
Josh Duck <josh@fb.com> <github@joshduck.com>
Juan Serrano <germ13@users.noreply.github.com>
Jun Wu <quark@lihdd.net>
Keito Uchiyama <projects@keito.me> <keito@fb.com>
Kunal Mehta <k.mehta@berkeley.edu> <kunalm@fb.com>
Laurence Rowe <l@lrowe.co.uk> <laurence@lrowe.co.uk>
Martin Andert <mandert@gmail.com>
Mathieu M-Gosselin <mathieumg@gmail.com> <mathieumg@atx33.com>
Matt Zabriskie <mzabriskie@gmail.com>
Michal Srb <xixixao@seznam.cz> xixixao <xixixao@seznam.cz>
Minwe LUO <minwe@yunshipei.com>
Nick Gavalas <njg57@cornell.edu>
Nick Thompson <ncthom91@gmail.com> <nickt@instagram.com>
Paul OShannessy <paul@oshannessy.com> <poshannessy@fb.com>
@@ -52,16 +66,24 @@ Pete Hunt <floydophone@gmail.com> <phunt@instagram.com>
Petri Lievonen <plievone@cc.hut.fi>
Petri Lievonen <plievone@cc.hut.fi> <petri.lievonen@tkk.fi>
Pieter Vanderwerff <me@pieter.io> <pieter@heyday.co.nz>
Pouja Nikray <poujanik@gmail.com>
Ray <ray@tomo.im>
Richard Feldman <richard.t.feldman@gmail.com> <richard@noredink.com>
Richard Livesey <Livesey7@hotmail.co.uk>
Rob Arnold <robarnold@cs.cmu.edu>
Sander Spies <sandermail@gmail.com>
Scott Feeney <scott@oceanbase.org> <smf@fb.com>
Sebastian Markbåge <sebastian@calyptus.eu> <sema@fb.com>
Sergey Rubanov <chi187@gmail.com>
Steven Luscher <react@steveluscher.com> <github@steveluscher.com>
Steven Luscher <react@steveluscher.com> <steveluscher@instagram.com>
Steven Luscher <react@steveluscher.com> <steveluscher@users.noreply.github.com>
Stoyan Stefanov <ssttoo@ymail.com>
Thomas Aylott <oblivious@subtlegradient.com> <aylott@fb.com>
Timothy Yung <yungsters@gmail.com> <yungsters@fb.com>
Vjeux <vjeuxx@gmail.com>
Vjeux <vjeuxx@gmail.com> <vjeux@fb.com>
Volkan Unsal <spocksplanet@gmail.com>
YouBao Nong <noyobo@gmail.com> <nongyoubao@alibaba-inc.com>
Zach Bruggeman <mail@bruggie.com> <zbruggeman@me.com>
张敏 <cookfront@gmail.com>

View File

@@ -2,6 +2,7 @@
language: node_js
node_js:
- '0.10'
sudo: false
cache:
directories:
- node_modules
@@ -40,6 +41,7 @@ after_script:
env:
matrix:
- TEST_TYPE=test
- TEST_TYPE=jest
- TEST_TYPE=lint
- TEST_TYPE=test:webdriver:saucelabs:modern
global:
@@ -50,7 +52,6 @@ env:
matrix:
fast_finish: true
allow_failures:
- env: TEST_TYPE=lint
- env: TEST_TYPE=test:coverage
- env: TEST_TYPE=perf:full
- env: TEST_TYPE=test:webdriver:saucelabs:modern

104
AUTHORS
View File

@@ -1,39 +1,63 @@
Aaron Franks <aaron.franks@gmail.com>
Adam Krebs <amk528@cs.nyu.edu>
Adam Mark <adammark75@gmail.com>
Adam Solove <asolove@gmail.com>
Alan deLevie <adelevie@gmail.com>
Alex Boyd <alex@opengroove.org>
Alex Mykyta <dancingwithcows@gmail.com>
Alex Zelenskiy <azelenskiy@fb.com>
Alexander Solovyov <alexander@solovyov.net>
Alexander Tseung <alextsg@gmail.com>
Alexandre Gaudencio <shahor@shahor.fr>
Alexey Raspopov <avenger7x13@gmail.com>
Alexey Shamrin <shamrin@gmail.com>
Andre Z Sanchez <andrezacsanchez@gmail.com>
Andreas Svensson <andreas@syranide.com>
Andres Suarez <zertosh@gmail.com>
Andrew Cobby <cobbweb@users.noreply.github.com>
Andrew Davey <andrew@equin.co.uk>
Andrew Rasmussen <andras@fb.com>
Andrew Zich <azich@fb.com>
Andrey Popp <8mayday@gmail.com>
Anthony van der Hoorn <anthony.vanderhoorn@gmail.com>
Antti Ahti <antti.ahti@gmail.com>
Areeb Malik <areeb.malik91@gmail.com>
Aria Buckles <aria@khanacademy.org>
Artem Nezvigin <artem@artnez.com>
Ayman Osman <aymano.osman@gmail.com>
Bartosz Kaszubowski <gosimek@gmail.com>
Beau Smith <beau@beausmith.com>
Ben Alpert <ben@benalpert.com>
Ben Foxall <benfoxall@gmail.com>
Ben Newman <bn@cs.stanford.edu>
Ben Ripkens <bripkens.dev@gmail.com>
Benjamin Keen <ben.keen@gmail.com>
Benjamin Leiken <benleiken@gmail.com>
Bill Fisher <fisherwebdev@gmail.com>
Blaine Hatab <jbhatab@gmail.com>
Bob Eagan <bob@synapsestudios.com>
Bob Ralian <bob.ralian@gmail.com>
Bojan Mihelac <bmihelac@mihelac.org>
Brandon Bloom <brandon@brandonbloom.name>
Brandon Tilley <brandon@brandontilley.com>
Brian Cooke <bri@bricooke.com>
Brian Holt <btholt@gmail.com>
Brian Hsu <brianhsu@Brians-MacBook-Pro.local>
Brian Kim <briankimpossible@gmail.com>
Brian Kung <brian@callmekung.com>
Brian Reavis <brian@thirdroute.com>
Brian Rue <brian@rollbar.com>
Bruno Škvorc <bruno@skvorc.me>
Cam Song <neosoyn@gmail.com>
Cam Spiers <camspiers@gmail.com>
Cassus Adam Banko <banko.adam@gmail.com>
Cat Chen <catchen@fb.com>
Cedric Sohrauer <cedric.sohrauer@infopark.de>
Charles Marsh <charlie@khanacademy.org>
Cheng Lou <chenglou92@gmail.com>
Chitharanjan Das <das.chitharanjan@gmail.com>
Chris Sciolla <csciolla1@gmail.com>
Christian <christianoliff@yahoo.com>
Christian Alfoni <christianalfoni@gmail.com>
Christian Roman <chroman16@gmail.com>
Christoph Pojer <christoph.pojer@gmail.com>
@@ -42,19 +66,26 @@ Clay Allsopp <clay.allsopp@gmail.com>
Connor McSheffrey <c@conr.me>
Cotton Hou <himcotton@gmail.com>
Dan Abramov <dan.abramov@gmail.com>
Dan Fox <iamdanfox@gmail.com>
Dan Schafer <dschafer@fb.com>
Daniel Carlsson <daniel.carlsson.1987@gmail.com>
Daniel Gasienica <daniel@gasienica.ch>
Daniel Lo Nigro <daniel@dan.cx>
Daniel Mané <danmane@gmail.com>
Daniel Miladinov <dmiladinov@wingspan.com>
Daniel Schonfeld <daniel@schonfeld.org>
Danny Ben-David <dannybd@fb.com>
Daryl Lau <daryl@weak.io>
David Hellsing <david@aino.se>
David Hu <davidhu91@gmail.com>
Denis Sokolov <denis@sokolov.cc>
Dennis Johnson <djohnson@rallydev.com>
Devon Blandin <dblandin@gmail.com>
Dmitrii Abramov <dmitrii@rheia.us>
Dmitry Mazuro <dmitry.mazuro@icloud.com>
Dustan Kasten <dustan.kasten@gmail.com>
Dustin Getz <dgetz@wingspan.com>
Dylan Harrington <dylanharrington@gmail.com>
Enguerran <engcolson@gmail.com>
Eric Clemmons <eric@smarterspam.com>
Eric Florenzano <floguy@gmail.com>
@@ -68,6 +99,8 @@ Fernando Correia <fernando@servicero.com>
François-Xavier Bois <fxbois@gmail.com>
Fred Zhao <fredz@fb.com>
G Scott Olson <gscottolson@gmail.com>
G. Kay Lee <balancetraveller+github@gmail.com>
Gabe Levi <gabelevi@gmail.com>
Garren Smith <garren.smith@gmail.com>
Geert Pasteels <geert.pasteels@gmail.com>
Geert-Jan Brits <gbrits@gmail.com>
@@ -79,14 +112,20 @@ Greg Roodt <groodt@gmail.com>
Guangqiang Dong <gqdong@fb.com>
Guido Bouman <m@guido.vc>
Harry Hull <harry.hull1@gmail.com>
Harry Marr <harry.marr@gmail.com>
Harry Moreno <morenoh149@gmail.com>
Harshad Sabne <harshadsabne@users.noreply.github.com>
Hendrik Swanepoel <hendrik.swanepoel@gmail.com>
Henry Zhu <hi@henryzoo.com>
Hou Chia <kchia87@gmail.com>
Hugo Jobling <me@thisishugo.com>
Ian Obermiller <iano@fb.com>
Héliton Nordt <hnordt@hnordt.com>
Ian Obermiller <ian@obermillers.com>
Ingvar Stepanyan <me@rreverser.com>
Irae Carvalho <irae@irae.pro.br>
Isaac Salier-Hellendag <isaac@fb.com>
Ivan Kozik <ivan@ludios.org>
Ivan Krechetov <ikr@ikr.su>
Ivan Vergiliev <ivan.vergiliev@gmail.com>
Jacob Gable <jacob.gable@gmail.com>
Jacob Greenleaf <jake@imgur.com>
@@ -101,24 +140,30 @@ Jan Hancic <jan.hancic@gmail.com>
Jan Kassens <jan@kassens.net>
Jared Forsyth <jared@jaredforsyth.com>
Jason Bonta <jbonta@gmail.com>
Jason Ly <jason.ly@gmail.com>
Jason Trill <jason@jasontrill.com>
Jean Lauliac <lauliacj@gmail.com>
Jed Watson <jed.watson@me.com>
Jeff Barczewski <jeff.barczewski@gmail.com>
Jeff Carpenter <gcarpenterv@gmail.com>
Jeff Chan <jefftchan@gmail.com>
Jeff Kolesky <github@kolesky.com>
Jeff Morrison <jeff@anafx.com>
Jeff Welch <whatthejeff@gmail.com>
Jeffrey Lin <lin.jeffrey@gmail.com>
Jesse Skinner <jesse@thefutureoftheweb.com>
Jignesh Kakadiya <jigneshhk1992@gmail.com>
Jim OBrien <jimobrien930@gmail.com>
Jim Sproch <jsproch@fb.com>
Jimmy Jea <jimjea@gmail.com>
Jing Chen <jingc@fb.com>
Joel Auterson <joel.auterson@googlemail.com>
Johannes Baiter <johannes.baiter@gmail.com>
Johannes Emerich <johannes@emerich.de>
John Heroy <johnheroy@users.noreply.github.com>
John Watson <jwatson@fb.com>
Jon Beebe <jon.beebe@daveramsey.com>
Jon Madison <jon@tfftech.com>
Jonas Enlund <jonas.enlund@gmail.com>
Jonas Gebhardt <jonas@instagram.com>
Jonathan Hsu <jhiswin@gmail.com>
@@ -126,20 +171,29 @@ Jordan Walke <jordojw@gmail.com>
Josh Bassett <josh.bassett@gmail.com>
Josh Duck <josh@fb.com>
Josh Yudaken <yud@instagram.com>
Joshua Goldberg <jsgoldberg90@gmail.com>
Joshua Ma <me@joshma.com>
João Valente <filipevalente@gmail.com>
Juan Serrano <germ13@users.noreply.github.com>
Julen Ruiz Aizpuru <julenx@gmail.com>
Julien Bordellier <git@julienbordellier.com>
Jun Wu <quark@lihdd.net>
Juraj Dudak <jdudak@fb.com>
Justin Jaffray <justinjaffray@khanacademy.org>
Justin Woo <moomoowoo@gmail.com>
Karl Mikkelsen <karl@kingkarl.com>
Karpich Dmitry <karpich@gollard.ru>
Keito Uchiyama <projects@keito.me>
Kevin Old <kevin@kevinold.com>
Kirk Steven Hansen <hanski07@kirk-hansens-macbook.local>
Kit Randel <kit@nocturne.net.nz>
Kunal Mehta <k.mehta@berkeley.edu>
Kurt Ruppel <me@kurtruppel.com>
Kyle Mathews <mathews.kyle@gmail.com>
Laurence Rowe <l@lrowe.co.uk>
Lee Byron <lee@leebyron.com>
Lei <tendant@gmail.com>
Leon Fedotov <LeonFedotov@users.noreply.github.com>
Levi McCallum <levi@levimccallum.com>
Lily <qvang.j@gmail.com>
Logan Allen <loganfynne@gmail.com>
@@ -148,21 +202,31 @@ Marcin Kwiatkowski <marcin.kwiatkowski@hotmail.com>
Marcin Szczepanski <marcins@gmail.com>
Mariano Desanze <protronm@gmail.com>
Mark Anderson <undernewmanagement@users.noreply.github.com>
Mark Funk <mark@boomtownroi.com>
Mark Hintz <markohintz@gmail.com>
Mark IJbema <markijbema@gmail.com>
Mark Richardson <echo@fb.com>
Marlon Landaverde <milanlandaverde@gmail.com>
Marshall Roch <mroch@fb.com>
Martin Andert <mandert@gmail.com>
Martin Jul <martin@mjul.com>
Martin Konicek <mkonicek@fb.com>
Mathieu M-Gosselin <mathieumg@gmail.com>
Matias Singers <mail@matiassingers.com>
Matt Harrison <mt.harrison86@gmail.com>
Matt Huggins <matt.huggins@gmail.com>
Matt Zabriskie <mzabriskie@gmail.com>
Matthew Dapena-Tretter <m@tthewwithanm.com>
Matthew Johnston <matthewjohnston4@users.noreply.github.com>
Matti Nelimarkka <matti.nelimarkka@hiit.fi>
Max F. Albrecht <1@178.is>
Michael Chan <mijoch@gmail.com>
Michael Randers-Pehrson <michael.rp@gmail.com>
Michal Srb <xixixao@seznam.cz>
Michelle Todd <himichelletodd@gmail.com>
Mihai Parparita <mihai.parparita@gmail.com>
Mike D Pilsbury <mike.pilsbury@gmail.com>
Minwe LUO <minwe@yunshipei.com>
Miorel Palii <miorel@fb.com>
Mouad Debbar <mdebbar@fb.com>
Nadeesha Cabral <nadeesha.cabral@gmail.com>
@@ -173,45 +237,70 @@ Nicholas Bergson-Shilcock <me@nicholasbs.net>
Nick Fitzgerald <fitzgen@gmail.com>
Nick Gavalas <njg57@cornell.edu>
Nick Merwin <nick@lemurheavy.com>
Nick Raienko <enaqxx@gmail.com>
Nick Thompson <ncthom91@gmail.com>
Nick Williams <WickyNilliams@users.noreply.github.com>
Niklas Boström <nbostrom@gmail.com>
Oiva Eskola <oiva.eskola@gmail.com>
Oleg <o.yanchinskiy@gmail.com>
Oleksii Markhovskyi <olexiy.markhovsky@gmail.com>
Oliver Zeigermann <oliver.zeigermann@gmail.com>
Owen Coutts <owenc@fb.com>
Pablo Lacerda de Miranda <pablolm@yahoo-inc.com>
Pascal Hartig <passy@twitter.com>
Patrick Laughlin <patrick@laughl.info>
Paul OShannessy <paul@oshannessy.com>
Paul Seiffert <paul.seiffert@gmail.com>
Paul Shen <paul@mnml0.com>
Pedro Nauck <pedronauck@gmail.com>
Pete Hunt <floydophone@gmail.com>
Peter Blazejewicz <peter.blazejewicz@gmail.com>
Peter Cottle <pcottle@fb.com>
Peter Jaros <peter.a.jaros@gmail.com>
Petri Lehtinen <petri@digip.org>
Petri Lievonen <plievone@cc.hut.fi>
Pieter Vanderwerff <me@pieter.io>
Pouja Nikray <poujanik@gmail.com>
Preston Parry <ClimbsRocks@users.noreply.github.com>
Rafael <rafael.garcia@clever.com>
Rafal Dittwald <rafal.dittwald@gmail.com>
Rajiv Tirumalareddy <rajivtreddy@gmail.com>
Randall Randall <randall@randallsquared.com>
Ray <ray@tomo.im>
Raymond Ha <raymond@shraymonks.com>
Richard D. Worth <rdworth@gmail.com>
Richard Feldman <richard.t.feldman@gmail.com>
Richard Kho <hello@richardkho.com>
Richard Littauer <richard.littauer@gmail.com>
Richard Livesey <Livesey7@hotmail.co.uk>
Rick Beerendonk <rick@beerendonk.com>
Riley Tomasek <riley.tomasek@gmail.com>
Rob Arnold <robarnold@cs.cmu.edu>
Robert Sedovsek <robert.sedovsek@gmail.com>
Roman Vanesyan <roman.vanesyan@gmail.com>
Ryan Seddon <seddon.ryan@gmail.com>
Sahat Yalkabov <sakhat@gmail.com>
Sam Saccone <samccone@gmail.com>
Sam Selikoff <sam.selikoff@gmail.com>
Sander Spies <sandermail@gmail.com>
Scott Feeney <scott@oceanbase.org>
Sean Kinsey <oyvind@fb.com>
Sebastian Markbåge <sebastian@calyptus.eu>
Sergey Generalov <sergey@genbit.ru>
Sergey Rubanov <chi187@gmail.com>
Shane O'Sullivan <shaneosullivan1@gmail.com>
Shaun Trennery <shaun.trennery@gmail.com>
Sheraz <undernewmanagement@users.noreply.github.com>
ShihChi Huang <hhuang@netflix.com>
Shripad K <assortmentofsorts@gmail.com>
Simon Højberg <r.hackr@gmail.com>
Simon Welsh <simon@simon.geek.nz>
Sophia Westwood <sophia@quip.com>
Spencer Handley <spencerhandley@gmail.com>
Stefan Dombrowski <sdo451@gmail.com>
Stephen Murphy <smurphy3@apple.com>
Steve Baker <_steve_@outlook.com>
Steven Luscher <react@steveluscher.com>
Stoyan Stefanov <ssttoo@ymail.com>
Sundeep Malladi <sundeep.malladi@gmail.com>
Sunny Juneja <me@sunnyjuneja.com>
@@ -222,22 +311,33 @@ Thomas Boyt <thomas.boyt@venmo.com>
Thomas Shaddox <thomas@heyzap.com>
Thomas Shafer <thomasjshafer@gmail.com>
ThomasCrvsr <crevoisier.thomas@gmail.com>
Tienchai Wirojsaksaree <tienchai@fb.com>
Tim Schaub <tschaub@users.noreply.github.com>
Timothy Yung <yungsters@gmail.com>
Tom Haggie <thaggie@gmail.com>
Tom Hauburger <thauburger@gmail.com>
Tom MacWright <tom@macwright.org>
Tom Occhino <tomocchino@gmail.com>
Toru Kobayashi <koba0004@gmail.com>
Ville Immonen <ville.immonen@iki.fi>
Vincent Riemer <vincentriemer@gmail.com>
Vincent Siao <vincent@asana.com>
Vjeux <vjeuxx@gmail.com>
Volkan Unsal <spocksplanet@gmail.com>
Wayne Larsen <wayne@larsen.st>
WickyNilliams <WickyNilliams@MBA>
Wincent Colaiuta <win@wincent.com>
Wout Mertens <Wout.Mertens@gmail.com>
XuefengWu <benewu@gmail.com>
YouBao Nong <noyobo@gmail.com>
Yuriy Dybskiy <yuriy@dybskiy.com>
Yuval Dekel <thedekel@fb.com>
Zach Bruggeman <mail@bruggie.com>
Zacharias <zachasme@users.noreply.github.com>
brafdlog <brafdlog@gmail.com>
chen <kikyous@163.com>
cutbko <kutsenko.eugene@hotmail.com>
davidxi <davidgraycn@gmail.com>
imagentleman <imagentlemail@gmail.com>
jon madison <jon@tfftech.com>
Árni Hermann Reynisson <arnihr@gmail.com>
张敏 <cookfront@gmail.com>

View File

@@ -1,3 +1,108 @@
## 0.13.1 (March 16, 2015)
### 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`
## 0.13.0 (March 10, 2015)
### React Core
#### Breaking Changes
* Deprecated patterns that warned in 0.12 no longer work: most prominently, calling component classes without using JSX or React.createElement and using non-component functions with JSX or createElement
* Mutating `props` after an element is created is deprecated and will cause warnings in development mode; future versions of React will incorporate performance optimizations assuming that props aren't mutated
* Static methods (defined in `statics`) are no longer autobound to the component class
* `ref` resolution order has changed slightly such that a ref to a component is available immediately after its `componentDidMount` method is called; this change should be observable only if your component calls a parent component's callback within your `componentDidMount`, which is an anti-pattern and should be avoided regardless
* Calls to `setState` in life-cycle methods are now always batched and therefore asynchronous. Previously the first call on the first mount was synchronous.
* `setState` and `forceUpdate` on an unmounted component now warns instead of throwing. That avoids a possible race condition with Promises.
* Access to most internal properties has been completely removed, including `this._pendingState` and `this._rootNodeID`.
#### New Features
* Support for using ES6 classes to build React components; see the [v0.13.0 beta 1 notes](http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html) for details.
* Added new top-level API `React.findDOMNode(component)`, which should be used in place of `component.getDOMNode()`. The base class for ES6-based components will not have `getDOMNode`. This change will enable some more patterns moving forward.
* Added a new top-level API `React.cloneElement(el, props)` for making copies of React elements see the [v0.13 RC2 notes](/react/blog/2015/03/03/react-v0.13-rc2.html#react.cloneelement) for more details.
* New `ref` style, allowing a callback to be used in place of a name: `<Photo ref={(c) => this._photo = c} />` allows you to reference the component with `this._photo` (as opposed to `ref="photo"` which gives `this.refs.photo`).
* `this.setState()` can now take a function as the first argument for transactional state updates, such as `this.setState((state, props) => ({count: state.count + 1}));` this means that you no longer need to use `this._pendingState`, which is now gone.
* Support for iterators and immutable-js sequences as children.
#### Deprecations
* `ComponentClass.type` is deprecated. Just use `ComponentClass` (usually as `element.type === ComponentClass`).
* Some methods that are available on `createClass`-based components are removed or deprecated from ES6 classes (`getDOMNode`, `replaceState`, `isMounted`, `setProps`, `replaceProps`).
### React with Add-Ons
#### New Features
* [`React.addons.createFragment` was added](/react/docs/create-fragment.html) for adding keys to entire sets of children.
#### Deprecations
* `React.addons.classSet` is now deprecated. This functionality can be replaced with several freely available modules. [classnames](https://www.npmjs.com/package/classnames) is one such module.
* Calls to `React.addons.cloneWithProps` can be migrated to use `React.cloneElement` instead make sure to merge `style` and `className` manually if desired.
### React Tools
#### Breaking Changes
* When transforming ES6 syntax, `class` methods are no longer enumerable by default, which requires `Object.defineProperty`; if you support browsers such as IE8, you can pass `--target es3` to mirror the old behavior
#### New Features
* `--target` option is available on the jsx command, allowing users to specify and ECMAScript version to target.
* `es5` is the default.
* `es3` restores the previous default behavior. An additional transform is added here to ensure the use of reserved words as properties is safe (eg `this.static` will become `this['static']` for IE8 compatibility).
* The transform for the call spread operator has also been enabled.
### JSX
#### Breaking Changes
* A change was made to how some JSX was parsed, specifically around the use of `>` or `}` when inside an element. Previously it would be treated as a string but now it will be treated as a parse error. The [`jsx_orphaned_brackets_transformer`](https://www.npmjs.com/package/jsx_orphaned_brackets_transformer) package on npm can be used to find and fix potential issues in your JSX code.
## 0.12.2 (December 18, 2014)
### 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`
## 0.12.1 (November 18, 2014)
### React Tools
* Types transform updated with latest support
* jstransform version updated with improved ES6 transforms
* Explicit Esprima dependency removed in favor of using Esprima information exported by jstransform
## 0.12.0 (October 28, 2014)
### React Core

View File

@@ -1,6 +1,6 @@
# Contributing to React
React is one of Facebook's first open source projects that is both under very active development and is also being used to ship code to everybody on facebook.com. We're still working out the kinks to make contributing to this project as easy and transparent as possible, but we're not quite there yet. Hopefully this document makes the process for contributing clear and preempts some questions you may have.
React is one of Facebook's first open source projects that is both under very active development and is also being used to ship code to everybody on [facebook.com](https://facebook.com). We're still working out the kinks to make contributing to this project as easy and transparent as possible, but we're not quite there yet. Hopefully this document makes the process for contributing clear and preempts some questions you may have.
## Our Development Process
@@ -27,7 +27,7 @@ The core team will be monitoring for pull requests. When we get one, we'll run s
In order to accept your pull request, we need you to submit a CLA. You only need to do this once, so if you've done this for another Facebook open source project, you're good to go. If you are submitting a pull request for the first time, just let us know that you have completed the CLA and we can cross-check with your GitHub username.
Complete your CLA here: <https://code.facebook.com/cla>
[Complete your CLA here](https://code.facebook.com/cla)
## Bugs
@@ -41,7 +41,7 @@ The best way to get your bug fixed is to provide a reduced test case. jsFiddle,
### Security Bugs
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. With that in mind, please do not file public issues and go through the process outlined on that page.
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. With that in mind, please do not file public issues; go through the process outlined on that page.
## How to Get in Touch
@@ -56,7 +56,7 @@ Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe
* Commas last,
* 2 spaces for indentation (no tabs)
* Prefer `'` over `"`
* `"use strict";`
* `'use strict';`
* 80 character line length
* "Attractive"
* Do not use the optional parameters of `setTimeout` and `setInterval`
@@ -67,4 +67,4 @@ Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe
## License
By contributing to React, you agree that your contributions will be licensed under its BSD license..
By contributing to React, you agree that your contributions will be licensed under its BSD license.

View File

@@ -1,6 +1,5 @@
'use strict';
var exec = require('child_process').exec;
var jsxTask = require('./grunt/tasks/jsx');
var browserifyTask = require('./grunt/tasks/browserify');
var populistTask = require('./grunt/tasks/populist');
@@ -13,6 +12,7 @@ var npmReactTasks = require('./grunt/tasks/npm-react');
var npmReactToolsTasks = require('./grunt/tasks/npm-react-tools');
var versionCheckTask = require('./grunt/tasks/version-check');
var gemReactSourceTasks = require('./grunt/tasks/gem-react-source');
var eslintTask = require('./grunt/tasks/eslint');
module.exports = function(grunt) {
@@ -23,25 +23,43 @@ module.exports = function(grunt) {
browserify: require('./grunt/config/browserify'),
populist: require('./grunt/config/populist')(grunt),
connect: require('./grunt/config/server')(grunt),
"webdriver-jasmine": require('./grunt/config/webdriver-jasmine'),
"webdriver-perf": require('./grunt/config/webdriver-perf'),
'webdriver-jasmine': require('./grunt/config/webdriver-jasmine'),
'webdriver-perf': require('./grunt/config/webdriver-perf'),
npm: require('./grunt/config/npm'),
clean: ['./build', './*.gem', './docs/_site', './examples/shared/*.js', '.module-cache'],
clean: [
'./build',
'./*.gem',
'./docs/_site',
'./examples/shared/*.js',
'.module-cache'
],
jshint: require('./grunt/config/jshint'),
/*eslint-disable camelcase */
compare_size: require('./grunt/config/compare_size')
/*eslint-enable camelcase */
});
grunt.config.set('compress', require('./grunt/config/compress'));
Object.keys(grunt.file.readJSON('package.json').devDependencies)
.filter(function(npmTaskName) { return npmTaskName.indexOf('grunt-') === 0; })
.filter(function(npmTaskName) { return npmTaskName != 'grunt-cli'; })
.forEach(function(npmTaskName) { grunt.loadNpmTasks(npmTaskName); });
.filter(function(npmTaskName) {
return npmTaskName.indexOf('grunt-') === 0;
})
.filter(function(npmTaskName) {
return npmTaskName !== 'grunt-cli';
})
.forEach(function(npmTaskName) {
grunt.loadNpmTasks(npmTaskName);
});
// Alias 'jshint' to 'lint' to better match the workflow we know
grunt.registerTask('lint', ['jshint']);
grunt.registerTask('eslint', eslintTask);
grunt.registerTask('download-previous-version', require('./grunt/tasks/download-previous-version.js'));
grunt.registerTask('lint', ['eslint']);
grunt.registerTask(
'download-previous-version',
require('./grunt/tasks/download-previous-version.js')
);
grunt.registerTask('delete-build-modules', function() {
if (grunt.file.exists('build/modules')) {
@@ -74,11 +92,28 @@ module.exports = function(grunt) {
grunt.registerTask('version-check', versionCheckTask);
grunt.registerTask('build:basic', ['jsx:normal', 'version-check', 'browserify:basic']);
grunt.registerTask('build:addons', ['jsx:normal', 'browserify:addons']);
grunt.registerTask('build:transformer', ['jsx:normal', 'browserify:transformer']);
grunt.registerTask('build:min', ['jsx:normal', 'version-check', 'browserify:min']);
grunt.registerTask('build:addons-min', ['jsx:normal', 'browserify:addonsMin']);
grunt.registerTask('build:basic', [
'jsx:normal',
'version-check',
'browserify:basic'
]);
grunt.registerTask('build:addons', [
'jsx:normal',
'browserify:addons'
]);
grunt.registerTask('build:transformer', [
'jsx:normal',
'browserify:transformer'
]);
grunt.registerTask('build:min', [
'jsx:normal',
'version-check',
'browserify:min'
]);
grunt.registerTask('build:addons-min', [
'jsx:normal',
'browserify:addonsMin'
]);
grunt.registerTask('build:withCodeCoverageLogging', [
'jsx:normal',
'version-check',
@@ -98,8 +133,15 @@ module.exports = function(grunt) {
'version-check',
'populist:test'
]);
grunt.registerTask('build:npm-react', ['version-check', 'jsx:normal', 'npm-react:release']);
grunt.registerTask('build:gem-react-source', ['build', 'gem-react-source:release'])
grunt.registerTask('build:npm-react', [
'version-check',
'jsx:normal',
'npm-react:release'
]);
grunt.registerTask('build:gem-react-source', [
'build',
'gem-react-source:release'
]);
grunt.registerTask('webdriver-phantomjs', webdriverPhantomJSTask);
@@ -142,7 +184,7 @@ module.exports = function(grunt) {
'webdriver-perf:saucelabs_firefox',
'webdriver-perf:saucelabs_chrome',
'webdriver-perf:saucelabs_ie11',
'webdriver-perf:saucelabs_ie8',
'webdriver-perf:saucelabs_ie8'
]);
grunt.registerTask('test:webdriver:saucelabs', [

View File

@@ -2,7 +2,7 @@ BSD License
For React software
Copyright (c) 2013-2014, Facebook, Inc.
Copyright (c) 2013-2015, Facebook, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,

View File

@@ -1,4 +1,4 @@
# [React](http://facebook.github.io/react) [![Build Status](https://travis-ci.org/facebook/react.svg?branch=0.12-stable)](https://travis-ci.org/facebook/react)
# [React](http://facebook.github.io/react) [![Build Status](https://travis-ci.org/facebook/react.svg?branch=0.13-stable)](https://travis-ci.org/facebook/react)
React is a JavaScript library for building user interfaces.
@@ -35,12 +35,12 @@ The fastest way to get started is to serve JavaScript from the CDN (also availab
```html
<!-- The core React library -->
<script src="http://fb.me/react-0.12.0.js"></script>
<script src="http://fb.me/react-0.13.1.js"></script>
<!-- In-browser JSX transformer, remove when pre-compiling JSX. -->
<script src="http://fb.me/JSXTransformer-0.12.0.js"></script>
<script src="http://fb.me/JSXTransformer-0.13.1.js"></script>
```
We've also built a [starter kit](http://facebook.github.io/react/downloads/react-0.12.0.zip) which might be useful if this is your first time using React. It includes a webpage with an example of using React with live code.
We've also built a [starter kit](http://facebook.github.io/react/downloads/react-0.13.1.zip) which might be useful if this is your first time using React. It includes a webpage with an example of using React with live code.
If you'd like to use [bower](http://bower.io), it's as easy as:
@@ -86,7 +86,7 @@ grunt test
grunt test --debug
# For speed, you can use fasttest and add --filter to only run one test
grunt fasttest --filter=ReactIdentity
# Lint the code with JSHint
# Lint the code with ESLint
grunt lint
# Wipe out build directory
grunt clean

27
bin/jsx
View File

@@ -1,6 +1,6 @@
#!/usr/bin/env node
// -*- mode: js -*-
"use strict";
'use strict';
var transform = require('../main').transform;
@@ -11,18 +11,41 @@ require('commoner').version(
}).option(
'--harmony',
'Turns on JS transformations such as ES6 Classes etc.'
).option(
'--target [version]',
'Specify your target version of ECMAScript. Valid values are "es3" and ' +
'"es5". The default is "es5". "es3" will avoid uses of defineProperty and ' +
'will quote reserved words. WARNING: "es5" is not properly supported, even ' +
'with the use of es5shim, es5sham. If you need to support IE8, use "es3".',
'es5'
).option(
'--strip-types',
'Strips out type annotations.'
).option(
'--es6module',
'Parses the file as a valid ES6 module. ' +
'(Note that this means implicit strict mode)'
).option(
'--non-strict-es6module',
'Parses the file as an ES6 module, except disables implicit strict-mode. ' +
'(This is useful if you\'re porting non-ES6 modules to ES6, but haven\'t ' +
'yet verified that they are strict-mode safe yet)'
).option(
'--source-map-inline',
'Embed inline sourcemap in transformed source'
).process(function(id, source) {
// This is where JSX, ES6, etc. desugaring happens.
// We don't do any pre-processing of options so that the command line and the
// JS API both expose the same set of options. We do extract the options that
// we care about from commoner though so we aren't passing too many things
// along.
var options = {
harmony: this.options.harmony,
sourceMap: this.options.sourceMapInline,
stripTypes: this.options.stripTypes
stripTypes: this.options.stripTypes,
es6module: this.options.es6module,
nonStrictEs6module: this.options.nonStrictEs6module,
target: this.options.target
};
return transform(source, options);
});

View File

@@ -2,8 +2,7 @@
// -*- mode: js -*-
"use strict";
var getAllVisitors = require('../vendor/fbtransform/visitors').getAllVisitors;
var transform = require('jstransform').transform;
var transform = require('../main').transform;
var propagate = require("../vendor/constants").propagate;
require("commoner").version(
@@ -31,7 +30,7 @@ require("commoner").version(
var constants = context.config.constants || {};
// This is where JSX, ES6, etc. desugaring happens.
source = transform(getAllVisitors(), source).code;
source = transform(source, {harmony: true, stripTypes: true});
// Constant propagation means removing any obviously dead code after
// replacing constant expressions with literal (boolean) values.

View File

@@ -61,7 +61,7 @@ GEM
rb-inotify (0.9.5)
ffi (>= 0.5.0)
redcarpet (3.1.2)
safe_yaml (1.0.3)
safe_yaml (1.0.4)
sanitize (2.0.6)
nokogiri (>= 1.4.4)
sass (3.3.14)

View File

@@ -52,7 +52,7 @@ $ bundle exec rake watch # Automatically compiles as needed.
### Updating `facebook.github.io/react`
The easiest way to do this is to have a separate clone of this repository, checked out to the `gh-pages` branch. We have a build step that expects this to be in a directory named `react-gh-pages` at the same depth as `react`. Then it's just a matter of running `grunt docs`, which will compile the site and copy it out to this repository. From there you can check it in.
The easiest way to do this is to have a separate clone of this repository, checked out to the `gh-pages` branch. We have a build step that expects this to be in a directory named `react-gh-pages` at the same depth as `react`. Then it's just a matter of running `grunt docs`, which will compile the site and copy it out to this repository. From there, you can check it in.
**Note:** This should only be done for new releases. You should create a tag corresponding to the release tag in the main repository.

View File

@@ -34,4 +34,4 @@ sass:
sass_dir: _css
gems:
- jekyll-redirect-from
react_version: 0.11.2
react_version: 0.13.1

View File

@@ -1,40 +1,64 @@
---
- - Adam Krebs
- - Aaron Franks
- Adam Krebs
- Adam Mark
- Adam Solove
- Alan deLevie
- Alex Boyd
- Alex Mykyta
- Alex Zelenskiy
- Alexander Solovyov
- Alexander Tseung
- Alexandre Gaudencio
- Alexey Raspopov
- Alexey Shamrin
- Andre Z Sanchez
- Andreas Svensson
- Andres Suarez
- Andrew Cobby
- Andrew Davey
- Andrew Rasmussen
- Andrew Zich
- Andrey Popp
- Anthony van der Hoorn
- Antti Ahti
- Areeb Malik
- Aria Buckles
- Artem Nezvigin
- Ayman Osman
- Bartosz Kaszubowski
- Beau Smith
- Ben Alpert
- Ben Foxall
- Ben Newman
- Ben Ripkens
- Benjamin Keen
- Benjamin Leiken
- Bill Fisher
- Blaine Hatab
- Bob Eagan
- Bob Ralian
- Bojan Mihelac
- Brandon Bloom
- Brandon Tilley
- Brian Cooke
- Brian Holt
- Brian Hsu
- Brian Kim
- Brian Kung
- Brian Reavis
- Brian Rue
- Bruno Škvorc
- Cam Song
- Cam Spiers
- Cassus Adam Banko
- Cat Chen
- Cedric Sohrauer
- Charles Marsh
- Cheng Lou
- Chitharanjan Das
- Chris Sciolla
- Christian
- Christian Alfoni
- Christian Roman
- Christoph Pojer
@@ -43,19 +67,26 @@
- Connor McSheffrey
- Cotton Hou
- Dan Abramov
- Dan Fox
- Dan Schafer
- Daniel Carlsson
- Daniel Gasienica
- Daniel Lo Nigro
- Daniel Mané
- Daniel Miladinov
- Daniel Schonfeld
- Danny Ben-David
- Daryl Lau
- David Hellsing
- David Hu
- Denis Sokolov
- Dennis Johnson
- Devon Blandin
- Dmitrii Abramov
- Dmitry Mazuro
- Dustan Kasten
- Dustin Getz
- Dylan Harrington
- Enguerran
- Eric Clemmons
- Eric Florenzano
@@ -69,6 +100,8 @@
- François-Xavier Bois
- Fred Zhao
- G Scott Olson
- G. Kay Lee
- Gabe Levi
- Garren Smith
- Geert Pasteels
- Geert-Jan Brits
@@ -80,14 +113,20 @@
- Guangqiang Dong
- Guido Bouman
- Harry Hull
- - Harshad Sabne
- Harry Marr
- - Harry Moreno
- Harshad Sabne
- Hendrik Swanepoel
- Henry Zhu
- Hou Chia
- Hugo Jobling
- Héliton Nordt
- Ian Obermiller
- Ingvar Stepanyan
- Irae Carvalho
- Isaac Salier-Hellendag
- Ivan Kozik
- Ivan Krechetov
- Ivan Vergiliev
- Jacob Gable
- Jacob Greenleaf
@@ -102,24 +141,30 @@
- Jan Kassens
- Jared Forsyth
- Jason Bonta
- Jason Ly
- Jason Trill
- Jean Lauliac
- Jed Watson
- Jeff Barczewski
- Jeff Carpenter
- Jeff Chan
- Jeff Kolesky
- Jeff Morrison
- Jeff Welch
- Jeffrey Lin
- Jesse Skinner
- Jignesh Kakadiya
- Jim OBrien
- Jim Sproch
- Jimmy Jea
- Jing Chen
- Joel Auterson
- Johannes Baiter
- Johannes Emerich
- John Heroy
- John Watson
- Jon Beebe
- Jon Madison
- Jonas Enlund
- Jonas Gebhardt
- Jonathan Hsu
@@ -127,20 +172,29 @@
- Josh Bassett
- Josh Duck
- Josh Yudaken
- Joshua Goldberg
- Joshua Ma
- João Valente
- Juan Serrano
- Julen Ruiz Aizpuru
- Julien Bordellier
- Jun Wu
- Juraj Dudak
- Justin Jaffray
- Justin Woo
- Karl Mikkelsen
- Karpich Dmitry
- Keito Uchiyama
- Kevin Old
- Kirk Steven Hansen
- Kit Randel
- Kunal Mehta
- Kurt Ruppel
- Kyle Mathews
- Laurence Rowe
- Lee Byron
- Lei
- Leon Fedotov
- Levi McCallum
- Lily
- Logan Allen
@@ -149,23 +203,33 @@
- Marcin Szczepanski
- Mariano Desanze
- Mark Anderson
- Mark Funk
- Mark Hintz
- Mark IJbema
- Mark Richardson
- Marlon Landaverde
- Marshall Roch
- Martin Andert
- Martin Jul
- Martin Konicek
- Mathieu M-Gosselin
- Matias Singers
- Matt Harrison
- Matt Huggins
- Matt Zabriskie
- Matthew Dapena-Tretter
- Matthew Johnston
- Matti Nelimarkka
- Max F. Albrecht
- Michael Chan
- - Michael Randers-Pehrson
- Michael Randers-Pehrson
- Michal Srb
- Michelle Todd
- Mihai Parparita
- Mike D Pilsbury
- Minwe LUO
- Miorel Palii
- Mouad Debbar
- - Mouad Debbar
- Nadeesha Cabral
- Naman Goel
- Nate Hunzaker
@@ -174,45 +238,70 @@
- Nick Fitzgerald
- Nick Gavalas
- Nick Merwin
- Nick Raienko
- Nick Thompson
- Nick Williams
- Niklas Boström
- Oiva Eskola
- Oleg
- Oleksii Markhovskyi
- Oliver Zeigermann
- Owen Coutts
- Pablo Lacerda de Miranda
- Pascal Hartig
- Patrick Laughlin
- Paul OShannessy
- Paul Seiffert
- Paul Shen
- Pedro Nauck
- Pete Hunt
- Peter Blazejewicz
- Peter Cottle
- Peter Jaros
- Petri Lehtinen
- Petri Lievonen
- Pieter Vanderwerff
- Pouja Nikray
- Preston Parry
- Rafael
- Rafal Dittwald
- Rajiv Tirumalareddy
- Randall Randall
- Ray
- Raymond Ha
- Richard D. Worth
- Richard Feldman
- Richard Kho
- Richard Littauer
- Richard Livesey
- Rick Beerendonk
- Riley Tomasek
- Rob Arnold
- Robert Sedovsek
- Roman Vanesyan
- Ryan Seddon
- Sahat Yalkabov
- Sam Saccone
- Sam Selikoff
- Sander Spies
- Scott Feeney
- Sean Kinsey
- Sebastian Markbåge
- Sergey Generalov
- Sergey Rubanov
- Shane O'Sullivan
- Shaun Trennery
- Sheraz
- ShihChi Huang
- Shripad K
- Simon Højberg
- Simon Welsh
- Sophia Westwood
- Spencer Handley
- Stefan Dombrowski
- Stephen Murphy
- Steve Baker
- Steven Luscher
- Stoyan Stefanov
- Sundeep Malladi
- Sunny Juneja
@@ -223,22 +312,33 @@
- Thomas Shaddox
- Thomas Shafer
- ThomasCrvsr
- Tienchai Wirojsaksaree
- Tim Schaub
- Timothy Yung
- Tom Haggie
- Tom Hauburger
- Tom MacWright
- Tom Occhino
- Toru Kobayashi
- Ville Immonen
- Vincent Riemer
- Vincent Siao
- Vjeux
- Volkan Unsal
- Wayne Larsen
- WickyNilliams
- Wincent Colaiuta
- Wout Mertens
- XuefengWu
- YouBao Nong
- Yuriy Dybskiy
- Yuval Dekel
- Zach Bruggeman
- Zacharias
- brafdlog
- chen
- cutbko
- davidxi
- imagentleman
- jon madison
- "Árni Hermann Reynisson"
- "张敏"

View File

@@ -8,6 +8,8 @@
title: Thinking in React
- title: Community Resources
items:
- id: conferences
title: Conferences
- id: videos
title: Videos
- id: complementary-tools
@@ -57,12 +59,16 @@
title: Test Utilities
- id: clone-with-props
title: Cloning Components
- id: create-fragment
title: Keyed Fragments
- id: update
title: Immutability Helpers
- id: pure-render-mixin
title: PureRenderMixin
- id: perf
title: Performance Tools
- id: advanced-performance
title: Advanced Performance
- title: Reference
items:
- id: top-level-api

View File

@@ -34,3 +34,7 @@
title: References to Components
- id: children-undefined
title: this.props.children undefined
- id: use-react-with-other-libraries
title: Use React with Other Libraries
- id: dangerously-set-inner-html
title: Dangerously Set innerHTML

View File

@@ -0,0 +1,3 @@
rules:
block-scoped-var: false
no-undef: false

View File

@@ -1,5 +1,5 @@
/**
* Copyright 2013-2014, Facebook, Inc.
* Copyright 2013-2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the

View File

@@ -0,0 +1,11 @@
(function() {
var tag = document.querySelector(
'script[type="application/javascript;version=1.7"]'
);
if (!tag || tag.textContent.indexOf('window.onload=function(){') !== -1) {
alert('Bad JSFiddle configuration, please fork the original React JSFiddle');
}
tag.setAttribute('type', 'text/jsx;harmony=true');
tag.textContent = tag.textContent.replace(/^\/\/<!\[CDATA\[/, '');
})();

View File

@@ -27,6 +27,7 @@ var CompilerPlayground = React.createClass({
renderCode={true}
transformer={transformer.bind(null, this.state.harmony)}
showCompiledJSTab={false}
showLineNumbers={true}
/>
<label className="compiler-option">
<input
@@ -37,7 +38,7 @@ var CompilerPlayground = React.createClass({
</label>
</div>
);
},
}
});
React.render(
<CompilerPlayground />,

View File

@@ -9,12 +9,21 @@ var IS_MOBILE = (
);
var CodeMirrorEditor = React.createClass({
propTypes: {
lineNumbers: React.PropTypes.bool,
onChange: React.PropTypes.func
},
getDefaultProps: function() {
return {
lineNumbers: false
};
},
componentDidMount: function() {
if (IS_MOBILE) return;
this.editor = CodeMirror.fromTextArea(this.refs.editor.getDOMNode(), {
mode: 'javascript',
lineNumbers: false,
lineNumbers: this.props.lineNumbers,
lineWrapping: true,
smartIndent: false, // javascript mode does bad things with jsx indents
matchBrackets: true,
@@ -75,6 +84,7 @@ var ReactPlayground = React.createClass({
transformer: React.PropTypes.func,
renderCode: React.PropTypes.bool,
showCompiledJSTab: React.PropTypes.bool,
showLineNumbers: React.PropTypes.bool,
editorTabTitle: React.PropTypes.string
},
@@ -84,7 +94,8 @@ var ReactPlayground = React.createClass({
return JSXTransformer.transform(code).code;
},
editorTabTitle: 'Live JSX Editor',
showCompiledJSTab: true
showCompiledJSTab: true,
showLineNumbers: false
};
},
@@ -122,6 +133,7 @@ var ReactPlayground = React.createClass({
onChange={this.handleCodeChange}
codeText={compiledCode}
readOnly={true}
lineNumbers={this.props.showLineNumbers}
/>;
var JSXContent =
@@ -130,6 +142,7 @@ var ReactPlayground = React.createClass({
onChange={this.handleCodeChange}
className="playgroundStage"
codeText={this.state.code}
lineNumbers={this.props.showLineNumbers}
/>;
var JSXTabClassName =

View File

@@ -50,7 +50,7 @@
<li><a href="/react/support.html"{% if page.id == 'support' %} class="active"{% endif %}>support</a></li>
<li><a href="/react/downloads.html"{% if page.id == 'downloads' %} class="active"{% endif %}>download</a></li>
<li><a href="/react/blog/"{% if page.sectionid == 'blog' %} class="active"{% endif %}>blog</a></li>
<li><a href="http://github.com/facebook/react">github</a>
<li><a href="https://github.com/facebook/react">github</a>
</ul>
</div>
</div>
@@ -79,8 +79,8 @@
<a href="/react/acknowledgements.html">Acknowledgements</a>
</div>
<div class="right">
&copy; 2013&ndash;2014 Facebook Inc.<br>
Documentation licensed under <a href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
&copy; 2013&ndash;{{ site.time | date: '%Y' }} Facebook Inc.<br>
Documentation licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
</div>
</footer>
</div>

View File

@@ -8,13 +8,15 @@ layout: default
<div class="subHeader">{{ page.description }}</div>
{{ content }}
<div class="docs-prevnext">
{% if page.prev %}
<a class="docs-prev" href="/react/docs/{{ page.prev }}">&larr; Prev</a>
{% endif %}
{% if page.next %}
<a class="docs-next" href="/react/docs/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
{% if page.prev or page.next %}
<div class="docs-prevnext">
{% if page.prev %}
<a class="docs-prev" href="/react/docs/{{ page.prev }}">&larr; Prev</a>
{% endif %}
{% if page.next %}
<a class="docs-next" href="/react/docs/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
{% endif %}
</div>
</section>

View File

@@ -47,7 +47,7 @@ Over the past several weeks, members of our team, [Pete Hunt](http://www.petehun
[Pete Hunt](http://www.petehunt.net/) recorded himself implementing a simple `<Blink>` tag in React.
<figure><iframe src="http://player.vimeo.com/video/67248575" width="500" height="340" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></figure>
<figure><iframe src="https://player.vimeo.com/video/67248575" width="500" height="340" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></figure>
## Snake in React

View File

@@ -68,7 +68,7 @@ React.renderComponent(
[Domenic Denicola](http://domenicdenicola.com/) wrote a slide deck about the great applications of ES6 features and one slide shows how we could use Template Strings to compile JSX at run-time without the need for a pre-processing phase.
<figure><iframe src="http://www.slideshare.net/slideshow/embed_code/24187146?rel=0&startSlide=36" width="600" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe></figure>
<figure><iframe src="https://www.slideshare.net/slideshow/embed_code/24187146?rel=0&startSlide=36" width="600" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe></figure>
## React Presentation

View File

@@ -66,4 +66,4 @@ While this is not going to work for all the attributes since they are camelCased
[Vjeux](http://blog.vjeux.com/) re-implemented the display part of the IRC logger in React. Just 130 lines are needed for a performant infinite scroll with timestamps and color-coded author names.
<iframe width="100%" height="300" src="http://jsfiddle.net/vjeux/QL9tz/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/vjeux/QL9tz/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>

View File

@@ -29,7 +29,7 @@ We organized a React hackathon last week-end in the Facebook Seattle office. 50
The video will be available soon on the [JSConf EU website](http://2013.jsconf.eu/speakers/pete-hunt-react-rethinking-best-practices.html), but in the meantime, here are Pete's slides:
<figure><iframe src="http://www.slideshare.net/slideshow/embed_code/26589373" width="550" height="450" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen></iframe></figure>
<figure><iframe src="https://www.slideshare.net/slideshow/embed_code/26589373" width="550" height="450" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen></iframe></figure>
## Pump - Clojure bindings for React

View File

@@ -56,7 +56,7 @@ Now that we've identified the components in our mock, let's arrange them into a
## Step 2: Build a static version in React
<iframe width="100%" height="300" src="http://jsfiddle.net/6wQMG/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/6wQMG/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
Now that you have your component hierarchy it's time to start implementing your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's easiest to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why.
@@ -100,7 +100,7 @@ So finally, our state is:
## Step 4: Identify where your state should live
<iframe width="100%" height="300" src="http://jsfiddle.net/QvHnx/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/QvHnx/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
OK, so we've identified what the minimal set of app state is. Next we need to identify which component mutates, or *owns*, this state.
@@ -125,7 +125,7 @@ You can start seeing how your application will behave: set `filterText` to `"bal
## Step 5: Add inverse data flow
<iframe width="100%" height="300" src="http://jsfiddle.net/3Vs3Q/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/3Vs3Q/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
So far we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in `FilterableProductTable`.

View File

@@ -63,7 +63,7 @@ React declarative approach is well suited to write games. [Cheng Lou](https://gi
[Ross Allen](https://twitter.com/ssorallen) implemented [MontageJS](http://montagejs.org/)'s [Reddit tutorial](http://montagejs.org/docs/tutorial-reddit-client-with-montagejs.html) in React. This is a good opportunity to compare the philosophies of the two libraries.
<iframe width="100%" height="300" src="http://jsfiddle.net/ssorallen/fEsYt/embedded/result,html,js" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/ssorallen/fEsYt/embedded/result,html,js" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
[View the source on JSFiddle...](http://jsfiddle.net/ssorallen/fEsYt/)

View File

@@ -45,7 +45,7 @@ rails s
[Eldar Djafarov](http://eldar.djafarov.com/) implemented a mixin to link Backbone models to React state and a small abstraction to write two-way binding on-top.
<iframe width="100%" height="300" src="http://jsfiddle.net/djkojb/qZf48/13/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/djkojb/qZf48/13/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
[Check out the blog post...](http://eldar.djafarov.com/2013/11/reactjs-mixing-with-backbone/)
@@ -71,7 +71,7 @@ rails s
[Thomas Aylott](http://subtlegradient.com/) implemented an API that looks like Web Components but using React underneath.
<iframe width="100%" height="300" src="http://jsfiddle.net/SubtleGradient/ue2Aa/embedded/html,js,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/SubtleGradient/ue2Aa/embedded/html,js,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
## React vs Angular

View File

@@ -3,6 +3,8 @@ title: "Testing Flux Applications"
author: Bill Fisher
---
**A more up-to-date version of this post is available as part of the [Flux documentation](http://facebook.github.io/flux/docs/testing-flux-applications.html).**
[Flux](http://facebook.github.io/flux/) is the application architecture that Facebook uses to build web applications with [React](http://facebook.github.io/react/). It's based on a unidirectional data flow. In previous blog posts and documentation articles, we've shown the [basic structure and data flow](http://facebook.github.io/flux/docs/overview.html), more closely examined the [dispatcher and action creators](http://facebook.github.io/react/blog/2014/07/30/flux-actions-and-the-dispatcher.html), and shown how to put it all together with a [tutorial](http://facebook.github.io/flux/docs/todo-list.html). Now let's look at how to do formal unit testing of Flux applications with [Jest](http://facebook.github.io/jest/), Facebook's auto-mocking testing framework.

View File

@@ -61,7 +61,7 @@ Yahoo is converting Yahoo Mail to React and Flux and in the process, they open s
>
> - 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 to hard to fully foresee. This leads to elusive bugs. Stores should only execute synchronous code. Otherwise they are too hard to understand.
> - 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.
>

View File

@@ -0,0 +1,39 @@
---
title: React.js Conf Updates
author: Vjeux
---
Yesterday was the [React.js Conf](http://conf.reactjs.com/index.html) call for presenters submission deadline. We were
surprised to have received a total of **one hundred talk proposals** and were
amazed that 600 people requested to be notified when ticket go on sale. This is incredible!
When we organized the conference, we decided to start small since this is the
first React.js conference. Also, we weren't sure what level of demand to expect,
so we planned for a single-track, two-day conference on Facebook's campus. The
largest room available would accomodate 18 speaking slots and 200 attendees.
The spacial configuration makes it difficult to add a second track and changing
venues only two months in advance would be too difficult, so we are deciding to
stick with the originally planned format and venue on Facebook's campus.
Unfortunately, this means that we can only accept a small number of the awesome
conference talk proposals. In order to make sure attendees get a fair shot at
registering, we're going to to sell tickets in three separate first-come,
first-serve phases. **Tickets will cost $200 regardless of which phase they are
purchased from and all proceeds will go to charity**.
- Friday November 28th 2014 — Noon PST: First wave of tickets
- Friday December 5th 2014 — Noon PST: Second wave of tickets
- Friday December 12th 2014 — Noon PST: Third and last wave of tickets
We really do wish that everyone could attend React.js Conf, but in order to
ensure a quality experience for those who attend, we feel it will be best to
limit the size of the conference to what was originally planned for. This means
that not everyone who wants to attend will be able to, and many talks that
would be excellent contributions to the conference will have to be postponed
until the next conference. All the talks will be recorded and put online shortly after.
We hope to see many of you at React.js Conf this January.
Sincerely,
React Core Team

View File

@@ -0,0 +1,99 @@
---
title: "Community Round-up #24"
layout: post
author: Steven Luscher
---
## Keep it Simple
Pedro Nauck ([pedronauck](https://github.com/pedronauck)) delivered an impeccably illustrated deck at Brazil's _Front in Floripa_ conference. Watch him talk about how to keep delivering value as your app scales, by keeping your development process simple.
<script async class="speakerdeck-embed" data-id="44129b9054c901328b89221e99b278fe" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
Murilo Pereira ([mpereira](https://github.com/mpereira)) tussles with the topic of complexity in this blog post about [coping with scaling up](http://www.techsonian.net/2014/09/from-backbone-to-react-our-experience-scaling-a-web-application/), where he describes how his team used React to make possible the “nearly impossible.”
I ([steveluscher](https://github.com/steveluscher)) spoke at Manning Publications' “Powered By JavaScript” Strangeloop pre-conf in St. Louis. There, I proposed a new notation to talk about development complexity Big-Coffee Notation ☕(n) and spoke about the features of React that help keep our Big-Coffee from going quadratic, as our user interfaces get more complex.
<iframe width="560" height="315" src="//www.youtube.com/embed/rI0GQc__0SM" frameborder="0" allowfullscreen></iframe>
James Pearce ([jamesgpearce](https://github.com/jamesgpearce)) carried Big-Coffee all the way to Raleigh, NC. At the _All Things Open_ conference, he spoke about some of the design decisions that went into React, particularly those that lend themselves to simpler, more reliable code.
<iframe width="560" height="315" src="//www.youtube.com/embed/m2fuO2wl_3c" frameborder="0" allowfullscreen></iframe>
## All About Isomorphism
Michael Ridgway ([mridgway](https://github.com/mridgway)) shows us how Yahoo! (who recently [moved Yahoo! Mail to React](http://www.slideshare.net/rmsguhan/react-meetup-mailonreact)) renders their React+Flux application, server-side.
<script async class="speakerdeck-embed" data-id="87ecaa3048750132f42542ffc18c6fcf" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
Péter Márton ([hekike](https://github.com/hekike)) helps us brew a cold one (literally) using an application that's server-client [isomorphic and indexable](http://blog.risingstack.com/from-angularjs-to-react-the-isomorphic-way/). Demo and sample code included cold ones sold separately.
And, lest you think that client-server isomorphism exists in pursuit of crawalable, indexable HTML alone, watch as Nate Hunzaker ([nhunzaker](https://github.com/nhunzaker)) [server renders data visualizations as SVG](http://viget.com/extend/visualization-is-for-sharing-using-react-for-portable-data-visualization) with React.
## React Router Mows the Lawn
Ryan Florence ([rpflorence](https://github.com/rpflorence])) and Michael Jackson ([mjackson](https://github.com/mjackson)) unveiled a new API for [React Router](https://github.com/rackt/react-router) that solves some of its user's problems by eliminating the problems themselves. Read all about what React Router learned from its community of users, and how they've [rolled your ideas into their latest release](https://github.com/rackt/react-router/wiki/Announcements).
## React in Practice
Jonathan Beebe ([somethingkindawierd](https://github.com/somethingkindawierd)) spoke about how he uses React to build tools that deliver hope to those trying to make the best of a bad situation. Watch his talk from this year's _Nodevember_ conference in Nashville
<iframe width="420" height="315" src="//www.youtube.com/embed/uZgAq1CZ1N8" frameborder="0" allowfullscreen></iframe>
If you take a peek under the covers, you'll find that React powers [Carousel](https://blog.carousel.com/2014/11/introducing-carousel-for-web-ipad-and-android-tablet/), Dropbox's new photo and video gallery app.
We enjoyed a cinematic/narrative experience with this React-powered, interactive story by British author William Boyd. Dive into “[The Vanishing Game](https://thevanishinggame.wellstoried.com)” and see for yourself.
## Be Kind, Rewind
Spend the next 60 seconds watching Daniel Woelfel ([dwwoelfel](https://github.com/dwwoelfel)) serialize a React app's state as a string, then deserialize it to produce a working UI. Read about how he uses this technique to [reproduce bugs](http://blog.circleci.com/local-state-global-concerns/) reported to him by his users.
<iframe width="420" height="315" src="//www.youtube.com/embed/5yHFTN-_mOo" frameborder="0" allowfullscreen></iframe>
## Community Components
Tom Chen ([tomchentw](https://github.com/tomchentw)) brings us a [react-google-maps](http://tomchentw.github.io/react-google-maps/) component, and a way to syntax highlight source code using Prism and the [react-prism](http://tomchentw.github.io/react-prism/) component, for good measure.
Jed Watson ([jedwatson](https://github.com/JedWatson)) helps you manage touch, tap, and press events using the [react-tappable](https://github.com/JedWatson/react-tappable) component.
To find these, and more community-built components, consult the [React Components](http://react-components.com/) and [React Rocks](http://react.rocks) component directories. React Rocks recently exceeded one-hundred listed components and counting. See one missing? Add the keyword `react-component` to your `package.json` to get listed on React Components, and [submit a link to React Rocks](https://docs.google.com/forms/d/1TpnwJmLcmmGj-_TI68upu_bKBViYeiKx7Aj9uKmV6wY/viewform).
## Waiter, There's a CSS In My JavaScript
The internet is abuzz with talk of styling React components using JavaScript instead of CSS. Christopher Chedeau ([vjeux](https://github.com/vjeux)) talks about some of the [fundamental style management challenges](https://speakerdeck.com/vjeux/react-css-in-js) we grapple with, at Facebook scale. A number of implementations of JavaScript centric style management solutions have appeared in the wild, including the React-focused [react-style](https://github.com/js-next/react-style).
## Test Isolation
Yahoo! shows us how they make use of `iframe` elements to [unit test React components in isolation](http://yahooeng.tumblr.com/post/102274727496/to-testutil-or-not-to-testutil).
## You've Got The Hang of Flux, Now Let's Flow
Facebook Open Source released [Flow](https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-javascript/) this month a static type checker for JavaScript. Naturally, Flow supports JSX, and you can use it to [type check React applications](https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-javascript/#compatibility). There's never been a better reason to start making use of `propTypes` in your component specifications!
## Countdown to React.js Conf 2014
We're counting down the days until [React.js Conf](http://conf.reactjs.com) at Facebook's headquarters in Menlo Park, California, on January 28th & 29th, 2015. Thank you, to everyone who responded to the Call for Presenters. Mark the dates; tickets go on sale in three waves: at noon PST on November 28th, December 5th, and December 12th, 2014.
## React Meetups Around the World
<blockquote class="twitter-tweet" lang="en"><p>React JS meetup having pretty good turn up rate today <a href="https://twitter.com/hashtag/londonreact?src=hash">#londonreact</a> <a href="http://t.co/c360dlVVAe">pic.twitter.com/c360dlVVAe</a></p>&mdash; Alexander Savin (@karismafilms) <a href="https://twitter.com/karismafilms/status/535152580377468928">November 19, 2014</a></blockquote>
<div class="skinny-row">
<div class="skinny-col">
<blockquote class="twitter-tweet" lang="en"><p>60+ attendees at the second React.js Utah meetup. <a href="https://twitter.com/ryanflorence">@ryanflorence</a> doing a great job, even without the internet. <a href="http://t.co/fV59AQTOyu">pic.twitter.com/fV59AQTOyu</a></p>&mdash; ReactJS Utah (@reactjsutah) <a href="https://twitter.com/reactjsutah/status/527259410020573184">October 29, 2014</a></blockquote>
</div>
<div class="skinny-col">
<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/hashtag/ReactJS?src=hash">#ReactJS</a> meetup at <a href="https://twitter.com/Yahoo">@Yahoo</a> ! History of <a href="https://twitter.com/yahoomail">@yahoomail</a> and why we chose react and NodeJS <a href="http://t.co/Nm4EdTv45G">pic.twitter.com/Nm4EdTv45G</a></p>&mdash; rmsguhan (@rmsguhan) <a href="https://twitter.com/rmsguhan/status/515370950427029504">September 26, 2014</a></blockquote>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<blockquote class="twitter-tweet" data-cards="hidden" lang="en"><p>The very first ReactJS meetup in NYC tonight, I&#39;ll be speaking about the big ideas behind Om <a href="http://t.co/dvPrFqE9eP">http://t.co/dvPrFqE9eP</a></p>&mdash; David Nolen (@swannodette) <a href="https://twitter.com/swannodette/status/532190993463128064">November 11, 2014</a></blockquote>
</div>
<div class="skinny-col">
<blockquote class="twitter-tweet" lang="en"><p>If anyone in Sydney is curious about <a href="https://twitter.com/reactjs">@reactjs</a>, I&#39;m presenting at <a href="https://twitter.com/sydjs">@sydjs</a> tonight on how to use it and why it is the future. <a href="https://twitter.com/hashtag/javascript?src=hash">#javascript</a></p>&mdash; Jed Watson (@JedWatson) <a href="https://twitter.com/JedWatson/status/534943557568565248">November 19, 2014</a></blockquote>
</div>
</div>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

View File

@@ -0,0 +1,37 @@
---
title: React v0.12.2
author: Paul OShannessy
---
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](http://flowtype.org/), 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:
* **React**
Dev build with warnings: <http://fb.me/react-0.12.2.js>
Minified build for production: <http://fb.me/react-0.12.2.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.12.2.js>
Minified build for production: <http://fb.me/react-with-addons-0.12.2.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.12.2.js>
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](https://github.com/facebook/react/issues/new) 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`

View File

@@ -0,0 +1,37 @@
---
title: React.js Conf Diversity Scholarship
author: Paul OShannessy
---
Today I'm really happy to announce the React.js Conf Diversity Scholarship! We believe that a diverse set of viewpoints and opinions is really important to build a thriving community. In an ideal world, every part of the tech community would be made up of people from all walks of life. However the reality is that we must be proactive and make an effort to make sure everybody has a voice. As conference organizers we worked closely with the Diversity Team here at Facebook to set aside 10 tickets and provide a scholarship. 10 tickets may not be many in the grand scheme but we really believe that this will have a positive impact on the discussions we have at the conference.
I'm really excited about this and I hope you are too! The full announcement is below:
- - -
The Diversity Team at Facebook is excited to announce that we are now accepting applications for the React.js Conf scholarship!
Beginning today, those studying or working in computer science or a related field can apply for an all-expense paid scholarship to attend the React.js Conf at Facebooks Headquarters in Menlo Park, CA on January 28 & 29, 2015. React opens a world of new possibilities such as server-side rendering, real-time updates, different rendering targets like SVG and canvas. Join us at React.js Conf to shape the future of client-side applications! For more information about the React.js conference, please see the [website](http://conf.reactjs.com/) and [previous](http://facebook.github.io/react/blog/2014/10/27/react-js-conf.html) [updates](http://facebook.github.io/react/blog/2014/11/24/react-js-conf-updates.html) on our blog.
At Facebook, we believe that anyone anywhere can make a positive impact by developing products to make the world more open and connected to the people and things they care about. Given the current realities of the tech industry and the lack of representation of communities we seek to serve, applicants currently under-represented in Computer Science and related fields are strongly encouraged to apply.
Facebook will make determinations on scholarship recipients in its sole discretion. Facebook complies with all equal opportunity laws.
To apply for the scholarship, please visit the Application Page: <https://www.surveymonkey.com/s/XVJGK6R>
## Award Includes
* Paid registration fee for the React.js Conf January 28 & 29th at Facebooks Headquarters in Menlo Park, CA
* Paid travel and lodging expenses
* Additional $200 meal stipend
## Important Dates
* Monday, January 5, 2015: Applications for the React.js Conf Scholarship must be submitted in full
* Friday, January 9, 2015: Award recipients will be notified by email of their acceptance
* Wednesday & Thursday, January 28 & 29, 2015: React.js Conf
## Eligibility
* Must currently be studying or working in Computer Science or a related field
* International applicants are welcome, but you will be responsible for securing your own visa to attend the conference
* You must be available to attend the full duration of React.js conf on January 28 and 29 at Facebook Headquarters in Menlo Park

View File

@@ -0,0 +1,165 @@
---
title: React v0.13.0 Beta 1
author: Sebastian Markbåge
---
React 0.13 has a lot of nice features but there is one particular feature that I'm really excited about. I couldn't wait for React.js Conf to start tomorrow morning.
Maybe you're like me and staying up late excited about the conference, or maybe you weren't one of the lucky ones to get a ticket. Either way I figured I'd give you all something to play with until then.
We just published a beta version of React v0.13.0 to [npm](https://www.npmjs.com/package/react)! You can install it with `npm install react@0.13.0-beta.1`. Since this is a pre-release, we don't have proper release notes ready.
So what is that one feature I'm so excited about that I just couldn't wait to share?
## Plain JavaScript Classes!!
JavaScript originally didn't have a built-in class system. Every popular framework built their own, and so did we. This means that you have a learn slightly different semantics for each framework.
We figured that we're not in the business of designing a class system. We just want to use whatever is the idiomatic JavaScript way of creating classes.
In React 0.13.0 you no longer need to use `React.createClass` to create React components. If you have a transpiler you can use ES6 classes today. You can use the transpiler we ship with `react-tools` by making use of the harmony option: `jsx --harmony`.
### ES6 Classes
```javascript
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
React.render(<HelloMessage name="Sebastian" />, mountNode);
```
The API is mostly what you would expect, with the exception of `getInitialState`. We figured that the idiomatic way to specify class state is to just use a simple instance property. Likewise `getDefaultProps` and `propTypes` are really just properties on the constructor.
```javascript
export class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
}
tick() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div onClick={this.tick.bind(this)}>
Clicks: {this.state.count}
</div>
);
}
}
Counter.propTypes = { initialCount: React.PropTypes.number };
Counter.defaultProps = { initialCount: 0 };
```
### ES7+ Property Initializers
Wait, assigning to properties seems like a very imperative way of defining classes! You're right, however, we designed it this way because it's idiomatic. We fully expect a more declarative syntax for property initialization to arrive in future version of JavaScript. It might look something like this:
```javascript
// Future Version
export class Counter extends React.Component {
static propTypes = { initialCount: React.PropTypes.number };
static defaultProps = { initialCount: 0 };
state = { count: this.props.initialCount };
tick() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div onClick={this.tick.bind(this)}>
Clicks: {this.state.count}
</div>
);
}
}
```
This was inspired by TypeScript's property initializers.
### Autobinding
`React.createClass` has a built-in magic feature that bound all methods to `this` automatically for you. This can be a little confusing for JavaScript developers that are not used to this feature in other classes, or it can be confusing when they move from React to other classes.
Therefore we decided not to have this built-in into React's class model. You can still explicitly prebind methods in your constructor if you want.
```javascript
class Counter extends React.Component {
constructor() {
super();
this.tick = this.tick.bind(this);
}
tick() {
...
}
...
}
```
However, when we have the future property initializers, there is a neat trick that you can use to accomplish this syntactically:
```javascript
class Counter extends React.Component {
tick = () => {
...
}
...
}
```
### Mixins
Unfortunately, we will not launch any mixin support for ES6 classes in React. That would defeat the purpose of only using idiomatic JavaScript concepts.
There is no standard and universal way to define mixins in JavaScript. In fact, several features to support mixins were dropped from ES6 today. There are a lot of libraries with different semantics. We think that there should be one way of defining mixins that you can use for any JavaScript class. React just making another doesn't help that effort.
Therefore, we will keep working with the larger JS community to create a standard for mixins. We will also start designing a new compositional API that will help make common tasks easier to do without mixins. E.g. first-class subscriptions to any kind of Flux store.
Luckily, if you want to keep using mixins, you can just keep using `React.createClass`.
> **Note:**
>
> The classic `React.createClass` style of creating classes will continue to work just fine.
## Other Languages!
Since these classes are just plain old JavaScript classes, you can use other languages that compile to JavaScript classes, such as TypeScript.
You can also use CoffeeScript classes:
```coffeescript
div = React.createFactory 'div'
class Counter extends React.Component
@propTypes = initialCount: React.PropTypes.number
@defaultProps = initialCount: 0
constructor: (props) ->
super props
@state = count: props.initialCount
tick: =>
@setState count: @state.count + 1
render: ->
div onClick: @tick,
'Clicks: '
@state.count
```
You can even use the old ES3 module pattern if you want:
```javascript
function MyComponent(initialProps) {
return {
state: { value: initialProps.initialValue },
render: function() {
return <span className={this.state.value} />
}
};
}
```

View File

@@ -0,0 +1,269 @@
---
title: React.js Conf Round-up 2015
layout: post
author: Steven Luscher
---
It was a privilege to welcome the React community to Facebook HQ on January 2829 for the first-ever React.js Conf, and a pleasure to be be able to unveil three new technologies that we've been using internally at Facebook for some time: GraphQL, Relay, and React Native.
## The talks
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-keynote"></a>Keynote <a class="hash-link" href="#talk-keynote">#</a></h3>
<p>
<strong>Tom Occhino</strong> opened with a history of how React came to be, before announcing Facebooks answer to a long-looming what-if question: what if we could use React to target something other than the DOM?
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/KVZ-P-ZI6W4" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-tweak"></a>Tweaking in real time <a class="hash-link" href="#talk-tweak">#</a></h3>
<p>
<strong>Brenton Simpson</strong> showed us how eBay brings Bret Victors feedback loop to your favorite editor using Webpack, react-hot-loader, and <a href="https://github.com/appsforartists/ambidex">Ambidex</a>.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/yaymfLj5tjA" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-ast"></a>Abstract Syntax Trees <a class="hash-link" href="#talk-ast">#</a></h3>
<p>
<strong>Gurdas Nijor</strong> showed us how we can leverage some conventions of React to perform source code transformations that unlock an inspirational set of use cases.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/OZGgVxFxSIs" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-relay-graphql"></a>Relay and GraphQL <a class="hash-link" href="#talk-relay-graphql">#</a></h3>
<p>
<strong>Daniel Schafer</strong> and <strong>Jing Chen</strong> showed us how Facebook approaches data fetching with React, giving us an early peek at the forthcoming duo of Relay and GraphQL.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/9sc8Pyc51uU" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-channels"></a>Channels <a class="hash-link" href="#talk-channels">#</a></h3>
<p>
<strong>James Long</strong> explores what might happen if we introduce channels, a new style of coordinating actions, to React.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/W2DgDNQZOwo" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-router"></a>React Router <a class="hash-link" href="#talk-router">#</a></h3>
<p>
<strong>Michael Jackson</strong> reminded us that URLs should be part of our design process, and showed us how <a href="https://github.com/rackt/react-router">react-router</a> can help to manage the transitions between them.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/XZfvW1a8Xac" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-full-stack-flux"></a>Full-stack Flux <a class="hash-link" href="#talk-full-stack-flux">#</a></h3>
<p>
<strong>Pete Hunt</strong> showed us how a Flux approach can help us scale actions and questions on the backend in addition to the frontend.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/KtmjkCuV-EU" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-performance"></a>High-performance <a class="hash-link" href="#talk-performance">#</a></h3>
<p>
<strong>Jason Bonta</strong> showed us how complex user interfaces can get, and how his team keeps them performant as they scale. He also had the pleasure of open-sourcing his teams work on <a href="http://facebook.github.io/fixed-data-table/">FixedDataTable</a>.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/KYzlpRvWZ6c" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-intl"></a>FormatJS and react-intl <a class="hash-link" href="#talk-intl">#</a></h3>
<p>
<strong>Eric Ferraiuolo</strong> showed how you can bring your app to a worldwide audience using a series of polyfills and emerging ECMAScript APIs.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/Sla-DkvmIHY" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-hype"></a>Hype! <a class="hash-link" href="#talk-hype">#</a></h3>
<p>
<strong>Ryan Florence</strong> showed us how easy it is to transition from a career selling life insurance, to a burgeoning one as a software developer. All you have to do is to learn how to say “yes.”
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/z5e7kWSHWTg" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-native"></a>React Native <a class="hash-link" href="#talk-native">#</a></h3>
<p>
<strong>Christopher Chedeau</strong> showed us how to bring the developer experience of working with React on the web to native app development, using React Native.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/7rDsRXj9-cU" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-components"></a>Components <a class="hash-link" href="#talk-components">#</a></h3>
<p>
<strong>Andrew Rota</strong> explained how React and Web Components can work together, and how to avoid some common pitfalls.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/g0TD0efcwVg" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-immutable"></a>Immutability <a class="hash-link" href="#talk-immutable">#</a></h3>
<p>
<strong>Lee Byron</strong> led a master-class on persistent immutable data structures, showing us the world of possibility that they can unlock for your software, and perhaps Javascript in general.
</p>
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/I7IdS-PbEgI" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-gibbon"></a>Beyond the DOM <a class="hash-link" href="#talk-gibbon">#</a></h3>
<p>
<strong>Jafar Husain</strong> told us a story about how Netflix was able to push React into places where the DOM could not go.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/eNC0mRYGWgc" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-visualization"></a>Data Visualization <a class="hash-link" href="#talk-visualization">#</a></h3>
<p>
<strong>Zach Nation</strong> showed us how we can produce visualizations from over 45 million data points without breaking a sweat.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/2ii1lEkIv1s" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-refracted"></a>React Refracted <a class="hash-link" href="#talk-refracted">#</a></h3>
<p>
<strong>David Nolen</strong> gave us a view of React from a non-JavaScript perspective, challenging some common intuition along the way.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/5hGHdETNteE" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-flux-panel"></a>Flux Panel <a class="hash-link" href="#talk-flux-panel">#</a></h3>
<p>
<strong>Bill Fisher</strong> coordinated a Flux panel together with <strong>Michael Ridgway</strong>, <strong>Spike Brehm</strong>, <strong>Andres Suarez</strong>, <strong>Jing Chen</strong>, <strong>Ian Obermiller</strong>, and <strong>Kyle Davis</strong>.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/LTj4O7WJJ98" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-communication"></a>Component communication <a class="hash-link" href="#talk-communication">#</a></h3>
<p>
<strong>Bonnie Eisenman</strong> led us through the adapter approach to inter-component communication taken by her team at Codecademy.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/ZM6wXoFTY3o" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-typescript"></a>Flow and TypeScript <a class="hash-link" href="#talk-typescript">#</a></h3>
<p>
<strong>James Brantly</strong> demonstrated how we can reap the benefits of static typing using both Flow and TypeScript.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/9PTa9-PPVAc" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="skinny-row">
<div class="skinny-col">
<h3 style="margin-top:0"><a class="anchor" name="talk-qa"></a>Core Team Q&amp;A <a class="hash-link" href="#talk-qa">#</a></h3>
<p>
<strong>Tom Occhino</strong>, <strong>Ben Alpert</strong>, <strong>Lee Byron</strong>, <strong>Christopher Chedeau</strong>, <strong>Sebastian Markbåge</strong>, <strong>Jing Chen</strong>, and <strong>Dan Schafer</strong> closed the conference with a Q&amp;A session.
</div>
<div class="skinny-col">
<iframe width="305" height="171" src="https://www.youtube.com/embed/EPpkboSKvPI" frameborder="0" allowfullscreen></iframe>
</div>
</div>
## Reactions
The conference is over, but the conversation has just begun.
**Mihai Parparita** detailed his efforts to [hack his way to a React.js Conf ticket](http://blog.persistent.info/2014/12/html-munging-my-way-to-reactjs-conf.html); **James Long** blogged about [his first encounter with React Native](http://jlongster.com/First-Impressions-using-React-Native); **Eric Florenzano** talked about how he perceives the [impact of Relay, GraphQL, and React Native](https://medium.com/@ericflo/facebook-just-taught-us-all-how-to-build-websites-51f1e7e996f2) on software development; **Margaret Staples** blogged about her experience of [being on-campus at Facebook HQ](http://deadlugosi.blogspot.com/2015/02/facebook-gave-me-ice-cream.html); **Jeff Barczewski** tied his experience of attending the conference up with a bow in this [blog post filled with photos, videos, and links](http://codewinds.com/blog/2015-02-04-reactjs-conf.html); **Kevin Old** left us with [his takeaways](http://kevinold.com/2015/01/31/takeaways-from-reactjs-conf-2015.html); **Paul Wittmann** found React Native [freshly on his radar](http://www.railslove.com/stories/fresh-on-our-radar-react-native); and finally, undeterred by not being able to attend the conference in person, **Justin Ball** [summarized it from afar](http://www.justinball.com/2015/02/03/i-didn't-attend-react.js-conf/).
And, in case you missed a session, you can borrow **Michael Chans** [drawings](http://chantastic.io/2015-reactjs-conf/), **Mihai Parparitas** [summary](https://quip.com/uJQeABv7nkFN), or **Shaohua Zhous** [day 1](http://getshao.com/2015/01/29/react-js-conf-notes-day1/) / [day 2](http://getshao.com/2015/01/29/react-js-conf-notes-day-2/) notes.
<div class="skinny-row">
<div class="skinny-col">
<blockquote class="twitter-tweet" lang="en"><p>Notes from <a href="https://twitter.com/dlschafer">@dlschafer</a> and <a href="https://twitter.com/jingc">@jingc</a>&#39;s <a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a> talk &quot;Data fetching for React applications at Facebook&quot; <a href="http://t.co/IUZUbDCDMQ">pic.twitter.com/IUZUbDCDMQ</a></p>&mdash; Michael Chan (@chantastic) <a href="https://twitter.com/chantastic/status/560538533161472000">January 28, 2015</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>This is just magical (in the good way)… GraphQL + Relay is amazing. <a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a></p>&mdash; Chris Williams (@voodootikigod) <a href="https://twitter.com/voodootikigod/status/560533225395589120">January 28, 2015</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>These… these are my people. :) <a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a></p>&mdash; Thomas Beirne (@Beirnet) <a href="https://twitter.com/Beirnet/status/560317879501848576">January 28, 2015</a></blockquote>
</div>
<div class="skinny-col">
<blockquote class="twitter-tweet" lang="en"><p>Humbled by the React team and community. Found <a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a> very mindful, practical and just real.</p>&mdash; xnoɹǝʃ uɐıɹq (@brianleroux) <a href="https://twitter.com/brianleroux/status/560972130112655360">January 30, 2015</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>I say with confidence as a former UIKit author: React&#39;s model for the UI layer is vastly better than UIKit&#39;s. React Native is a *huge* deal.</p>&mdash; Andy Matuschak (@andy_matuschak) <a href="https://twitter.com/andy_matuschak/status/560511204867575808">January 28, 2015</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a> was incredible. Amazing project stewardship and community. Boring prediction, React Native sends adoption vertical in 2015.</p>&mdash; David Nolen (@swannodette) <a href="https://twitter.com/swannodette/status/561232290273980416">January 30, 2015</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>I really love the community shout outs by <a href="https://twitter.com/Vjeux">@vjeux</a> between talks at <a href="https://twitter.com/hashtag/reactjsconf?src=hash">#reactjsconf</a>!</p>&mdash; Andrew Rota (@AndrewRota) <a href="https://twitter.com/AndrewRota/status/560927339522297856">January 29, 2015</a></blockquote>
</div>
</div>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
**All proceeds from React.js Conf 2015 were donated to the wonderful programs at [code.org](http://code.org)**. These programs aim to increase access to the field of computer science by underrepresented members of our community. Watch this video to learn more.
<iframe width="305" height="171" src="https://www.youtube.com/embed/FC5FbmsH4fw" frameborder="0" allowfullscreen></iframe>

View File

@@ -0,0 +1,63 @@
---
title: "Introducing Relay and GraphQL"
layout: post
author: Greg Hurrell
---
## Data fetching for React applications
There's more to building an application than creating a user interface. Data fetching is still a tricky problem, especially as applications become more complicated. At [React.js Conf](http://conf.reactjs.com/) we announced two projects we've created at Facebook to make data fetching simple for developers, even as a product grows to include dozens of contributors and the application becomes as complex as Facebook itself.
<iframe width="560" height="315" src="https://www.youtube.com/embed/9sc8Pyc51uU" frameborder="0" allowfullscreen></iframe>
The two projects &mdash; Relay and GraphQL &mdash; have been in use in production at Facebook for some time, and we're excited to be bringing them to the world as open source in the future. In the meantime, we wanted to share some additional information about the projects here.
<script async class="speakerdeck-embed" data-id="7af7c2f33bf9451a892dcd91de55b7c2" data-ratio="1.29456384323641" src="//speakerdeck.com/assets/embed.js"></script>
## What is Relay?
Relay is a new framework from Facebook that provides data-fetching functionality for React applications. It was announced at React.js Conf (January 2015).
Each component specifies its own data dependencies declaratively using a query language called GraphQL. The data is made available to the component via properties on `this.props`.
Developers compose these React components naturally, and Relay takes care of composing the data queries into efficient batches, providing each component with exactly the data that it requested (and no more), updating those components when the data changes, and maintaining a client-side store (cache) of all data.
## What is GraphQL?
GraphQL is a data querying language designed to describe the complex, nested data dependencies of modern applications. It's been in production use in Facebook's native apps for several years.
On the server, we configure the GraphQL system to map queries to underlying data-fetching code. This configuration layer allows GraphQL to work with arbitrary underlying storage mechanisms. Relay uses GraphQL as its query language, but it is not tied to a specific implementation of GraphQL.
## The value proposition
Relay was born out of our experiences building large applications at Facebook. Our overarching goal is to enable developers to create correct, high-performance applications in a straightforward and obvious way. The design enables even large teams to make changes with a high degree of isolation and confidence. Fetching data is hard, dealing with ever-changing data is hard, and performance is hard. Relay aims to reduce these problems to simple ones, moving the tricky bits into the framework and freeing you to concentrate on building your application.
By co-locating the queries with the view code, the developer can reason about what a component is doing by looking at it in isolation; it's not necessary to consider the context where the component was rendered in order to understand it. Components can be moved anywhere in a render hierarchy without having to apply a cascade of modifications to parent components or to the server code which prepares the data payload.
Co-location leads developers to fall into the "pit of success", because they get exactly the data they asked for and the data they asked for is explicitly defined right next to where it is used. This means that performance becomes the default (it becomes much harder to accidentally over-fetch), and components are more robust (under-fetching is also less likely for the same reason, so components won't try to render missing data and blow up at runtime).
Relay provides a predictable environment for developers by maintaining an invariant: a component won't be rendered until all the data it requested is available. Additionally, queries are defined statically (ie. we can extract queries from a component tree before rendering) and the GraphQL schema provides an authoritative description of what queries are valid, so we can validate queries early and fail fast when the developer makes a mistake.
Only the fields of an object that a component explicitly asks for will be accessible to that component, even if other fields are known and cached in the store (because another component requested them). This makes it impossible for implicit data dependency bugs to exist latently in the system.
By handling all data-fetching via a single abstraction, we're able to handle a bunch of things that would otherwise have to be dealt with repeatedly and pervasively across the application:
- **Performance:** All queries flow through the framework code, where things that would otherwise be inefficient, repeated query patterns get automatically collapsed and batched into efficient, minimal queries. Likewise, the framework knows which data have been previously requested, or for which requests are currently "in flight", so queries can be automatically de-duplicated and the minimal queries can be produced.
- **Subscriptions:** All data flows into a single store, and all reads from the store are via the framework. This means the framework knows which components care about which data and which should be re-rendered when data changes; components never have to set up individual subscriptions.
- **Common patterns:** We can make common patterns easy. Pagination is the example that [Jing](https://twitter.com/jingc) gave at the conference: if you have 10 records initially, getting the next page just means declaring you want 15 records in total, and the framework automatically constructs the minimal query to grab the delta between what you have and what you need, requests it, and re-renders your view when the data become available.
- **Simplified server implementation:** Rather than having a proliferation of end-points (per action, per route), a single GraphQL endpoint can serve as a facade for any number of underlying resources.
- **Uniform mutations:** There is one consistent pattern for performing mutations (writes), and it is conceptually baked into the data querying model itself. You can think of a mutation as a query with side-effects: you provide some parameters that describe the change to be made (eg. attaching a comment to a record) and a query that specifies the data you'll need to update your view of the world after the mutation completes (eg. the comment count on the record), and the data flows through the system using the normal flow. We can do an immediate "optimistic" update on the client (ie. update the view under the assumption that the write will succeed), and finally commit it, retry it or roll it back in the event of an error when the server payload comes back.
## How does it relate to Flux?
In some ways Relay is inspired by Flux, but the mental model is much simpler. Instead of multiple stores, there is one central store that caches all GraphQL data. Instead of explicit subscriptions, the framework itself can track which data each component requests, and which components should be updated whenever the data change. Instead of actions, modifications take the form of mutations.
At Facebook, we have apps built entirely using Flux, entirely using Relay, or with both. One pattern we see emerging is letting Relay manage the bulk of the data flow for an application, but using Flux stores on the side to handle a subset of application state.
## Open source plans
We're working very hard right now on getting both GraphQL (a spec, and a reference implementation) and Relay ready for public release (no specific dates yet, but we are super excited about getting these out there).
In the meantime, we'll be providing more and more information in the form of blog posts (and in [other channels](https://gist.github.com/wincent/598fa75e22bdfa44cf47)). As we get closer to the open source release, you can expect more concrete details, syntax and API descriptions and more.
Watch this space!

View File

@@ -0,0 +1,78 @@
---
title: "React v0.13 RC"
author: Paul O'Shannessy
date: 2015-02-24 14:00
---
Over the weekend we pushed out our first (and hopefully only) release candidate for React v0.13!
We've talked a little bit about the changes that are coming. The splashiest of these changes is support for ES6 Classes. You can read more about this in [our beta announcement](/react/blog/2015/01/27/react-v0.13.0-beta-1.html). We're really excited about this! Sebastian also posted earlier this morning about [some of the other changes coming focused around ReactElement](/react/blog/2015/02/24/streamlining-react-elements.html). The changes we've been working on there will hopefully enable lots of improvements to performance and developer experience.
The release candidate is available for download:
* **React**
Dev build with warnings: <http://fb.me/react-0.13.0-rc1.js>
Minified build for production: <http://fb.me/react-0.13.0-rc1.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.13.0-rc1.js>
Minified build for production: <http://fb.me/react-with-addons-0.13.0-rc1.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.13.0-rc1.js>
We've also published version `0.13.0-rc1` of the `react` and `react-tools` packages on npm and the `react` package on bower.
- - -
## Changelog
### React Core
#### Breaking Changes
* Mutating `props` after an element is created is deprecated and will cause warnings in development mode; future versions of React will incorporate performance optimizations assuming that props aren't mutated
* Static methods (defined in `statics`) are no longer autobound to the component class
* `ref` resolution order has changed slightly such that a ref to a component is available immediately after its `componentDidMount` method is called; this change should be observable only if your component calls a parent component's callback within your `componentDidMount`, which is an anti-pattern and should be avoided regardless
* Calls to `setState` in life-cycle methods are now always batched and therefore asynchronous. Previously the first call on the first mount was synchronous.
* `setState` and `forceUpdate` on an unmounted component now warns instead of throwing. That avoids a possible race condition with Promises.
* Access to most internal properties has been completely removed, including `this._pendingState` and `this._rootNodeID`.
#### New Features
* Support for using ES6 classes to build React components; see the [v0.13.0 beta 1 notes](http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html) for details
* Added new top-level API `React.findDOMNode(component)`, which should be used in place of `component.getDOMNode()`. The base class for ES6-based components will not have `getDOMNode`. This change will enable some more patterns moving forward.
* New `ref` style, allowing a callback to be used in place of a name: `<Photo ref={(c) => this._photo = c} />` allows you to reference the component with `this._photo` (as opposed to `ref="photo"` which gives `this.refs.photo`)
* `this.setState()` can now take a function as the first argument for transactional state updates, such as `this.setState((state, props) => ({count: state.count + 1}));` -- this means that you no longer need to use `this._pendingState`, which is now gone.
* Support for iterators and immutable-js sequences as children
#### Deprecations
* `ComponentClass.type` is deprecated. Just use `ComponentClass` (usually as `element.type === ComponentClass`)
* Some methods that are available on `createClass`-based components are removed or deprecated from ES6 classes (for example, `getDOMNode`, `setProps`, `replaceState`).
### React with Add-Ons
#### Deprecations
* `React.addons.classSet` is now deprecated. This functionality can be replaced with several freely available modules. [classnames](https://www.npmjs.com/package/classnames) is one such module.
### React Tools
#### Breaking Changes
* When transforming ES6 syntax, `class` methods are no longer enumerable by default, which requires `Object.defineProperty`; if you support browsers such as IE8, you can pass `--target es3` to mirror the old behavior
#### New Features
* `--target` option is available on the jsx command, allowing users to specify and ECMAScript version to target.
* `es5` is the default.
* `es3` restored the previous default behavior. An additional transform is added here to ensure the use of reserved words as properties is safe (eg `this.static` will become `this['static']` for IE8 compatibility).
* The transform for the call spread operator has also been enabled.
### JSX
#### Breaking Changes
* A change was made to how some JSX was parsed, specifically around the use of `>` or `}` when inside an element. Previously it would be treated as a string but now it will be treated as a parse error. We will be releasing a standalone executable to find and fix potential issues in your JSX code.

View File

@@ -0,0 +1,230 @@
---
title: "Streamlining React Elements"
author: Sebastian Markbåge
date: 2015-02-24 11:00
---
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, youll 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:
```js
var element = <Foo bar={false} />;
if (shouldUseFoo) {
element.props.foo = 10;
element.props.bar = true;
}
```
The problem is that we dont have a convenient way to tell when youre done mutating.
### Problem: Mutating Props You Dont Own
If you mutate something, you destroy the original value. Therefore, there is nothing to diff against. Imagine something like this:
```js
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 cant 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:
```js
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:
```js
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:
```js
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 youll 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.
```js
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.
```js
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 didnt even know about it. It silently changes semantics. Take this for example:
```js
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:
```js
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? Couldnt 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 wouldnt need to have React in scope.
### Solution: Make Context Parent-Based Instead of Owner-Based
The first thing were doing is warning you if youre using the "owner" feature in a way that relies on it propagating through owners. Instead, were planning on propagating it through parents to its children. In almost all cases, this shouldnt 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, well warn you if it turns out that the owner is important to determine state. In almost every case this shouldnt matter. Unless youre doing some weird optimizations, you shouldnt see this warning.
### Pending: Change the refs Semantics
Refs are still based on "owner". We havent fully solved this special case just yet.
In 0.13 we introduced a new callback-refs API that doesnt suffer from these problems but well keep on a nice declarative alternative to the current semantics for refs. As always, we wont deprecate something until were sure that youll 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 isnt actually widely used. It shouldnt be an issue for most of you.
```js
<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:
```js
var children = {};
items.forEach(item => children[item.title] = <span />);
return <div>{children}</div>;
```
Imagine if `item.title === '__proto__'` for example.
### Problem: Cant be Differentiated from Arbitrary Objects
Since these objects can have any keys with almost any value, we cant 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.
```js
var children = items.map(item => <span key={item.title} />);
<div>{children}</div>
```
### Solution: React.addons.createFragment
However, this is not always possible if youre 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.
```js
<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:
- [Reuse Constant Value Types](https://github.com/facebook/react/issues/3226)
- [Tagging ReactElements](https://github.com/facebook/react/issues/3227)
- [Inline ReactElements](https://github.com/facebook/react/issues/3228)
\* 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 DONT use these patterns have to pay the price. There are other problematic patterns such as mutating state, but theyre at least localized to a component subtree so they dont harm the ecosystem.
As always, wed love to hear your feedback and if you have any trouble upgrading, please let us know.

View File

@@ -0,0 +1,58 @@
---
title: "React v0.13 RC2"
author: Sebastian Markbåge
---
Thanks to everybody who has already been testing the release candidate. We've received some good feedback and as a result we're going to do a second release candidate. The changes are minimal. We haven't changed the behavior of any APIs we exposed in the previous release candidate. Here's a summary of the changes:
* Introduced a new API (`React.cloneElement`, see below for details).
* Fixed a bug related to validating `propTypes` when using the new `React.addons.createFragment` API.
* Improved a couple warning messages.
* Upgraded jstransform and esprima.
The release candidate is available for download:
* **React**
Dev build with warnings: <http://fb.me/react-0.13.0-rc2.js>
Minified build for production: <http://fb.me/react-0.13.0-rc2.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.13.0-rc2.js>
Minified build for production: <http://fb.me/react-with-addons-0.13.0-rc2.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.13.0-rc2.js>
We've also published version `0.13.0-rc2` of the `react` and `react-tools` packages on npm and the `react` package on bower.
- - -
## React.cloneElement
In React v0.13 RC2 we will introduce a new API, similar to `React.addons.cloneWithProps`, with this signature:
```js
React.cloneElement(element, props, ...children);
```
Unlike `cloneWithProps`, this new function does not have any magic built-in behavior for merging `style` and `className` for the same reason we don't have that feature from `transferPropsTo`. Nobody is sure what exactly the complete list of magic things are, which makes it difficult to reason about the code and difficult to reuse when `style` has a different signature (e.g. in the upcoming React Native).
`React.cloneElement` is *almost* equivalent to:
```js
<element.type {...element.props} {...props}>{children}</element.type>
```
However, unlike JSX and `cloneWithProps`, it also preserves `ref`s. This means that if you get a child with a `ref` on it, you won't accidentally steal it from your ancestor. You will get the same `ref` attached to your new element.
One common pattern is to map over your children and add a new prop. There were many issues reported about `cloneWithProps` losing the ref, making it harder to reason about your code. Now following the same pattern with `cloneElement` will work as expected. For example:
```js
var newChildren = React.Children.map(this.props.children, function(child) {
return React.cloneElement(child, { foo: true })
});
```
> Note: `React.cloneElement(child, { ref: 'newRef' })` *DOES* override the `ref` so it is still not possible for two parents to have a ref to the same child, unless you use callback-refs.
This was a critical feature to get into React 0.13 since props are now immutable. The upgrade path is often to clone the element, but by doing so you might lose the `ref`. Therefore, we needed a nicer upgrade path here. As we were upgrading callsites at Facebook we realized that we needed this method. We got the same feedback from the community. Therefore we decided to make another RC before the final release to make sure we get this in.
We plan to eventually deprecate `React.addons.cloneWithProps`. We're not doing it yet, but this is a good opportunity to start thinking about your own uses and consider using `React.cloneElement` instead. We'll be sure to ship a release with deprecation notices before we actually remove it so no immediate action is necessary.

View File

@@ -0,0 +1,63 @@
---
title: "Community Round-up #25"
layout: post
author: Matthew Johnston
---
## React 101
Interest in React has been exploding recently, so it's a good time to explore some great recent tutorials and videos that cover getting started.
[Ryan Clark](https://github.com/rynclark) provides a [great overview of the basics of React](http://ryanclark.me/getting-started-with-react/) with the goal of building a really simple dropdown nav.
[Formidable Labs](https://github.com/FormidableLabs) and [Seattle JS](http://www.meetup.com/seattlejs/) recently hosted a series of React, Flux, and Flow workshops, and the first part is available to watch online:
<iframe width="650" height="300" src="//www.youtube.com/embed/Pd6Ub7Ju2RM" frameborder="0" allowfullscreen></iframe>
[AEFlash](https://github.com/aearly) writes up [some best practices and tips](http://aeflash.com/2015-02/react-tips-and-best-practices.html) to help you avoid potential pitfalls when developing with React.
Black Mutt Media [takes us through their usage of React](http://blackmuttmedia.com/blog/react-tmdb-api/) and Ruby to build an autocomplete field, and some of the pitfalls they encountered along the way.
Our own [Sebastian Markbåge](https://github.com/sebmarkbage) was on the [Web Platform Podcast](http://thewebplatform.libsyn.com/31-building-with-reactjs) to have a chat about all aspects of React.
<iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/3370114/height/75/width/200/theme/standard-mini/direction/no/autoplay/no/autonext/no/thumbnail/yes/preload/no/no_addthis/no/" height="26" width="650" scrolling="no" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="" oallowfullscreen="" msallowfullscreen=""></iframe>
## Community Additions
[Formidable Labs](https://github.com/FormidableLabs) have been busy, as they've also[ just launched Radium](http://projects.formidablelabs.com/radium/), a React component that provides you with the ability to use inline styles instead of CSS. They're also [looking for some help](http://projects.formidablelabs.com/radium-bootstrap/) contributing to a Radium Bootstrap implementation.
[Reactiflux.com](http://reactiflux.com/) is a new Slack community based around (you guessed it!) React, and Flux.
[React Week](http://reactweek.com/) is a week-long learning workshop, happening next week, for React, Flux, and other related technologies, run by [Ryan Florence](https://github.com/ryanflorence).
[Babel-sublime](https://github.com/babel/babel-sublime) is a new package which provides Sublime with language definitions for ES6 JavaScript with React JSX syntax extensions.
[react-meteor](https://github.com/reactjs/react-meteor), a package that replaces the default templating system of the Meteor platform with React, recently received a big update.
## Rebuilding with React
[Rich Manalang](https://github.com/rmanalan) from Atlassian [explains why](https://developer.atlassian.com/blog/2015/02/rebuilding-hipchat-with-react/) they rebuilt their HipChat web client from scratch using React, and how they're already using it to rebuild their native desktop clients.
[Andrew Hillel](https://twitter.com/andyhillel) of the BBC gives [an excellent and thorough breakdown](http://www.bbc.co.uk/blogs/internet/entries/47a96d23-ae04-444e-808f-678e6809765d) of the stack they used to rebuild their homepage, with React as an integral part of the front-end.
A team from New Zealand called [Atomic](https://atomic.io/) is [building web and mobile prototyping and design tools](http://thenextweb.com/creativity/2015/02/19/meet-atomic-missing-tool-interface-design-thats-entirely-browser/) entirely in-browser, and as co-founder [Darryl Gray](http://twitter.com/darrylgray) says, “React.js “totally changed” the fact that browser performance often wasnt good enough for complex tools like this.”.
[Polarr](https://github.com/Polarrco) have rebuilt [their browser-based photo editor](http://polarrist.tumblr.com/post/111290422225/polarr-photo-editor-2-0-alpha-is-here) with React.
<center><a href="http://polarrist.tumblr.com/post/111290422225/polarr-photo-editor-2-0-alpha-is-here"><img src="/react/img/blog/polarr.jpg"></a></center>
## It's F8!
F8 2015 is just around the corner, and you can [sign up for the video streams](https://www.fbf8.com/stream.html) in advance because we're sure to be covering all things React.
## Meetups
<table><tr><td width="50%" valign="top">
<blockquote class="twitter-tweet" lang="en"><p>Our <a href="https://twitter.com/reactjs">@reactjs</a> meetup is in full effect <a href="https://twitter.com/hashtag/ReactJS?src=hash">#ReactJS</a> &#10;&#10;btw bathroom code is 6012 lol <a href="http://t.co/7iUpvmm3zz">pic.twitter.com/7iUpvmm3zz</a></p>&mdash; littleBits (@littleBits) <a href="https://twitter.com/littleBits/status/570373833028472832">February 25, 2015</a></blockquote>
</td><td width="50%" valign="top">
<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/yrezgui">@yrezgui</a> captivating us with <a href="https://twitter.com/reactjs">@reactjs</a> at <a href="https://twitter.com/DevRocketUK">@DevRocketUK</a>. Thanks to the amazing sponsors <a href="https://twitter.com/makersacademy">@makersacademy</a> and <a href="https://twitter.com/couchbase">@couchbase</a>. <a href="http://t.co/xwA773omky">pic.twitter.com/xwA773omky</a></p>&mdash; James Nocentini (@jamiltz) <a href="https://twitter.com/jamiltz/status/570306188577001473">February 24, 2015</a></blockquote>
</td></tr><tr><td width="50%" valign="top">
<blockquote class="twitter-tweet" lang="en"><p>Listening to a bunch of very clever geekoids at the <a href="https://twitter.com/reactjs">@reactjs</a> seminar. Nice! <a href="http://t.co/0TeTOJOerO">pic.twitter.com/0TeTOJOerO</a></p>&mdash; Nick Middleweek (@nmiddleweek) <a href="https://twitter.com/nmiddleweek/status/568183658395394049">February 18, 2015</a></blockquote>
</td><td width="50%" valign="top">
<blockquote class="twitter-tweet" lang="en"><p>Watching the <a href="https://twitter.com/FrontendMasters">@FrontendMasters</a> ReactJS workshop! <a href="http://t.co/YraYIK97Lu">pic.twitter.com/YraYIK97Lu</a></p>&mdash; ReactJS News (@ReactJSNews) <a href="https://twitter.com/ReactJSNews/status/566269552112041985">February 13, 2015</a></blockquote>
</td></tr></table>

View File

@@ -0,0 +1,90 @@
---
title: "React v0.13"
author: Ben Alpert
---
Today, we're happy to release React v0.13!
The most notable new feature is [support for ES6 classes](/react/blog/2015/01/27/react-v0.13.0-beta-1.html), which allows developers to have more flexibility when writing components. Our eventual goal is for ES6 classes to replace `React.createClass` completely, but until we have a replacement for current mixin use cases and support for class property initializers in the language, we don't plan to deprecate `React.createClass`.
At EmberConf and ng-conf last week, we were excited to see that Ember and Angular have been working on speed improvements and now both have performance comparable to React. We've always thought that performance isn't the most important reason to choose React, but we're still planning more optimizations to **make React even faster**.
Our planned optimizations require that ReactElement objects are immutable, which has always been a best practice when writing idiomatic React code. In this release, we've added runtime warnings that fire when props are changed or added between the time an element is created and when it's rendered. When migrating your code, you may want to use new `React.cloneElement` API (which is similar to `React.addons.cloneWithProps` but preserves `key` and `ref` and does not merge `style` or `className` automatically). For more information about our planned optimizations, see GitHub issues
[#3226](https://github.com/facebook/react/issues/3226),
[#3227](https://github.com/facebook/react/issues/3227),
[#3228](https://github.com/facebook/react/issues/3228).
The release is now available for download:
* **React**
Dev build with warnings: <http://fb.me/react-0.13.0.js>
Minified build for production: <http://fb.me/react-0.13.0.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.13.0.js>
Minified build for production: <http://fb.me/react-with-addons-0.13.0.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.13.0.js>
We've also published version `0.13.0` of the `react` and `react-tools` packages on npm and the `react` package on bower.
- - -
## Changelog
### React Core
#### Breaking Changes
* Deprecated patterns that warned in 0.12 no longer work: most prominently, calling component classes without using JSX or React.createElement and using non-component functions with JSX or createElement
* Mutating `props` after an element is created is deprecated and will cause warnings in development mode; future versions of React will incorporate performance optimizations assuming that props aren't mutated
* Static methods (defined in `statics`) are no longer autobound to the component class
* `ref` resolution order has changed slightly such that a ref to a component is available immediately after its `componentDidMount` method is called; this change should be observable only if your component calls a parent component's callback within your `componentDidMount`, which is an anti-pattern and should be avoided regardless
* Calls to `setState` in life-cycle methods are now always batched and therefore asynchronous. Previously the first call on the first mount was synchronous.
* `setState` and `forceUpdate` on an unmounted component now warns instead of throwing. That avoids a possible race condition with Promises.
* Access to most internal properties has been completely removed, including `this._pendingState` and `this._rootNodeID`.
#### New Features
* Support for using ES6 classes to build React components; see the [v0.13.0 beta 1 notes](http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html) for details.
* Added new top-level API `React.findDOMNode(component)`, which should be used in place of `component.getDOMNode()`. The base class for ES6-based components will not have `getDOMNode`. This change will enable some more patterns moving forward.
* Added a new top-level API `React.cloneElement(el, props)` for making copies of React elements see the [v0.13 RC2 notes](/react/blog/2015/03/03/react-v0.13-rc2.html#react.cloneelement) for more details.
* New `ref` style, allowing a callback to be used in place of a name: `<Photo ref={(c) => this._photo = c} />` allows you to reference the component with `this._photo` (as opposed to `ref="photo"` which gives `this.refs.photo`).
* `this.setState()` can now take a function as the first argument for transactional state updates, such as `this.setState((state, props) => ({count: state.count + 1}));` this means that you no longer need to use `this._pendingState`, which is now gone.
* Support for iterators and immutable-js sequences as children.
#### Deprecations
* `ComponentClass.type` is deprecated. Just use `ComponentClass` (usually as `element.type === ComponentClass`).
* Some methods that are available on `createClass`-based components are removed or deprecated from ES6 classes (`getDOMNode`, `replaceState`, `isMounted`, `setProps`, `replaceProps`).
### React with Add-Ons
#### New Features
* [`React.addons.createFragment` was added](/react/docs/create-fragment.html) for adding keys to entire sets of children.
#### Deprecations
* `React.addons.classSet` is now deprecated. This functionality can be replaced with several freely available modules. [classnames](https://www.npmjs.com/package/classnames) is one such module.
* Calls to `React.addons.cloneWithProps` can be migrated to use `React.cloneElement` instead make sure to merge `style` and `className` manually if desired.
### React Tools
#### Breaking Changes
* When transforming ES6 syntax, `class` methods are no longer enumerable by default, which requires `Object.defineProperty`; if you support browsers such as IE8, you can pass `--target es3` to mirror the old behavior
#### New Features
* `--target` option is available on the jsx command, allowing users to specify and ECMAScript version to target.
* `es5` is the default.
* `es3` restores the previous default behavior. An additional transform is added here to ensure the use of reserved words as properties is safe (eg `this.static` will become `this['static']` for IE8 compatibility).
* The transform for the call spread operator has also been enabled.
### JSX
#### Breaking Changes
* A change was made to how some JSX was parsed, specifically around the use of `>` or `}` when inside an element. Previously it would be treated as a string but now it will be treated as a parse error. The [`jsx_orphaned_brackets_transformer`](https://www.npmjs.com/package/jsx_orphaned_brackets_transformer) package on npm can be used to find and fix potential issues in your JSX code.

View File

@@ -7,7 +7,7 @@
@mixin code-typography {
font-family: 'source-code-pro', Menlo, Consolas, 'Courier New', monospace;
font-size: 0.8em;
font-size: 13px;
line-height: 1.5;
}
@@ -288,6 +288,19 @@ h1, h2, h3, h4, h5, h6 {
width: 400px;
}
.skinny-row {
@include clearfix;
}
.skinny-col {
float: left;
margin-left: $columnGutter;
width: ($skinnyContentWidth - $columnGutter) / 2;
&:first-child {
margin-left: 0;
}
}
.marketing-row {
@include clearfix;
margin: 50px 0;
@@ -595,8 +608,8 @@ div.CodeMirror pre, div.CodeMirror-linenumber, code {
@include code-typography;
}
div.CodeMirror-linenumber:after {
content: '.';
div.CodeMirror-linenumber {
text-align: right;
}
.CodeMirror, div.CodeMirror-gutters, div.highlight {
@@ -671,6 +684,10 @@ p code {
height: 100px
}
.MarkdownEditor .content {
white-space: pre-wrap;
}
.hll {
background-color: #f7ebc6;
border-left: 5px solid #f7d87c;
@@ -776,6 +793,7 @@ p code {
// Twitter embeds. Need to !important because they inline margin on the iframe.
div[data-twttr-id] iframe {
margin: 10px auto !important;
width: 100% !important;
}
/* Acknowledgements */

View File

@@ -13,9 +13,9 @@ React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript
仅仅只要表达出你的应用程序在任一个时间点应该长的样子然后当底层的数据变了React 会自动处理所有用户界面的更新。
### 表达能力 (Declarative)
### 声明式 (Declarative)
数据变化React 概念上是类似点击了更新的按钮,但仅会更新变化的部分。
数据变化React 概念上与点击“刷新”按钮类似,但仅会更新变化的部分。
## 构建可组合的组件

View File

@@ -66,7 +66,7 @@ The inputs to this component are called `props` — short for "properties". They
## Components are Just Like Functions
React components are very simple. You can think of them as simple function that take in `props` and `state` (discussed later) and render HTML. Because they're so simple, it makes them very easy to reason about.
React components are very simple. You can think of them as simple functions that take in `props` and `state` (discussed later) and render HTML. Because they're so simple, it makes them very easy to reason about.
> Note:
>
@@ -100,15 +100,16 @@ The easiest way to get started with JSX is to use the in-browser `JSXTransformer
## React without JSX
JSX is completely optional. You don't have to use JSX with React. You can create these trees through `React.createElement`. The first argument is the tag, pass a properties object as the second argument and children to the third argument.
JSX is completely optional; you don't have to use JSX with React. You can create React elements in plain JavaScript using `React.createElement`, which takes a tag name or component, a properties object, and variable number of optional child arguments.
```javascript
var child = React.createElement('li', null, 'Text Content');
var root = React.createElement('ul', { className: 'my-list' }, child);
var child1 = React.createElement('li', null, 'First Text Content');
var child2 = React.createElement('li', null, 'Second Text Content');
var root = React.createElement('ul', { className: 'my-list' }, child1, child2);
React.render(root, document.body);
```
As a convenience you can create short-hand factory function to create elements from custom components.
As a convenience you can create short-hand factory functions to create elements from custom components.
```javascript
var Factory = React.createFactory(ComponentClass);
@@ -117,7 +118,7 @@ var root = Factory({ custom: 'prop' });
React.render(root, document.body);
```
React already have built-in factories for common HTML tags:
React already has built-in factories for common HTML tags:
```javascript
var root = React.DOM.ul({ className: 'my-list' },

View File

@@ -4,10 +4,11 @@ title: 显示数据
layout: docs
permalink: displaying-data-zh-CN.html
prev: why-react-zh-CN.html
next: jsx-in-depth.html
next: jsx-in-depth-zh-CN.html
---
通过用户界面,最基础可以做的事就是显示一些数据。React 让显示数据变得简单,当数据变化的时候,用户界面会自动同步更新。
用户界面能做的最基础的事就是显示一些数据。React 让显示数据变得简单,当数据变化的时候,用户界面会自动同步更新。
## 开始
@@ -54,6 +55,7 @@ setInterval(function() {
}, 500);
```
## 被动更新 (Reactive Updates)
在浏览器中打开 `hello-react.html` ,在输入框输入你的名字。你会发现 React 在用户界面中只改变了时间, 任何你在输入框输入的内容一直保留着即使你没有写任何代码来完成这个功能。React 为你解决了这个问题,做了正确的事。
@@ -62,6 +64,7 @@ setInterval(function() {
对这个组件的输入称为 `props` - "properties"的缩写。得益于 JSX 语法,它们通过参数传递。你必须知道在组件里,这些属性是不可改变的,也就是说 **`this.props` 是只读的**。
## 组件就像是函数
React 组件非常简单。你可以认为它们就是简单的函数,接受 `props``state` (后面会讨论) 作为参数,然后渲染出 HTML。正是应为它们是这么的简单这使得它们非常容易理解。
@@ -70,16 +73,53 @@ React 组件非常简单。你可以认为它们就是简单的函数,接受 `
>
> **只有一个限制**: React 组件只能渲染单个根节点。如果你想要返回多个节点,它们*必须*被包含在同一个节点里。
## JSX 语法
我们坚信组件是正确方法去做关注分离,而不是通过“模板”和“展示逻辑”。我们认为标签和生成它的代码是紧密相连的。此外,展示逻辑通常是很复杂的,通过模板语言实现这些逻辑会产生大量代码。
我们得出解决这个问题最好的方案是通过 JavaScript 直接生成模板,这样你就可以用一个真正语言的所有表达能力去构建用户界面。为了使这变得更简单,我们做了一个非常简单、**可选**类似 HTML 语法 ,通过函数调用即可生成模板的编译器,称为 JSX。
**JSX 让你可以用 HTML 语法去写 JavaScript 函数调用** 为了在 React 生成一个链接,通过纯 JavaScript 你可以这么写: `React.createElement('a', {href: 'http://facebook.github.io/react/'}, 'Hello React!')`。通过 JSX 这就变成了 `<a href="http://facebook.github.io/react/">Hello React!</a>`。我们发现这会使搭建 React 应用更加简单,设计师也偏向用这用语法,但是每个人可以有它们自己的工作流,所以**JSX 不是必须用的。**
**JSX 让你可以用 HTML 语法去写 JavaScript 函数调用** 为了在 React 生成一个链接,通过纯 JavaScript 你可以这么写:
JSX 非常小上面“hello, world”的例子使用了 JSX 所有的特性。想要了解更多,请看 [深入理解 JSX](/react/docs/jsx-in-depth.html)。或者直接使用[在线 JSX 编译器](/react/jsx-compiler.html)观察变化过程
`React.createElement('a', {href: 'http://facebook.github.io/react/'}, 'Hello React!')`
JSX 类似于 HTML但不是完全一样。参考[JSX gotchas](/react/docs/jsx-gotchas.html) 学习关键区别。
通过 JSX 这就变成了
`<a href="http://facebook.github.io/react/">Hello React!</a>`
我们发现这会使搭建 React 应用更加简单,设计师也偏向用这用语法,但是每个人可以有它们自己的工作流,所以**JSX 不是必须用的。**
JSX 非常小上面“hello, world”的例子使用了 JSX 所有的特性。想要了解更多,请看 [深入理解 JSX](/react/docs/jsx-in-depth-zh-CN.html)。或者直接使用[在线 JSX 编译器](/react/jsx-compiler.html)观察变化过程。
JSX 类似于 HTML但不是完全一样。参考 [JSX 陷阱](/react/docs/jsx-gotchas-zh-CN.html) 学习关键区别。
最简单开始学习 JSX 的方法就是使用浏览器端的 `JSXTransformer`。我们强烈建议你不要在生产环境中使用它。你可以通过我们的命令行工具 [react-tools](http://npmjs.org/package/react-tools) 包来预编译你的代码。
## 没有 JSX 的 React
你完全可以选择是否使用 JSX并不是 React 必须的。你可以通过 `React.createElement` 来创建一个树。第一个参数是标签,第二个参数是一个属性对象,每三个是子节点。
```javascript
var child = React.createElement('li', null, 'Text Content');
var root = React.createElement('ul', { className: 'my-list' }, child);
React.render(root, document.body);
```
方便起见,你可以创建基于自定义组件的速记工厂方法。
```javascript
var Factory = React.createFactory(ComponentClass);
...
var root = Factory({ custom: 'prop' });
React.render(root, document.body);
```
React 已经为 HTML 标签提供内置工厂方法。
```javascript
var root = React.DOM.ul({ className: 'my-list' },
React.DOM.li(null, 'Text Content')
);
```

View File

@@ -14,7 +14,7 @@ You don't have to use JSX with React. You can just use plain JS. However, we rec
It's more familiar for casual developers such as designers.
XML has the benefit of balanced open and closing tags. This helps make large trees easier to read than function calls or object literals.
XML has the benefit of balanced opening and closing tags. This helps make large trees easier to read than function calls or object literals.
It doesn't alter the semantics of JavaScript.
@@ -29,7 +29,7 @@ var myDivElement = <div className="foo" />;
React.render(myDivElement, document.body);
```
To render a React Component, just a local variable that starts with an upper-case letter:
To render a React Component, just create a local variable that starts with an upper-case letter:
```javascript
var MyComponent = React.createClass({/*...*/});
@@ -47,7 +47,7 @@ React's JSX uses the upper vs. lower case convention to distinguish between loca
## The Transform
React JSX transforms from an XML-like syntax into native JavaScript. XML elements, attributes and children are transformed into arguments to `React.createElement`.
React JSX transforms from an XML-like syntax into native JavaScript. XML elements, attributes and children are transformed into arguments that are passed to `React.createElement`.
```javascript
var Nav;
@@ -73,6 +73,15 @@ var app = React.createElement(
);
```
JSX will infer the class's [displayName](/react/docs/component-specs.html#displayName) from the variable assignment when the displayName is undefined:
```javascript
// Input (JSX):
var Nav = React.createClass({ });
// Output (JS):
var Nav = React.createClass({displayName: "Nav", });
```
Use the [JSX Compiler](/react/jsx-compiler.html) to try out JSX and see how it
desugars into native JavaScript, and the
[HTML to JSX converter](/react/html-jsx.html) to convert your existing HTML to
@@ -87,6 +96,69 @@ If you want to use JSX, the [Getting Started](/react/docs/getting-started.html)
> ReactElement as an object literal to bypass the validation code in
> `React.createElement`.
## Namespaced Components
If you are building a component that has many children, like a form, you might end up with something with a lot of variable declarations:
```javascript
// Awkward block of variable declarations
var Form = MyFormComponent;
var FormRow = Form.Row;
var FormLabel = Form.Label;
var FormInput = Form.Input;
var App = (
<Form>
<FormRow>
<FormLabel />
<FormInput />
</FormRow>
</Form>
);
```
To make it simpler and easier, *namespaced components* let you use one component that has other components as attributes:
```javascript
var Form = MyFormComponent;
var App = (
<Form>
<Form.Row>
<Form.Label />
<Form.Input />
</Form.Row>
</Form>
);
```
To do this, you just need to create your *"sub-components"* as attributes of the main component:
```javascript
var MyFormComponent = React.createClass({ ... });
MyFormComponent.Row = React.createClass({ ... });
MyFormComponent.Label = React.createClass({ ... });
MyFormComponent.Input = React.createClass({ ... });
```
JSX will handle this properly when compiling your code.
```javascript
var App = (
React.createElement(Form, null,
React.createElement(Form.Row, null,
React.createElement(Form.Label, null),
React.createElement(Form.Input, null)
)
)
);
```
> Note:
>
> This feature is available in [v0.11](http://facebook.github.io/react/blog/2014/07/17/react-v0.11.html#jsx) and above.
## JavaScript Expressions
### Attribute Expressions

View File

@@ -0,0 +1,140 @@
---
id: jsx-in-depth-zh-CN
title: 深入 JSX
permalink: jsx-in-depth-zh-CN.html
prev: displaying-data-zh-CN.html
next: jsx-spread-zh-CN.html
---
[JSX](http://facebook.github.io/jsx/) 是一个看起来很像 XML 的 JavaScript 语法扩展。React 可以用来做简单的 JSX 句法转换。
## 为什么要用 JSX
你不需要为了 React 使用 JSX可以直接使用原生 JS。但是我们建议使用 JSX 是因为它能精确,也是常用的定义包含属性的树状结构的语法。
它对于非专职开发者比如设计师也比较熟悉。
XML 有固定的标签开启和闭合的优点。这能让复杂的树更易于阅读,优于方法调用和对象字面量的形式。
它没有修改 JavaScript 语义。
## HTML 标签对比 React 组件
React 可以渲染 HTML 标签 (strings) 或 React 组件 (classes)。
要渲染 HTML 标签,只需在 JSX 里使用小写字母开头的标签名。
```javascript
var myDivElement = <div className="foo" />;
React.render(myDivElement, document.body);
```
要渲染 React 组件,只需创建一个大写字母开头的本地变量。
```javascript
var MyComponent = React.createClass({/*...*/});
var myElement = <MyComponent someProperty={true} />;
React.render(myElement, document.body);
```
React 的 JSX 里约定分别使用首字母大、小写来区分本地组件的类和 HTML 标签。
> 注意:
>
> 由于 JSX 就是 JavaScript一些标识符像 `class` 和 `for` 不建议作为 XML
> 属性名。作为替代React DOM 使用 `className` 和 `htmlFor` 来做对应的属性。
## 转换Transform
JSX 把类 XML 的语法转成原生 JavaScriptXML 元素、属性和子节点被转换成 `React.createElement` 的参数。
```javascript
var Nav;
// 输入 (JSX):
var app = <Nav color="blue" />;
// 输出 (JS):
var app = React.createElement(Nav, {color:"blue"});
```
注意,要想使用 `<Nav />``Nav` 变量一定要在作用区间内。
JSX 也支持使用 XML 语法定义子结点:
```javascript
var Nav, Profile;
// 输入 (JSX):
var app = <Nav color="blue"><Profile>click</Profile></Nav>;
// 输出 (JS):
var app = React.createElement(
Nav,
{color:"blue"},
React.createElement(Profile, null, "click")
);
```
使用 [JSX 编译器](/react/jsx-compiler.html) 来试用 JSX 并理解它是如何转换到原生 JavaScript还有 [HTML 到 JSX 转换器](/react/html-jsx.html) 来把现有 HTML 转成 JSX。
如果你要使用 JSX这篇 [新手入门](/react/docs/getting-started.html) 教程来教你如何搭建环境。
> 注意:
>
> JSX 表达式总是会当作 ReactElement 执行。具体的实际细节可能不同。一种优化
> 的模式是把 ReactElement 当作一个行内的对象字面量形式来绕过
> `React.createElement` 里的校验代码。
## JavaScript 表达式
### 属性表达式
要使用 JavaScript 表达式作为属性值,只需把这个表达式用一对大括号 (`{}`) 包起来,不要用引号 (`""`)。
```javascript
// 输入 (JSX):
var person = <Person name={window.isLoggedIn ? window.name : ''} />;
// 输出 (JS):
var person = React.createElement(
Person,
{name: window.isLoggedIn ? window.name : ''}
);
```
### 子节点表达式
同样地JavaScript 表达式可用于描述子结点:
```javascript
// 输入 (JSX):
var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;
// 输出 (JS):
var content = React.createElement(
Container,
null,
window.isLoggedIn ? React.createElement(Nav) : React.createElement(Login)
);
```
### 注释
JSX 里添加注释很容易;它们只是 JS 表达式而已。你只需要在一个标签的子节点内(非最外层)小心地用 `{}` 包围要注释的部分。
```javascript
var content = (
<Nav>
{/* 一般注释, 用 {} 包围 */}
<Person
/* 多
注释 */
name={window.isLoggedIn ? window.name : ''} // 行尾注释
/>
</Nav>
);
```
> 注意:
>
> JSX 类似于 HTML但不完全一样。参考 [JSX 陷阱](/react/docs/jsx-gotchas-zh-CN.html) 了解主要不同。

View File

@@ -6,7 +6,7 @@ prev: jsx-in-depth.html
next: jsx-gotchas.html
---
If you know all the properties that you want to place on a component a head of time, it is easy to use JSX:
If you know all the properties that you want to place on a component ahead of time, it is easy to use JSX:
```javascript
var component = <Component foo={x} bar={y} />;
@@ -49,23 +49,4 @@ You can use this multiple times or combine it with other attributes. The specifi
## What's with the weird `...` notation?
The `...` operator (or spread operator) is already supported for [arrays in ES6](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). There is also an ES7 proposal for [Object Rest and Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread).
In fact, you can already use this in our code base as an experimental syntax:
```javascript
var oldObj = { foo: 'hello', bar: 'world' };
var newObj = { ...oldObj, foo: 'hi' };
console.log(newObj.foo); // 'hi';
console.log(newObj.bar); // 'world';
```
Merging two objects can be expressed as:
```javascript
var ab = { ...a, ...b };
```
> Note:
>
> Use the [JSX command-line tool](http://npmjs.org/package/react-tools) with the `--harmony` flag to activate the experimental ES7 syntax.
The `...` operator (or spread operator) is already supported for [arrays in ES6](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). There is also an ES7 proposal for [Object Rest and Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread). We're taking advantage of these supported and developing standards in order to provide a cleaner syntax in JSX.

View File

@@ -0,0 +1,55 @@
---
id: jsx-spread-zh-CN
title: JSX 展开属性
permalink: jsx-spread-zh-CN.html
prev: jsx-in-depth-zh-CN.html
next: jsx-gotchas-zh-CN.html
---
如果你事先知道组件需要的全部 Props属性JSX 很容易地这样写:
```javascript
var component = <Component foo={x} bar={y} />;
```
## 修改 Props 是不好的,明白吗
如果你不知道要设置哪些 Props那么现在最好不要设置它
```javascript
var component = <Component />;
component.props.foo = x; // 不好
component.props.bar = y; // 同样不好
```
这样是反模式,因为 React 不能帮你检查属性类型propTypes。这样即使你的 属性类型有错误也不能得到清晰的错误提示。
Props 应该被当作禁止修改的。修改 props 对象可能会导致预料之外的结果,所以最好不要去修改 props 对象。
## 展开属性Spread Attributes
现在你可以使用 JSX 的新特性 - 展开属性:
```javascript
var props = {};
props.foo = x;
props.bar = y;
var component = <Component {...props} />;
```
传入对象的属性会被复制到组件内。
它能被多次使用,也可以和其它属性一起用。注意顺序很重要,后面的会覆盖掉前面的。
```javascript
var props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'
```
## 这个奇怪的 `...` 标记是什么?
这个 `...` 操作符(增强的操作符)已经被 [ES6 数组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) 支持。相关的还有 ES7 规范草案中的 [Object 剩余和展开属性Rest and Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread)。我们利用了这些还在制定中标准中已经被支持的特性来使 JSX 拥有更优雅的语法。

View File

@@ -46,7 +46,7 @@ You can use mixed arrays with strings and JSX elements.
<div>{['First ', <span>&middot;</span>, ' Second']}</div>
```
As a last resort, you always have the ability to insert raw HTML.
As a last resort, you always have the ability to [insert raw HTML](/react/tips/dangerously-set-inner-html.html).
```javascript
<div dangerouslySetInnerHTML={{'{{'}}__html: 'First &middot; Second'}} />

View File

@@ -0,0 +1,67 @@
---
id: jsx-gotchas-zh-CN
title: JSX 陷阱
permalink: jsx-gotchas-zh-CN.html
prev: jsx-spread-zh-CN.html
next: interactivity-and-dynamic-uis-zh-CN.html
---
JSX 与 HTML 非常相似,但是有些关键区别要注意。
> 注意:
>
> 关于 DOM 的区别,如行内样式属性 `style`,参考 [DOM 区别](/react/docs/dom-differences.html)
## HTML 实体
HTML 实体可以插入到 JSX 的文本中。
```javascript
<div>First &middot; Second</div>
```
如果想在 JSX 表达式中显示 HTML 实体,可以会遇到二次转义的问题,因为 React 默认会转义所有字符串,为了防止各种 XSS 攻击。
```javascript
// 错误: 会显示 “First &middot; Second”
<div>{'First &middot; Second'}</div>
```
有多种绕过的方法。最简单的是直接用 Unicode 字符。这时要确保文件是 UTF-8 编码且网页也指定为 UTF-8 编码。
```javascript
<div>{'First · Second'}</div>
```
安全的做法是先找到 [实体的 Unicode 编号](http://www.fileformat.info/info/unicode/char/b7/index.htm) ,然后在 JavaScript 字符串里使用。
```javascript
<div>{'First \u00b7 Second'}</div>
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
```
可以在数组里混合使用字符串和 JSX 元素。
```javascript
<div>{['First ', <span>&middot;</span>, ' Second']}</div>
```
万不得已,可以直接使用原始 HTML。
```javascript
<div dangerouslySetInnerHTML={{'{{'}}__html: 'First &middot; Second'}} />
```
## 自定义 HTML 属性
如果往原生 HTML 元素里传入 HTML 规范里不存在的属性React 不会显示它们。如果需要使用自定义属性,要加 `data-` 前缀。
```javascript
<div data-custom-attribute="foo" />
```
`aria-` 开头的 [网络无障碍] 属性可以正常使用。
```javascript
<div aria-hidden={true} />
```

View File

@@ -45,9 +45,9 @@ If you'd like to use React on a touch device such as a phone or tablet, simply c
## Under the Hood: Autobinding and Event Delegation
Under the hood React does a few things to keep your code performant and easy to understand.
Under the hood, React does a few things to keep your code performant and easy to understand.
**Autobinding:** When creating callbacks in JavaScript you usually need to explicitly bind a method to its instance such that the value of `this` is correct. With React, every method is automatically bound to its component instance. React caches the bound method such that it's extremely CPU and memory efficient. It's also less typing!
**Autobinding:** When creating callbacks in JavaScript, you usually need to explicitly bind a method to its instance such that the value of `this` is correct. With React, every method is automatically bound to its component instance. React caches the bound method such that it's extremely CPU and memory efficient. It's also less typing!
**Event delegation:** React doesn't actually attach event handlers to the nodes themselves. When React starts up, it starts listening for all events at the top level using a single event listener. When a component is mounted or unmounted, the event handlers are simply added or removed from an internal mapping. When an event occurs, React knows how to dispatch it using this mapping. When there are no event handlers left in the mapping, React's event handlers are simple no-ops. To learn more about why this is fast, see [David Walsh's excellent blog post](http://davidwalsh.name/event-delegate).
@@ -83,4 +83,4 @@ A common pattern is to create several stateless components that just render data
* **Computed data:** Don't worry about precomputing values based on state — it's easier to ensure that your UI is consistent if you do all computation within `render()`. For example, if you have an array of list items in state and you want to render the count as a string, simply render `this.state.listItems.length + ' list items'` in your `render()` method rather than storing it on state.
* **React components:** Build them in `render()` based on underlying props and state.
* **Duplicated data from props:** Try to use props as the source of truth where possible. Because props can change over time, it's appropriate to store props in state to be able to know its previous values.
* **Duplicated data from props:** Try to use props as the source of truth where possible. One valid use to store props in state is to be able to know its previous values, because props can change over time.

View File

@@ -0,0 +1,86 @@
---
id: interactivity-and-dynamic-uis-zh-CN
title: 动态交互式用户界面
permalink: interactivity-and-dynamic-uis-zh-CN.html
prev: jsx-gotchas-zh-CN.html
next: multiple-components-zh-CN.html
---
我们已经学习如何使用 React [显示数据](/react/docs/displaying-data-zh-CN.html)。现在让我们来学习如何创建交互式界面。
## 简单例子
```javascript
var LikeButton = React.createClass({
getInitialState: function() {
return {liked: false};
},
handleClick: function(event) {
this.setState({liked: !this.state.liked});
},
render: function() {
var text = this.state.liked ? 'like' : 'haven\'t liked';
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle.
</p>
);
}
});
React.render(
<LikeButton />,
document.getElementById('example')
);
```
## 事件处理与合成事件Synthetic Events
React 里只需把事件处理器event handler以骆峰命名camelCased形式当作组件的 props 传入即可,就像使用普通 HTML 那样。React 内部创建一套合成事件系统来使所有事件在 IE8 和以上浏览器表现一致。也就是说React 知道如何冒泡和捕获事件,而且你的事件处理器接收到的 events 参数与 [W3C 规范](http://www.w3.org/TR/DOM-Level-3-Events/) 一致,无论你使用哪种浏览器。
如果需要在手机或平板等触摸设备上使用 React需要调用 `React.initializeTouchEvents(true);` 启用触摸事件处理。
## 幕后原理自动绑定Autobinding和事件代理Event Delegation
在幕后React 做了一些操作来让代码高效运行且易于理解。
**Autobinding:** 在 JavaScript 里创建回调的时候,为了保证 `this` 的正确性,一般都需要显式地绑定方法到它的实例上。有了 React所有方法被自动绑定到了它的组件实例上。React 还缓存这些绑定方法,所以 CPU 和内存都是非常高效。而且还能减少打字!
**事件代理 ** React 实际并没有把事件处理器绑定到节点本身。当 React 启动的时候它在最外层使用唯一一个事件监听器处理所有事件。当组件被加载和卸载时只是在内部映射里添加或删除事件处理器。当事件触发React 根据映射来决定如何分发。当映射里处理器时,会当作空操作处理。参考 [David Walsh 很棒的文章](http://davidwalsh.name/event-delegate) 了解这样做高效的原因。
## 组件其实是状态机State Machines
React 把用户界面当作简单状态机。把用户界面想像成拥有不同状态然后渲染这些状态,可以轻松让用户界面和数据保持一致。
React 里,只需更新组件的 state然后根据新的 state 重新渲染用户界面(不要操作 DOM。React 来决定如何最高效地更新 DOM。
## State 工作原理
常用的通知 React 数据变化的方法是调用 `setState(data, callback)`。这个方法会合并merge `data``this.state`,并重新渲染组件。渲染完成后,调用可选的 `callback` 回调。大部分情况下不需要提供 `callback`,因为 React 会负责把界面更新到最新状态。
## 哪些组件应该有 State
大部分组件的工作应该是从 `props` 里取数据并渲染出来。但是,有时需要对用户输入、服务器请求或者时间变化等作出响应,这时才需要使用 State。
** 尝试把尽可能多的组件无状态化。** 这样做能隔离 state把它放到最合理的地方也能减少冗余并同时易于解释程序运作过程。
常用的模式是创建多个只负责渲染数据的无状态stateless组件在它们的上层创建一个有状态stateful组件并把它的状态通过 `props` 传给子级。这个有状态的组件封装了所有用户的交互逻辑,而这些无状态组件则负责声明式地渲染数据。
## 哪些 *应该* 作为 State
**State 应该包括那些可能被组件的事件处理器改变并触发用户界面更新的数据。** 真实的应用中这种数据一般都很小且能被 JSON 序列化。当创建一个状态化的组件时,想象一下表示它的状态最少需要哪些数据,并只把这些数据存入 `this.state`。在 `render()` 里再根据 state 来计算你需要的其它数据。你会发现以这种方式思考和开发程序最终往往是正确的,因为如果在 state 里添加冗余数据或计算所得数据,需要你经常手动保持数据同步,不能让 React 来帮你处理。
## 哪些 *不应该* 作为 State
`this.state` 应该仅包括能表示用户界面状态所需的最少数据。因些,它不应该包括:
* **计算所得数据:** 不要担心根据 state 来预先计算数据 —— 把所有的计算都放到 `render()` 里更容易保证用户界面和数据的一致性。例如,在 state 里有一个数组listItems我们要把数组长度渲染成字符串 直接在 `render()` 里使用 `this.state.listItems.length + ' list items'` 比把它放到 state 里好的多。
* **React 组件:** 在 `render()` 里使用当前 props 和 state 来创建它。
* **基于 props 的重复数据:** 尽可能使用 props 来作为惟一数据来源。把 props 保存到 state 的一个有效的场景是需要知道它以前值的时候,因为未来的 props 可能会变化。

View File

@@ -171,26 +171,7 @@ var MyComponent = React.createClass({
});
```
You can also key children by passing an object. The object keys will be used as `key` for each value. However it is important to remember that JavaScript does not guarantee the ordering of properties will be preserved. In practice browsers will preserve property order **except** for properties that can be parsed as a 32-bit unsigned integers. Numeric properties will be ordered sequentially and before other properties. If this happens React will render components out of order. This can be avoided by adding a string prefix to the key:
```javascript
render: function() {
var items = {};
this.props.results.forEach(function(result) {
// If result.id can look like a number (consider short hashes), then
// object iteration order is not guaranteed. In this case, we add a prefix
// to ensure the keys are strings.
items['result-' + result.id] = <li>{result.text}</li>;
});
return (
<ol>
{items}
</ol>
);
}
```
You can also key children by passing a ReactFragment object. See [Keyed Fragments](create-fragment.html) for more details.
## Data Flow

View File

@@ -0,0 +1,204 @@
---
id: multiple-components-zh-CN
title: 复合组件
permalink: multiple-components-zh-CN.html
prev: interactivity-and-dynamic-uis-zh-CN.html
next: reusable-components-zh-CN.html
---
目前为止,我们已经学了如何用单个组件来展示数据和处理用户输入。下一步让我们来体验 React 最激动人心的特性之一可组合性composability
## 动机:关注分离
通过复用那些接口定义良好的组件来开发新的模块化组件,我们得到了与使用函数和类相似的好处。具体来说就是能够通过开发简单的组件把程序的*不同关注面分离*。如果为程序开发一套自定义的组件库,那么就能以最适合业务场景的方式来展示你的用户界面。
## 组合实例
一起来使用 Facebook Graph API 开发显示个人图片和用户名的简单 Avatar 组件吧。
```javascript
var Avatar = React.createClass({
render: function() {
return (
<div>
<ProfilePic username={this.props.username} />
<ProfileLink username={this.props.username} />
</div>
);
}
});
var ProfilePic = React.createClass({
render: function() {
return (
<img src={'http://graph.facebook.com/' + this.props.username + '/picture'} />
);
}
});
var ProfileLink = React.createClass({
render: function() {
return (
<a href={'http://www.facebook.com/' + this.props.username}>
{this.props.username}
</a>
);
}
});
React.render(
<Avatar username="pwh" />,
document.getElementById('example')
);
```
## 从属关系
上面例子中,`Avatar` 拥有 `ProfilePic``ProfileLink` 的实例。`拥有者` 就是给其它组件设置 `props` 的那个组件。更正式地说,
如果组件 `Y``render()` 方法是创建了组件 `X`,那么 `Y` 就拥有 `X`。上面讲过,组件不能修改自身的 `props` - 它们总是与它们拥有者设置的保持一致。这是保持用户界面一致性的关键性原则。
把从属关系与父子关系加以区别至关重要。从属关系是 React 特有的而父子关系简单来讲就是DOM 里的标签的关系。在上一个例子中,`Avatar` 拥有 `div``ProfilePic``ProfileLink` 实例,`div``ProfilePic``ProfileLink` 实例的**父级**(但不是拥有者)。
## 子级
实例化 React 组件时你可以在开始标签和结束标签之间引用在React 组件或者Javascript 表达式:
```javascript
<Parent><Child /></Parent>
```
`Parent` 能通过专门的 `this.props.children` props 读取子级。**`this.props.children` 是一个不透明的数据结构:** 通过 [React.Children 工具类](/react/docs/top-level-api.html#react.children) 来操作。
### 子级校正Reconciliation
**校正就是每次 render 方法调用后 React 更新 DOM 的过程。** 一般情况下,子级会根据它们被渲染的顺序来做校正。例如,下面代码描述了两次渲染的过程:
```html
// 第一次渲染
<Card>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</Card>
// 第二次渲染
<Card>
<p>Paragraph 2</p>
</Card>
```
直观来看,只是删除了`<p>Paragraph 1</p>`。事实上React 先更新第一个子级的内容然后删除最后一个组件。React 是根据子级的*顺序*来校正的。
### 子组件状态管理
对于大多数组件,这没什么大碍。但是,对于使用 `this.state` 来在多次渲染过程中里维持数据的状态化组件,这样做潜在很多问题。
多数情况下,可以通过隐藏组件而不是删除它们来绕过这些问题。
```html
// 第一次渲染
<Card>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</Card>
// 第二次渲染
<Card>
<p style={{'{{'}}display: 'none'}}>Paragraph 1</p>
<p>Paragraph 2</p>
</Card>
```
### 动态子级
如果子组件位置会改变(如在搜索结果中)或者有新组件添加到列表开头(如在流中)情况会变得更加复杂。如果子级要在多个渲染阶段保持自己的特征和状态,在这种情况下,你可以通过给子级设置惟一标识的 `key` 来区分。
```javascript
render: function() {
var results = this.props.results;
return (
<ol>
{results.map(function(result) {
return <li key={result.id}>{result.text}</li>;
})}
</ol>
);
}
```
当 React 校正带有 key 的子级时,它会确保它们被重新排序(而不是破坏)或者删除(而不是重用)。
`务必``key` 添加到子级数组里组件本身上,而不是每个子级内部最外层 HTML 上:
```javascript
// 错误!
var ListItemWrapper = React.createClass({
render: function() {
return <li key={this.props.data.id}>{this.props.data.text}</li>;
}
});
var MyComponent = React.createClass({
render: function() {
return (
<ul>
{this.props.results.map(function(result) {
return <ListItemWrapper data={result}/>;
})}
</ul>
);
}
});
// 正确 :)
var ListItemWrapper = React.createClass({
render: function() {
return <li>{this.props.data.text}</li>;
}
});
var MyComponent = React.createClass({
render: function() {
return (
<ul>
{this.props.results.map(function(result) {
return <ListItemWrapper key={result.id} data={result}/>;
})}
</ul>
);
}
});
```
也可以传递 object 来做有 key 的子级。object 的 key 会被当作每个组件的 `key`。但是一定要牢记 JavaScript 并不总是保证属性的顺序会被保留。实际情况下浏览器一般会保留属性的顺序,**除了** 使用 32位无符号数字做为 key 的属性。数字型属性会按大小排序并且排在其它属性前面。一旦发生这种情况React 渲染组件的顺序就是混乱。可能在 key 前面加一个字符串前缀来避免:
```javascript
render: function() {
var items = {};
this.props.results.forEach(function(result) {
// 如果 result.id 看起来是一个数字(比如短哈希),那么
// 对象字面量的顺序就得不到保证。这种情况下,需要添加前缀
// 来确保 key 是字符串。
items['result-' + result.id] = <li>{result.text}</li>;
});
return (
<ol>
{items}
</ol>
);
}
```
## 数据流
React 里,数据通过上面介绍过的 `props` 从拥有者流向归属者。这就是高效的单向数据绑定(one-way data binding):拥有者通过它的 `props``state` 计算出一些值,并把这些值绑定到它们拥有的组件的 props 上。因为这个过程会递归地调用,所以数据变化会自动在所有被使用的地方自动反映出来。
## 性能提醒
你或许会担心如果一个拥有者有大量子级时,对于数据变化做出响应非常耗费性能。值得庆幸的是执行 JavaScript 非常的快,而且 `render()` 方法一般比较简单,所以在大部分应用里这样做速度极快。此外,性能的瓶颈大多是因为 DOM 更新,而非 JS 执行,而且 React 会通过批量更新和变化检测来优化性能。
但是,有时候需要做细粒度的性能控制。这种情况下,可以重写 `shouldComponentUpdate()` 方法返回 false 来让 React 跳过对子树的处理。参考 [React reference docs](/react/docs/component-specs.html) 了解更多。
> 注意:
>
> 如果在数据变化时让 `shouldComponentUpdate()` 返回 falseReact 就不能保证用户界面同步。当使用它的时候一定确保你清楚到底做了什么,并且只在遇到明显性能问题的时候才使用它。不要低估 JavaScript 的速度DOM 操作通常才是慢的原因。

View File

@@ -25,12 +25,12 @@ React.createClass({
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// Anything that can be rendered: numbers, strings, components or an array
// Anything that can be rendered: numbers, strings, elements or an array
// containing these types.
optionalRenderable: React.PropTypes.renderable,
optionalNode: React.PropTypes.node,
// A React component.
optionalComponent: React.PropTypes.component,
// A React element.
optionalElement: React.PropTypes.element,
// You can also declare that a prop is an instance of a class. This uses
// JS's instanceof operator.
@@ -120,13 +120,13 @@ React.render(
## Single Child
With `React.PropTypes.component` you can specify that only a single child can be passed to
With `React.PropTypes.element` you can specify that only a single child can be passed to
a component as children.
```javascript
var MyComponent = React.createClass({
propTypes: {
children: React.PropTypes.component.isRequired
children: React.PropTypes.element.isRequired
},
render: function() {
@@ -187,3 +187,48 @@ React.render(
A nice feature of mixins is that if a component is using multiple mixins and several mixins define the same lifecycle method (i.e. several mixins want to do some cleanup when the component is destroyed), all of the lifecycle methods are guaranteed to be called. Methods defined on mixins run in the order mixins were listed, followed by a method call on the component.
## ES6 Classes
You may also define your React classes as a plain JavaScript class. For example using ES6 class syntax:
```javascript
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
React.render(<HelloMessage name="Sebastian" />, mountNode);
```
The API is similar to `React.createClass` with the exception of `getInitialState`. Instead of providing a separate `getInitialState` method, you set up your own `state` property in the constructor.
Another difference is that `propTypes` and `defaultProps` are defined as properties on the constructor instead of in the class body.
```javascript
export class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
}
tick() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div onClick={this.tick.bind(this)}>
Clicks: {this.state.count}
</div>
);
}
}
Counter.propTypes = { initialCount: React.PropTypes.number };
Counter.defaultProps = { initialCount: 0 };
```
### No Autobinding
Methods follow the same semantics as regular ES6 classes, meaning that they don't automatically bind `this` to the instance. You'll have to explicitly use `.bind(this)` or arrow functions.
### No Mixins
Unfortunately ES6 launched without any mixin support. Therefore, there is no support for mixins when you use React with ES6 classes. Instead, we're working on making it easier to support such use cases without resorting to mixins.

View File

@@ -0,0 +1,183 @@
---
id: reusable-components-zh-CN
title: 可复用组件
permalink: reusable-components-zh-CN.html
prev: multiple-components-zh-CN.html
next: transferring-props-zh-CN.html
---
设计接口的时候,把通用的设计元素(按钮,表单框,布局组件等)拆成接口良好定义的可复用的组件。这样,下次开发相同界面程序时就可以写更少的代码,也意义着更高的开发效率,更少的 Bug 和更少的程序体积。
## Prop 验证
随着应用不断变大,保证组件被正确使用变得非常有用。为此我们引入 `propTypes``React.PropTypes` 提供很多验证器 (validator) 来验证传入数据的有效性。当向 props 传入无效数据时JavaScript 控制台会抛出警告。注意为了性能考虑,只在开发环境验证 `propTypes`。下面用例子来说明不同验证器的区别:
```javascript
React.createClass({
propTypes: {
// 可以声明 prop 为指定的 JS 基本类型。默认
// 情况下,这些 prop 都是可传可不传的。
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// 所有可以被渲染的对象:数字,
// 字符串DOM 元素或包含这些类型的数组。
optionalNode: React.PropTypes.node,
// React 元素
optionalElement: React.PropTypes.element,
// 用 JS 的 instanceof 操作符声明 prop 为类的实例。
optionalMessage: React.PropTypes.instanceOf(Message),
// 用 enum 来限制 prop 只接受指定的值。
optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
// 指定的多个对象类型中的一个
optionalUnion: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
React.PropTypes.instanceOf(Message)
]),
// 指定类型组成的数组
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
// 指定类型的属性构成的对象
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
// 特定形状参数的对象
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
}),
// 以后任意类型加上 `isRequired` 来使 prop 不可空。
requiredFunc: React.PropTypes.func.isRequired,
// 不可空的任意类型
requiredAny: React.PropTypes.any.isRequired,
// 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接
// 使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
},
/* ... */
});
```
## 默认 Prop 值
React 支持以声明式的方式来定义 `props` 的默认值。
```javascript
var ComponentWithDefaultProps = React.createClass({
getDefaultProps: function() {
return {
value: 'default value'
};
}
/* ... */
});
```
当父级没有传入 props 时,`getDefaultProps()` 可以保证 `this.props.value` 有默认值,注意 `getDefaultProps` 的结果会被 *缓存*。得益于此,你可以直接使用 props而不必写手动编写一些重复或无意义的代码。
## 传递 Props小技巧
有一些常用的 React 组件只是对 HTML 做简单扩展。通常,你想少写点代码来把传入组件的 props 复制到对应的 HTML 元素上。这时 JSX 的 _spread_ 语法会帮到你:
```javascript
var CheckLink = React.createClass({
render: function() {
// 这样会把 CheckList 所有的 props 复制到 <a>
return <a {...this.props}>{'√ '}{this.props.children}</a>;
}
});
React.render(
<CheckLink href="/checked.html">
Click here!
</CheckLink>,
document.getElementById('example')
);
```
## 单个子级
`React.PropTypes.element` 可以限定只能有一个子级传入。
```javascript
var MyComponent = React.createClass({
propTypes: {
children: React.PropTypes.element.isRequired
},
render: function() {
return (
<div>
{this.props.children} // 有且仅有一个元素,否则会抛异常。
</div>
);
}
});
```
## Mixins
组件是 React 里复用代码最佳方式,但是有时一些复杂的组件间也需要共用一些功能。有时会被称为 [跨切面关注点](http://en.wikipedia.org/wiki/Cross-cutting_concern)。React 使用 `mixins` 来解决这类问题。
一个通用的场景是:一个组件需要定期更新。用 `setInterval()` 做很容易但当不需要它的时候取消定时器来节省内存是非常重要的。React 提供 [生命周期方法](/react/docs/working-with-the-browser.html#component-lifecycle) 来告知组件创建或销毁的时间。下面来做一个简单的 mixin使用 `setInterval()` 并保证在组件销毁时清理定时器。
```javascript
var SetIntervalMixin = {
componentWillMount: function() {
this.intervals = [];
},
setInterval: function() {
this.intervals.push(setInterval.apply(null, arguments));
},
componentWillUnmount: function() {
this.intervals.map(clearInterval);
}
};
var TickTock = React.createClass({
mixins: [SetIntervalMixin], // 引用 mixin
getInitialState: function() {
return {seconds: 0};
},
componentDidMount: function() {
this.setInterval(this.tick, 1000); // 调用 mixin 的方法
},
tick: function() {
this.setState({seconds: this.state.seconds + 1});
},
render: function() {
return (
<p>
React has been running for {this.state.seconds} seconds.
</p>
);
}
});
React.render(
<TickTock />,
document.getElementById('example')
);
```
关于 mixin 值得一提的优点是,如果一个组件使用了多个 mixin并用有多个 mixin 定义了同样的生命周期方法(如:多个 mixin 都需要在组件销毁时做资源清理操作),所有这些生命周期方法都保证会被执行到。方法执行顺序是:首先按 mixin 引入顺序执行 mixin 里方法,最后执行组件内定义的方法。

View File

@@ -24,7 +24,7 @@ The rest of this tutorial explains best practices. It uses JSX and experimental
## Manual Transfer
Most of the time you should explicitly pass the properties down. That ensures that you only exposes a subset of the inner API, one that you know will work.
Most of the time you should explicitly pass the properties down. That ensures that you only expose a subset of the inner API, one that you know will work.
```javascript
var FancyCheckbox = React.createClass({
@@ -37,8 +37,8 @@ var FancyCheckbox = React.createClass({
);
}
});
React.renderComponent(
<FancyCheckbox checked={true} onClick={console.log}>
React.render(
<FancyCheckbox checked={true} onClick={console.log.bind(console)}>
Hello world!
</FancyCheckbox>,
document.body
@@ -49,6 +49,10 @@ But what about the `name` prop? Or the `title` prop? Or `onMouseOver`?
## Transferring with `...` in JSX
> NOTE:
>
> In the example below, the `--harmony ` flag is required as this syntax is an experimental ES7 syntax. If using the in-browser JSX transformer, simply open your script with `<script type="text/jsx;harmony=true">`. See the [Rest and Spread Properties ...](http://facebook.github.io/react/docs/transferring-props.html#rest-and-spread-properties-...) section below for more details.
Sometimes it's fragile and tedious to pass every property along. In that case you can use [destructuring assignment](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) with rest properties to extract a set of unknown properties.
List out all the properties that you would like to consume, followed by `...other`.
@@ -70,8 +74,8 @@ var FancyCheckbox = React.createClass({
);
}
});
React.renderComponent(
<FancyCheckbox checked={true} onClick={console.log}>
React.render(
<FancyCheckbox checked={true} onClick={console.log.bind(console)}>
Hello world!
</FancyCheckbox>,
document.body

View File

@@ -0,0 +1,164 @@
---
id: transferring-props-zh-CN
title: 传递 Props
permalink: transferring-props-zh-CN.html
prev: reusable-components-zh-CN.html
next: forms-zh-CN.html
---
React 里有一个非常常用的模式就是对组件做一层抽象。组件对外公开一个简单的属性Props来实现功能但内部细节可能有非常复杂的实现。
可以使用 [JSX 展开属性](/react/docs/jsx-spread-zh-CN.html) 来合并现有的 props 和其它值:
```javascript
return <Component {...this.props} more="values" />;
```
如果不使用 JSX可以使用一些对象辅助方法如 ES6 的 `Object.assign` 或 Underscore `_.extend`
```javascript
return Component(Object.assign({}, this.props, { more: 'values' }));
```
下面的教程介绍一些最佳实践。使用了 JSX 和 ES7 的还在试验阶段的特性。
## 手动传递
大部分情况下你应该显式地向下传递 props。这样可以确保只公开你认为是安全的内部 API 的子集。
```javascript
var FancyCheckbox = React.createClass({
render: function() {
var fancyClass = this.props.checked ? 'FancyChecked' : 'FancyUnchecked';
return (
<div className={fancyClass} onClick={this.props.onClick}>
{this.props.children}
</div>
);
}
});
React.render(
<FancyCheckbox checked={true} onClick={console.log.bind(console)}>
Hello world!
</FancyCheckbox>,
document.body
);
```
`name` 这个属性怎么办?还有 `title``onMouseOver` 这些 props
## 在 JSX 里使用 `...` 传递
有时把所有属性都传下去是不安全或啰嗦的。这时可以使用 [解构赋值](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) 中的剩余属性特性来把未知属性批量提取出来。
列出所有要当前使用的属性,后面跟着 `...other`
```javascript
var { checked, ...other } = this.props;
```
这样能确保把所有 props 传下去,*除了* 那些已经被使用了的。
```javascript
var FancyCheckbox = React.createClass({
render: function() {
var { checked, ...other } = this.props;
var fancyClass = checked ? 'FancyChecked' : 'FancyUnchecked';
// `other` 包含 { onClick: console.log } 但 checked 属性除外
return (
<div {...other} className={fancyClass} />
);
}
});
React.render(
<FancyCheckbox checked={true} onClick={console.log.bind(console)}>
Hello world!
</FancyCheckbox>,
document.body
);
```
> 注意:
>
> 上面例子中,`checked` 属性也是一个有效的 DOM 属性。如果你没有使用解构赋值,那么可能无意中把它传下去。
在传递这些未知的 `other` 属性时,要经常使用解构赋值模式。
```javascript
var FancyCheckbox = React.createClass({
render: function() {
var fancyClass = this.props.checked ? 'FancyChecked' : 'FancyUnchecked';
// 反模式:`checked` 会被传到里面的组件里
return (
<div {...this.props} className={fancyClass} />
);
}
});
```
## 使用和传递同一个 Prop
如果组件需要使用一个属性又要往下传递,可以直接使用 `checked={checked}` 再传一次。这样做比传整个 `this.props` 对象要好,因为更利于重构和语法检查。
```javascript
var FancyCheckbox = React.createClass({
render: function() {
var { checked, title, ...other } = this.props;
var fancyClass = checked ? 'FancyChecked' : 'FancyUnchecked';
var fancyTitle = checked ? 'X ' + title : 'O ' + title;
return (
<label>
<input {...other}
checked={checked}
className={fancyClass}
type="checkbox"
/>
{fancyTitle}
</label>
);
}
});
```
> 注意:
>
> 顺序很重要,把 `{...other}` 放到 JSX props 前面会使它不被覆盖。上面例子中我们可以保证 input 的 type 是 `"checkbox"`。
## 剩余属性和展开属性 `...`
剩余属性可以把对象剩下的属性提取到一个新的对象。会把所有在解构赋值中列出的属性剔除。
这是 [ES7 草案](https://github.com/sebmarkbage/ecmascript-rest-spread) 中的试验特性。
```javascript
var { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }
```
> 注意:
>
> 使用 [JSX 命令行工具](http://npmjs.org/package/react-tools) 配合 `--harmony` 标记来启用 ES7 语法。
## 使用 Underscore 来传递
如果不使用 JSX可以使用一些库来实现相同效果。Underscore 提供 `_.omit` 来过滤属性,`_.extend` 复制属性到新的对象。
```javascript
var FancyCheckbox = React.createClass({
render: function() {
var checked = this.props.checked;
var other = _.omit(this.props, 'checked');
var fancyClass = checked ? 'FancyChecked' : 'FancyUnchecked';
return (
React.DOM.div(_.extend({}, other, { className: fancyClass }))
);
}
});
```

View File

@@ -87,7 +87,7 @@ If you want to initialize the component with a non-empty value, you can supply a
This example will function much like the **Controlled Components** example above.
Likewise, `<input>` supports `defaultChecked` and `<select>` supports `defaultValue`.
Likewise, `<input>` supports `defaultValue` and `<select>` supports `defaultChecked`.
## Advanced Topics

168
docs/docs/07-forms.zh-CN.md Normal file
View File

@@ -0,0 +1,168 @@
---
id: forms-zh-CN
title: 表单组件
permalink: forms-zh-CN.html
prev: transferring-props-zh-CN.html
next: working-with-the-browser-zh-CN.html
---
诸如 `<input>``<textarea>``<option>` 这样的表单组件不同于其他组件,因为他们可以通过用户交互发生变化。这些组件提供的界面使响应用户交互的表单数据处理更加容易。
关于 `<form>` 事件详情请查看 [表单事件](/react/docs/events-zh-CN.html#form-events)。
## 交互属性
表单组件支持几个受用户交互影响的属性:
* `value`,用于 `<input>``<textarea>` 组件。
* `checked`,用于类型为 `checkbox` 或者 `radio``<input>` 组件。
* `selected`,用于 `<option>` 组件。
在 HTML 中,`<textarea>` 的值通过子节点设置;在 React 中则应该使用 `value` 代替。
表单组件可以通过 `onChange` 回调函数来监听组件变化。当用户做出以下交互时,`onChange` 执行并通过浏览器做出响应:
* `<input>``<textarea>``value` 发生变化时。
* `<input>``checked` 状态改变时。
* `<option>``selected` 状态改变时。
和所有 DOM 事件一样,所有的 HTML 原生组件都支持 `onChange` 属性,而且可以用来监听冒泡的 `change` 事件。
## 受限组件
设置了 `value``<input>` 是一个*受限*组件。 对于受限的 `<input>`,渲染出来的 HTML 元素始终保持 `value` 属性的值。例如:
```javascript
render: function() {
return <input type="text" value="Hello!" />;
}
```
上面的代码将渲染出一个值为 `Hello!` 的 input 元素。用户在渲染出来的元素里输入任何值都不起作用,因为 React 已经赋值为 `Hello!`。如果想响应更新用户输入的值,就得使用 `onChange` 事件:
```javascript
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
var value = this.state.value;
return <input type="text" value={value} onChange={this.handleChange} />;
}
```
上面的代码中React 将用户输入的值更新到 `<input>` 组件的 `value` 属性。这样实现响应或者验证用户输入的界面就很容易了。例如:
```javascript
handleChange: function(event) {
this.setState({value: event.target.value.substr(0, 140)});
}
```
上面的代码接受用户输入,并截取前 140 个字符。
## 不受限组件
没有设置 `value`(或者设为 `null`) 的 `<input>` 组件是一个*不受限*组件。对于不受限的 `<input>` 组件,渲染出来的元素直接反应用户输入。例如:
```javascript
render: function() {
return <input type="text" />;
}
```
上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受限元素一样,使用 `onChange` 事件可以监听值的变化。
如果想给组件设置一个非空的初始值,可以使用 `defaultValue` 属性。例如:
```javascript
render: function() {
return <input type="text" defaultValue="Hello!" />;
}
```
上面的代码渲染出来的元素和**受限组件**一样有一个初始值,但这个值用户可以改变并会反应到界面上。
同样地, 类型为 `radio``checkbox``<input>` 支持 `defaultChecked` 属性, `<select>` 支持 `defaultValue` 属性。
```javascript
render: function() {
return (
<div>
<input type="radio" name="opt" defaultChecked /> Option 1
<input type="radio" name="opt" /> Option 2
<select defaultValue="C">
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
</div>
);
}
```
## 高级主题
### 为什么使用受限组件?
在 React 中使用诸如 `<input>` 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。
比如下面的代码:
```html
<input type="text" name="title" value="Untitled" />
```
在 HTML 中将渲染初始值为 `Untitled` 的输入框。用户改变输入框的值时,节点的 `value` 属性(*property*)将随之变化,但是 `node.getAttribute('value')` 还是会返回初始设置的值 `Untitled`.
与 HTML 不同React 组件必须在任何时间点描绘视图的状态,而不仅仅是在初始化时。比如在 React 中:
```javascript
render: function() {
return <input type="text" name="title" value="Untitled" />;
}
```
该方法在任何时间点渲染组件以后,输入框的值就应该*始终*为 `Untitled`
### 为什么 `<textarea>` 使用 `value` 属性?
在 HTML 中, `<textarea>` 的值通常使用子节点设置:
```html
<!-- 反例:在 React 中不要这样使用! -->
<textarea name="description">This is the description.</textarea>
```
对 HTML 而言让开发者设置多行的值很容易。但是React 是 JavaScript没有字符限制可以使用 `\n` 实现换行。简言之React 已经有 `value``defaultValue` 属性,`</textarea>` 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置 `<textarea>` 值时不应该使用子节点:
```javascript
<textarea name="description" value="This is a description." />
```
如果*非要**使用子节点,效果和使用 `defaultValue` 一样。
### 为什么 `<select>` 使用 `value` 属性
HTML 中 `<select>` 通常使用 `<option>``selected` 属性设置选中状态React 为了更方面的控制组件,采用以下方式代替:
```javascript
<select value="B">
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
```
如果是不受限组件,则使用 `defaultValue`
> 注意:
>
> 给 `value` 属性传递一个数组,可以选中多个选项:`<select multiple={true} value={['B', 'C']}>`。

View File

@@ -18,13 +18,13 @@ Additionally, React implements a full synthetic event system such that all event
Most of the time you should stay within React's "faked browser" world since it's more performant and easier to reason about. However, sometimes you simply need to access the underlying API, perhaps to work with a third-party library like a jQuery plugin. React provides escape hatches for you to use the underlying DOM API directly.
## Refs and getDOMNode()
## Refs and findDOMNode()
To interact with the browser, you'll need a reference to a DOM node. Every mounted React component has a `getDOMNode()` function which you can call to get a reference to it.
To interact with the browser, you'll need a reference to a DOM node. React has a `React.findDOMNode(component)` function which you can call to get a reference to the component's DOM node.
> Note:
>
> `getDOMNode()` only works on mounted components (that is, components that have been placed in the DOM). If you try to call this on a component that has not been mounted yet (like calling `getDOMNode()` in `render()` on a component that has yet to be created) an exception will be thrown.
> `findDOMNode()` only works on mounted components (that is, components that have been placed in the DOM). If you try to call this on a component that has not been mounted yet (like calling `findDOMNode()` in `render()` on a component that has yet to be created) an exception will be thrown.
In order to get a reference to a React component, you can either use `this` to get the current React component, or you can use refs to refer to a component you own. They work like this:
@@ -32,7 +32,7 @@ In order to get a reference to a React component, you can either use `this` to g
var MyComponent = React.createClass({
handleClick: function() {
// Explicitly focus the text input using the raw DOM API.
this.refs.myTextInput.getDOMNode().focus();
React.findDOMNode(this.refs.myTextInput).focus();
},
render: function() {
// The ref attribute adds a reference to the component to
@@ -97,7 +97,7 @@ React provides lifecycle methods that you can specify to hook into this process.
_Mounted_ composite components also support the following methods:
* `getDOMNode(): DOMElement` can be invoked on any mounted component in order to obtain a reference to its rendered DOM node.
* `findDOMNode(): DOMElement` can be invoked on any mounted component in order to obtain a reference to its rendered DOM node.
* `forceUpdate()` can be invoked on any mounted component when you know that some deeper aspect of the component's state has changed without using `this.setState()`.

View File

@@ -65,7 +65,7 @@ In this counterexample, the `<input />` is merely a *description* of an `<input
So how do we talk to the *real* backing instance of the input?
## The ref Attribute
## The ref String Attribute
React supports a very special property that you can attach to any component that is output from `render()`. This special property allows you to refer to the corresponding **backing instance** of anything returned from `render()`. It is always guaranteed to be the proper instance, at any point in time.
@@ -83,7 +83,19 @@ It's as simple as:
this.refs.myInput
```
You can access the component's DOM node directly by calling `this.refs.myInput.getDOMNode()`.
You can access the component's DOM node directly by calling `React.findDOMNode(this.refs.myInput)`.
## The ref Callback Attribute
The `ref` attribute can be a callback function instead of a name. This callback will be executed immediately after the component is mounted. The referenced component will be passed in as a parameter, and the callback function may use the component immediately, or save the reference for future use (or both).
It's as simple as assigning a `ref` attribute to anything returned from `render` such as:
```html
<input ref={ function(component){ React.findDOMNode(component).focus();} } />
```
## Completing the Example
@@ -99,7 +111,7 @@ It's as simple as:
// Clear the input
this.setState({userInput: ''}, function() {
// This code executes after the component is re-rendered
this.refs.theInput.getDOMNode().focus(); // Boom! Focused!
React.findDOMNode(this.refs.theInput).focus(); // Boom! Focused!
});
},
render: function() {
@@ -129,7 +141,7 @@ Refs are a great way to send a message to a particular child instance in a way t
### Benefits:
- You can define any public method on your component classes (such as a reset method on a Typeahead) and call those public methods through refs (such as `this.refs.myTypeahead.reset()`).
- Performing DOM measurements almost always requires reaching out to a "native" component such as `<input />` and accessing its underlying DOM node via `this.refs.myInput.getDOMNode()`. Refs are one of the only practical ways of doing this reliably.
- Performing DOM measurements almost always requires reaching out to a "native" component such as `<input />` and accessing its underlying DOM node via `React.findDOMNode(this.refs.myInput)`. Refs are one of the only practical ways of doing this reliably.
- Refs are automatically book-kept for you! If that child is destroyed, its ref is also destroyed for you. No worrying about memory here (unless you do something crazy to retain a reference yourself).
### Cautions:

View File

@@ -32,7 +32,11 @@ If you like using JSX, we provide an in-browser JSX transformer for development
### Productionizing: Precompiled JSX
If you have [npm](http://npmjs.org/), you can simply run `npm install -g react-tools` to install our command-line `jsx` tool. This tool will translate files that use JSX syntax to plain JavaScript files that can run directly in the browser. It will also watch directories for you and automatically transform files when they are changed; for example: `jsx --watch src/ build/`. Run `jsx --help` for more information on how to use this tool.
If you have [npm](http://npmjs.org/), you can simply run `npm install -g react-tools` to install our command-line `jsx` tool. This tool will translate files that use JSX syntax to plain JavaScript files that can run directly in the browser. It will also watch directories for you and automatically transform files when they are changed; for example: `jsx --watch src/ build/`.
By default JSX files with a `.js` extension are transformed. Use `jsx --extension jsx src/ build/` to transform files with a `.jsx` extension.
Run `jsx --help` for more information on how to use this tool.
### Helpful Open-Source Projects

View File

@@ -10,14 +10,15 @@ next: animation.html
- [`TransitionGroup` and `CSSTransitionGroup`](animation.html), for dealing with animations and transitions that are usually not simple to implement, such as before a component's removal.
- [`LinkedStateMixin`](two-way-binding-helpers.html), to simplify the coordination between user's form input data and the component's state.
- [`classSet`](class-name-manipulation.html), for manipulating the DOM `class` string a bit more cleanly.
- [`TestUtils`](test-utils.html), simple helpers for writing test cases (unminified build only).
- [`cloneWithProps`](clone-with-props.html), to make shallow copies of React components and change their props.
- [`createFragment`](create-fragment.html), to create a set of externally-keyed children.
- [`update`](update.html), a helper function that makes dealing with immutable data in JavaScript easier.
- [`PureRenderMixin`](pure-render-mixin.html), a performance booster under certain situations.
- (DEPRECATED) [`classSet`](class-name-manipulation.html), for manipulating the DOM `class` string a bit more cleanly.
The add-ons below are in the development (unminified) version of React only:
- [`PureRenderMixin`](pure-render-mixin.html), a performance booster under certain situations.
- [`TestUtils`](test-utils.html), simple helpers for writing test cases (unminified build only).
- [`Perf`](perf.html), for measuring performance and giving you hint where to optimize.
To get the add-ons, use `react-with-addons.js` (and its minified counterpart) rather than the common `react.js`.

View File

@@ -141,7 +141,7 @@ You can disable animating `enter` or `leave` animations if you want. For example
## Low-level API: `ReactTransitionGroup`
`ReactTransitionGroup` is the basis for animations. When children are declaratively added or removed from it (as in the example above) special lifecycle hooks are called on them.
`ReactTransitionGroup` is the basis for animations. It is accessible as `React.addons.TransitionGroup`. When children are declaratively added or removed from it (as in the example above) special lifecycle hooks are called on them.
### `componentWillEnter(callback)`
@@ -175,7 +175,7 @@ Every DOM component that React can render is available for use. However, `compon
>
> Prior to v0.12, when using DOM components, the `component` prop needed to be a reference to `React.DOM.*`. Since the component is simply passed to `React.createElement`, it must now be a string. Composite components must pass the factory.
Any additional, user-defined, properties will be become properties of the rendered component. For example, here's how you would you render a `<ul>` with css class:
Any additional, user-defined, properties will become properties of the rendered component. For example, here's how you would render a `<ul>` with css class:
```javascript{1}
<ReactTransitionGroup component="ul" className="animated-list">

View File

@@ -6,6 +6,10 @@ prev: two-way-binding-helpers.html
next: test-utils.html
---
> NOTE:
>
> This module now exists independently at [JedWatson/classnames](https://github.com/JedWatson/classnames) and is React-agnostic. The add-on here will thus be removed in the future.
`classSet()` is a neat utility for easily manipulating the DOM `class` string.
Here's a common scenario and its solution without `classSet()`:
@@ -42,4 +46,17 @@ render: function() {
When using `classSet()`, pass an object with keys of the CSS class names you might or might not need. Truthy values will result in the key being a part of the resulting string.
`classSet()` also lets pass class names in as arguments that are then concatenated for you:
```javascript
render: function() {
var cx = React.addons.classSet;
var importantModifier = 'message-important';
var readModifier = 'message-read';
var classes = cx('message', importantModifier, readModifier);
// Final string is 'message message-important message-read'
return <div className={classes}>Great, I'll be there.</div>;
}
```
No more hacky string concatenations!

View File

@@ -19,9 +19,9 @@ Simulate an event dispatch on a DOM node with optional `eventData` event data. *
Example usage:
```javascript
var node = this.refs.input.getDOMNode();
var node = React.findDOMNode(this.refs.input);
React.addons.TestUtils.Simulate.click(node);
React.addons.TestUtils.Simulate.change(node);
React.addons.TestUtils.Simulate.change(node, {target: {value: 'Hello, world'}});
React.addons.TestUtils.Simulate.keyDown(node, {key: "Enter"});
```
@@ -43,6 +43,14 @@ object mockComponent(function componentClass, string? mockTagName)
Pass a mocked component module to this method to augment it with useful methods that allow it to be used as a dummy React component. Instead of rendering as usual, the component will become a simple `<div>` (or other tag if `mockTagName` is provided) containing any provided children.
### isElement
```javascript
boolean isElement(ReactElement element)
```
Returns true if `element` is any ReactElement.
### isElementOfType
```javascript
@@ -73,15 +81,7 @@ Returns true if `instance` is a composite component (created with `React.createC
boolean isCompositeComponentWithType(ReactComponent instance, function componentClass)
```
The combination of `isComponentOfType()` and `isCompositeComponent()`.
### isTextComponent
```javascript
boolean isTextComponent(ReactComponent instance)
```
Returns true if `instance` is a plain text component.
Returns true if `instance` is a composite component (created with `React.createClass()`) whose type is of a React `componentClass`.
### findAllInRenderedTree
@@ -138,3 +138,46 @@ ReactComponent findRenderedComponentWithType(ReactComponent tree, function compo
```
Same as `scryRenderedComponentsWithType()` but expects there to be one result and returns that one result, or throws exception if there is any other number of matches besides one.
## Shallow rendering
Shallow rendering is an experimental feature that lets you render a component "one level deep" and assert facts about what its render method returns, without worrying about the behavior of child components, which are not instantiated or rendered. This does not require a DOM.
```javascript
ReactShallowRenderer createRenderer()
```
Call this in your tests to create a shallow renderer. You can think of this as a "place" to render the component you're testing, where it can respond to events and update itself.
```javascript
shallowRenderer.render(ReactElement element)
```
Similar to `React.render`.
```javascript
ReactComponent shallowRenderer.getRenderOutput()
```
After render has been called, returns shallowly rendered output. You can then begin to assert facts about the output. For example, if your component's render method returns:
```javascript
<div>
<span className="heading">Title</span>
<Subcomponent foo="bar" />
</div>
```
Then you can assert:
```javascript
result = renderer.getRenderOutput();
expect(result.type).toBe('div');
expect(result.props.children).toEqual([
<span className="heading">Title</span>
<Subcomponent foo="bar" />
]);
```
Shallow testing currently has some limitations, namely not supporting refs. We're releasing this feature early and would appreciate the React community's feedback on how it should evolve.

View File

@@ -1,21 +1,23 @@
---
id: clone-with-props
title: Cloning Components
title: Cloning ReactElement
permalink: clone-with-props.html
prev: test-utils.html
next: update.html
next: create-fragment.html
---
In rare situations a component may want to change the props of a component that it doesn't own (like changing the `className` of a component passed as `this.props.children`). Other times it may want to make multiple copies of a component passed to it. `cloneWithProps()` makes this possible.
In rare situations a element may want to change the props of a element that it doesn't own (like changing the `className` of a element passed as `this.props.children`). Other times it may want to make multiple copies of a element passed to it. `cloneWithProps()` makes this possible.
#### `ReactComponent React.addons.cloneWithProps(ReactComponent component, object? extraProps)`
#### `ReactElement React.addons.cloneWithProps(ReactElement element, object? extraProps)`
Do a shallow copy of `component` and merge any props provided by `extraProps`. The `className` and `style` props will be merged intelligently.
Do a shallow copy of `element` and merge any props provided by `extraProps`. The `className` and `style` props will be merged intelligently.
> Note:
>
> `cloneWithProps` does not transfer `key` to the cloned component. If you wish to preserve the key, add it to the `extraProps` object:
> `cloneWithProps` does not transfer `key` to the cloned element. If you wish to preserve the key, add it to the `extraProps` object:
>
> ```js
> var clonedComponent = cloneWithProps(originalComponent, { key : originalComponent.key });
> var clonedElement = cloneWithProps(originalElement, { key : originalElement.key });
> ```
>
> `ref` is similarly not preserved.

View File

@@ -0,0 +1,73 @@
---
id: create-fragment
title: Keyed Fragments
permalink: create-fragment.html
prev: clone-with-props.html
next: update.html
---
In most cases, you can use the `key` prop to specify keys on the elements you're returning from `render`. However, this breaks down in one situation: if you have two sets of children that you need to reorder, there's no way to put a key on each set without adding a wrapper element.
That is, if you have a component such as:
```js
var Swapper = React.createClass({
propTypes: {
// `leftChildren` and `rightChildren` can be a string, element, array, etc.
leftChildren: React.PropTypes.node,
rightChildren: React.PropTypes.node,
swapped: React.PropTypes.bool
}
render: function() {
var children;
if (this.props.swapped) {
children = [this.props.rightChildren, this.props.leftChildren];
} else {
children = [this.props.leftChildren, this.props.rightChildren];
}
return <div>{children}</div>;
}
});
```
The children will unmount and remount as you change the `swapped` prop because there aren't any keys marked on the two sets of children.
To solve this problem, you can use `React.addons.createFragment` to give keys to the sets of children.
#### `ReactFragment React.addons.createFragment(object children)`
Instead of creating arrays, we write:
```js
if (this.props.swapped) {
children = React.addons.createFragment({
right: this.props.rightChildren,
left: this.props.leftChildren
});
} else {
children = React.addons.createFragment({
left: this.props.leftChildren,
right: this.props.rightChildren
});
}
```
The keys of the passed object (that is, `left` and `right`) are used as keys for the entire set of children, and the order of the object's keys is used to determine the order of the rendered children. With this change, the two sets of children will be properly reordered in the DOM without unmounting.
The return value of `createFragment` should be treated as an opaque object; you can use the `React.Children` helpers to loop through a fragment but should not access it directly. Note also that we're relying on the JavaScript engine preserving object enumeration order here, which is not guaranteed by the spec but is implemented by all major browsers and VMs for objects with non-numeric keys.
> **Note:**
>
> In the future, `createFragment` may be replaced by an API such as
>
> ```js
> return (
> <div>
> <x:frag key="right">{this.props.rightChildren}</x:frag>,
> <x:frag key="left">{this.props.leftChildren}</x:frag>
> </div>
> );
> ```
>
> allowing you to assign keys directly in JSX without adding wrapper elements.

View File

@@ -2,7 +2,7 @@
id: update
title: Immutability Helpers
permalink: update.html
prev: clone-with-props.html
prev: create-fragment.html
next: pure-render-mixin.html
---
@@ -20,7 +20,7 @@ myData.x.y.z = 7;
myData.a.b.push(9);
```
you have no way of determining which data has changed since the previous copy is overriden. Instead, you need to create a new copy of `myData` and change only the parts of it that need to be changed. Then you can compare the old copy of `myData` with the new one in `shouldComponentUpdate()` using triple-equals:
you have no way of determining which data has changed since the previous copy is overridden. Instead, you need to create a new copy of `myData` and change only the parts of it that need to be changed. Then you can compare the old copy of `myData` with the new one in `shouldComponentUpdate()` using triple-equals:
```js
var newData = deepCopy(myData);
@@ -58,7 +58,7 @@ The `$`-prefixed keys are called *commands*. The data structure they are "mutati
* `{$push: array}` `push()` all the items in `array` on the target.
* `{$unshift: array}` `unshift()` all the items in `array` on the target.
* `{$splice: array of arrays}` for each item in `array()` call `splice()` on the target with the parameters provided by the item.
* `{$splice: array of arrays}` for each item in `arrays` call `splice()` on the target with the parameters provided by the item.
* `{$set: any}` replace the target entirely.
* `{$merge: object}` merge the keys of `object` with the target.
* `{$apply: function}` passes in the current value to the function and updates it with the new returned value.

View File

@@ -11,7 +11,7 @@ If your React component's render function is "pure" (in other words, it renders
Example:
```js
var PureRenderMixin = require('react').addons.PureRenderMixin;
var PureRenderMixin = require('react/addons').addons.PureRenderMixin;
React.createClass({
mixins: [PureRenderMixin],
@@ -25,6 +25,6 @@ Under the hood, the mixin implements [shouldComponentUpdate](/react/docs/compone
> Note:
>
> This only shallowly compares the objects. If these contain complex data structures, it may produce false-negatives for deeper differences. Only mix into components which have simple props and state, or use `forceUpdate()` when you know deep data structures have changed.
> This only shallowly compares the objects. If these contain complex data structures, it may produce false-negatives for deeper differences. Only mix into components which have simple props and state, or use `forceUpdate()` when you know deep data structures have changed. Or, consider using [immutable objects](http://facebook.github.io/immutable-js/) to facilitate fast comparisons of nested data.
>
> Furthermore, `shouldComponentUpdate` skips updates for the whole component subtree. Make sure all the children components are also "pure".

View File

@@ -3,6 +3,7 @@ id: perf
title: Performance Tools
permalink: perf.html
prev: pure-render-mixin.html
next: advanced-performance.html
---
React is usually quite fast out of the box. However, in situations where you need to squeeze every ounce of performance out of your app, it provides a [shouldComponentUpdate](/react/docs/component-specs.html#updating-shouldcomponentupdate) hook where you can add optimization hints to React's diff algorithm.

View File

@@ -0,0 +1,207 @@
---
id: advanced-performance
title: Advanced Performance
permalink: advanced-performance.html
prev: perf.html
---
One of the first questions people ask when considering React for a project is whether their application will be as fast and responsive as an equivalent non-React version. The idea of re-rendering an entire subtree of components in response to every state change makes people wonder whether this process negatively impacts performance. React uses several clever techniques to minimize the number of costly DOM operations required to update the UI.
## Avoiding reconciling the DOM
React makes use of a *virtual DOM*, which is a descriptor of a DOM subtree rendered in the browser. This parallel representation allows React to avoid creating DOM nodes and accessing existing ones, which is slower than operations on JavaScript objects. When a component's props or state change, React decides whether an actual DOM update is necessary by constructing a new virtual DOM and comparing it to the old one. Only in the case they are not equal, will React [reconcile](http://facebook.github.io/react/docs/reconciliation.html) the DOM, applying as few mutations as possible.
On top of this, React provides a component lifecycle function, `shouldComponentUpdate`, which is triggered before the re-rendering process starts, giving the developer the ability to short circuit this process. The default implementation of this function returns `true`, leaving React to perform the update:
```javascript
shouldComponentUpdate: function(nextProps, nextState) {
return true;
}
```
Keep in mind that React will invoke this function pretty often, so the implementation has to be fast.
Say you have a messaging application with several chat threads. Suppose only one of the threads has changed. If we implement `shouldComponentUpdate` on the `ChatThread` component, React can skip the rendering step for the other threads:
```javascript
shouldComponentUpdate: function(nextProps, nextState) {
// TODO: return whether or not current chat thread is
// different to former one.
}
```
So, in summary, React avoids carrying out expensive DOM operations required to reconcile subtrees of the DOM by allowing the user to short circuit the process using `shouldComponentUpdate`, and, for those which should update, by comparing virtual DOMs.
## shouldComponentUpdate in action
Here's a subtree of components. For each one is indicated what `shouldComponentUpdate` returned and whether or not the virtual DOMs were equivalent. Finally, the circle's color indicates whether the component had to be reconciled or not.
<figure><img src="/react/img/docs/should-component-update.png" /></figure>
In the example above, since `shouldComponentUpdate` returned `false` for the subtree rooted at C2, React had no need to generate the new virtual DOM, and therefore, it neither needed to reconcile the DOM. Note that React didn't even had to invoke `shouldComponentUpdate` on C4 and C5.
For C1 and C3 `shouldComponentUpdate` returned `true`, so React had to go down to the leaves and check them. For C6 it returned `true`; since the virtual DOMs weren't equivalent it had to reconcile the DOM.
The last interesting case is C8. For this node React had to compute the virtual DOM, but since it was equal to the old one, it didn't have to reconcile it's DOM.
Note that React only had to do DOM mutations for C6, which was inevitable. For C8 it bailed out by comparing the virtual DOMs, and for C2's subtree and C7, it didn't even have to compute the virtual DOM as we bailed out on `shouldComponentUpdate`.
So, how should we implement `shouldComponentUpdate`? Say that you have a component that just renders a string value:
```javascript
React.createClass({
propsTypes: {
value: React.PropTypes.string.isRequired
},
render: function() {
return <div>this.props.value</div>;
}
});
```
We could easily implement `shouldComponentUpdate` as follow:
```javascript
shouldComponentUpdate: function(nextProps, nextState) {
return this.props.value !== nextProps.value;
}
```
So far so good, dealing with such simple props/state structures is easy. We could even generalize an implementation based on shallow equality and mix it into components. In fact, React already provides such implementation: [PureRenderMixin](http://facebook.github.io/react/docs/pure-render-mixin.html).
But what if your components' props or state are mutable data structures?. Say the prop the component receives, instead of being a string like `'bar'`, is a Javascript object that contains a string such as, `{ foo: 'bar' }`:
```javascript
React.createClass({
propsTypes: {
value: React.PropTypes.object.isRequired
},
render: function() {
return <div>this.props.value.foo</div>;
}
});
```
The implementation of `shouldComponentUpdate` we had before wouldn't always work as expected:
```javascript
// assume this.props.value is { foo: 'bar' }
// assume nextProps.value is { foo: 'bar' },
// but this reference is different to this.props.value
this.props.value !== nextProps.value; // true
```
The problem is `shouldComponentUpdate` will return `true` when the prop actually didn't change. To fix this we could come up with this alternative implementation:
```javascript
shouldComponentUpdate: function(nextProps, nextState) {
return this.props.value.foo !== nextProps.value.foo;
}
```
Basically, we ended up doing a deep comparison to make sure we properly track changes. This approach is pretty expensive in terms of performance and it doesn't scale as we would have to write different deep equality code for each model. On top of that, it might not even work if we don't carefully manage object references. Say this component is used by a parent:
```javascript
React.createClass({
getInitialState: function() {
return { value: { foo: 'bar' } };
},
onClick: function() {
var value = this.state.value;
value.foo += 'bar'; // ANTI-PATTERN!
this.setState({ value: value });
},
render: function() {
return (
<div>
<InnerComponent value={this.state.value} />
<a onClick={this.onClick}>Click me</a>
</div>
);
}
});
```
The first time the inner component gets rendered it will have `{ foo: 'bar' }` as the value prop. If the user clicks on the anchor, the parent component's state will get updated to `{ value: { foo: 'barbar' } }`, triggering the re-rendering process of the inner component, which will receive `{ foo: 'barbar' }` as the new value for the prop.
The problem is that since the parent and inner components share a reference to the same object, when the object gets mutated on line 2 of the `onClick` function, the prop the inner component had will change. So, when the re-rendering process starts, and `shouldComponentUpdate` gets invoked, `this.props.value.foo` will be equal to `nextProps.value.foo`, because in fact, `this.props.value` references the same object as `nextProps.value`.
Consequently, since we'll miss the change on the prop and short circuit the re-rendering process, the UI won't get updated from `'bar'` to `'barbar'`.
## Immutable-js to the rescue
[Immutable-js](https://github.com/facebook/immutable-js) is a Javascript collections library written by Lee Byron, which Facebook recently open-sourced. It provides *immutable persistent* collections via *structural sharing*. Lets see what these properties mean:
* *Immutable*: once created, a collection cannot be altered at another point in time.
* *Persistent*: new collections can be created from a previous collection and a mutation such as set. The original collection is still valid after the new collection is created.
* *Structural Sharing*: new collections are created using as much of the same structure as the original collection as possible, reducing copying to a minimum to achieve space efficiency and acceptable performance. If the new collection is equal to the original, the original is often returned.
Immutability makes tracking changes cheap; a change will always result in a new object so we only need to check if the reference to the object has changed. For example, in this regular Javascript code:
```javascript
var x = { foo: "bar" };
var y = x;
y.foo = "baz";
x === y; // true
```
Although `y` was edited, since it's a reference to the same object as `x`, this comparison returns `true`. However, this code could be written using immutable-js as follows:
```javascript
var SomeRecord = Immutable.Record({ foo: null });
var x = new SomeRecord({ foo: 'bar' });
var y = x.set('foo', 'baz');
x === y; // false
```
In this case, since a new reference is returned when mutating `x`, we can safely assume that `x` has changed.
Another possible way to track changes could be doing dirty checking by having a flag set by setters. A problem with this approach is that it forces you to use setters and, either write a lot of additional code, or somehow instrument your classes. Alternatively, you could deep copy the object just before the mutations and deep compare to determine whether there was a change or not. A problem with this approach is both deepCopy and deepCompare are expensive operations.
So, Immutable data structures provides you a cheap and less verbose way to track changes on objects, which is all we need to implement `shouldComponentUpdate`. Therefore, if we model props and state attributes using the abstractions provided by immutable-js we'll be able to use `PureRenderMixin` and get a nice boost in perf.
## Immutable-js and Flux
If you're using [Flux](http://facebook.github.io/flux/), you should start writing your stores using immutable-js. Take a look at the [full API](http://facebook.github.io/immutable-js/docs/#/).
Let's see one possible way to model the thread example using Immutable data structures. First, we need to define a `Record` for each of the entities we're trying to model. Records are just immutable containers that hold values for a specific set of fields:
```javascript
var User = Immutable.Record({
id: undefined,
name: undefined,
email: undefined
});
var Message = Immutable.Record({
timestamp: new Date(),
sender: undefined,
text: ''
});
```
The object the `Record` function receives defines the fields the object has and their default values.
The messages *store* could keep track of the users and messages using two lists:
```javascript
this.users = Immutable.List();
this.messages = Immutable.List();
```
It should be pretty straightforward to implement functions to process each *payload* type. For instance, when the store sees a payload representing a new message, we can just create a new record and append it to the messages list:
```javascript
this.messages = this.messages.push(new Message({
timestamp: payload.timestamp,
sender: payload.sender,
text: payload.text
});
```
Note that since the data structures are immutable, we need to assign the result of the push function to this.messages.
On the React side, if we also use immutable-js data structures to hold the components' state, we could mix `PureRenderMixin` into all our components and short circuit the re-rendering process.

View File

@@ -0,0 +1,9 @@
---
id: complementary-tools-zh-CN
title: 补充工具
permalink: complementary-tools-zh-CN.html
prev: videos-zh-CN.html
next: examples-zh-CN.html
---
本页被移到了 [GitHub wiki](https://github.com/facebook/react/wiki/Complementary-Tools)。

19
docs/docs/conferences.md Normal file
View File

@@ -0,0 +1,19 @@
---
id: conferences
title: Conferences
permalink: conferences.html
prev: thinking-in-react.html
next: videos.html
---
### React.js Conf 2015
January 28 & 29
[Website](http://conf.reactjs.com/) - [Schedule](http://conf.reactjs.com/schedule.html) - [Videos](https://www.youtube.com/playlist?list=PLb0IAmt7-GS1cbw4qonlQztYV1TAW0sCr)
<iframe width="650" height="315" src="//www.youtube.com/embed/KVZ-P-ZI6W4?list=PLb0IAmt7-GS1cbw4qonlQztYV1TAW0sCr" frameborder="0" allowfullscreen></iframe>
### ReactEurope 2015
July 2 & 3
[Website](http://www.react-europe.org/) - [Schedule](http://www.react-europe.org/#schedule)

View File

@@ -0,0 +1,8 @@
---
id: examples-zh-CN
title: 示例
permalink: examples-zh-CN.html
prev: complementary-tools-zh-CN.html
---
本页被移到了 [GitHub wiki](https://github.com/facebook/react/wiki/Examples)。

View File

@@ -0,0 +1,7 @@
---
id: flux-overview-zh-CN
title: Flux 应用架构
permalink: flux-overview-zh-CN.html
---
本页被移到了 Flux 网站。[点击访问](http://facebook.github.io/flux/docs/overview.html)。

View File

@@ -0,0 +1,7 @@
---
id: flux-todo-list-zh-CN
title: Flux TodoMVC 教程
permalink: flux-todo-list-zh-CN.html
---
本页被移到了 Flux 网站。[点击访问](http://facebook.github.io/flux/docs/todo-list.html)。

View File

@@ -9,8 +9,8 @@ redirect_from: "docs/index.html"
The easiest way to start hacking on React is using the following JSFiddle Hello World examples:
* **[React JSFiddle](http://jsfiddle.net/vjeux/kb3gN/)**
* [React JSFiddle without JSX](http://jsfiddle.net/vjeux/VkebS/)
* **[React JSFiddle](http://jsfiddle.net/reactjs/69z2wepo/)**
* [React JSFiddle without JSX](http://jsfiddle.net/reactjs/5vjqabv3/)
## Starter Kit
@@ -110,4 +110,8 @@ If you want to use React with [browserify](http://browserify.org/), [webpack](ht
## Next Steps
Check out [the tutorial](/react/docs/tutorial.html) and the other examples in the starter kit's `examples` directory to learn more. Good luck, and welcome!
Check out [the tutorial](/react/docs/tutorial.html) and the other examples in the starter kit's `examples` directory to learn more.
We also have a wiki where the community contributes with [workflows, UI-components, routing, data management etc.](https://github.com/facebook/react/wiki/Complementary-Tools)
Good luck, and welcome!

View File

@@ -1,19 +1,21 @@
---
id: getting-started-zh-CN
title: 入门教程
next: tutorial.html
permalink: getting-started-zh-CN.html
next: tutorial-zh-CN.html
redirect_from: "docs/index-zh-CN.html"
---
## JSFiddle
开始 Hack React 的最简单的方法是用下面 JSFiddle 的Hello Worlds
开始 Hack React 的最简单的方法是用下面 JSFiddle 的Hello Worlds
* **[React JSFiddle](http://jsfiddle.net/vjeux/kb3gN/)**
* [React JSFiddle without JSX](http://jsfiddle.net/vjeux/VkebS/)
* **[React JSFiddle](http://jsfiddle.net/reactjs/69z2wepo/)**
* [React JSFiddle without JSX](http://jsfiddle.net/reactjs/5vjqabv3/)
## 入门教程包 (Starter Kit)
开始先下载入门教程包
开始先下载入门教程包
<div class="buttons-unit downloads">
<a href="/react/downloads/react-{{site.react_version}}.zip" class="button">
@@ -21,7 +23,7 @@ next: tutorial.html
</a>
</div>
在入门教程包的根目录,创建一个含有下面代码的 `helloworld.html`
在入门教程包的根目录,创建一个含有下面代码的 `helloworld.html`
```html
<!DOCTYPE html>
@@ -93,7 +95,7 @@ React.render(
<head>
<title>Hello React!</title>
<script src="build/react.js"></script>
<!-- No need for JSXTransformer! -->
<!-- 不需要 JSXTransformer -->
</head>
<body>
<div id="example"></div>
@@ -102,11 +104,16 @@ React.render(
</html>
```
## 想用 CommonJS
如果你想在一个模块系统里使用 React[fork 我们的代码](http://github.com/facebook/react) `npm install` 然后运行 `grunt`。一个漂亮的 CommonJS 模块集将会被生成。我们的 `jsx` 转换工具可以很轻松的集成到大部分打包系统里(不仅仅是 CommonJS
如果你想在 [browserify](http://browserify.org/)[webpack](http://webpack.github.io/) 或者或其它兼容CommonJS的模块系统里使用 React只要使用 [`react` npm 包](https://www.npmjs.org/package/react) 即可。而且,`jsx` 转换工具可以很轻松的集成到大部分打包系统里(不仅仅是 CommonJS
## 下一步
去看看[入门教程](/react/docs/tutorial.html),然后学习其他在 `/examples` 目录里的示例代码。祝你好运,欢迎来到 React 的世界
去看看[入门教程](/react/docs/tutorial.html) 和入门教程包 `examples` 目录下的其它例子学习更多
我们还有一个社区开发者共建的 Wiki[workflows, UI-components, routing, data management etc.](https://github.com/facebook/react/wiki/Complementary-Tools)
恭喜你,欢迎来到 React 的世界。

View File

@@ -8,20 +8,69 @@ redirect_from: "/docs/reference.html"
## React
`React` is the entry point to the React framework. If you're using one of the prebuilt packages it's available as a global; if you're using CommonJS modules you can `require()` it.
`React` is the entry point to the React library. If you're using one of the prebuilt packages it's available as a global; if you're using CommonJS modules you can `require()` it.
### React.Component
```javascript
class Component
```
This is the base class for React Components when they're defined using ES6 classes. See [Reusable Components](/react/docs/reusable-components.html#es6-classes) for how to use ES6 classes with React. For what methods are actually provided by the base class, see the [Component API](/react/docs/component-api.html).
### React.createClass
```javascript
function createClass(object specification)
ReactClass createClass(object specification)
```
Create a component given a specification. A component implements a `render` method which returns **one single** child. That child may have an arbitrarily deep child structure. One thing that makes components different than standard prototypal classes is that you don't need to call new on them. They are convenience wrappers that construct backing instances (via new) for you.
Create a component class, given a specification. A component implements a `render` method which returns **one single** child. That child may have an arbitrarily deep child structure. One thing that makes components different than standard prototypal classes is that you don't need to call new on them. They are convenience wrappers that construct backing instances (via new) for you.
For more information about the specification object, see [Component Specs and Lifecycle](/react/docs/component-specs.html).
### React.createElement
```javascript
ReactElement createElement(
string/ReactClass type,
[object props],
[children ...]
)
```
Create and return a new `ReactElement` of the given type. The type argument can be either an
html tag name string (eg. 'div', 'span', etc), or a `ReactClass` (created via `React.createClass`).
### React.cloneElement
```
ReactElement cloneElement(
ReactElement element,
[object props],
[children ...]
)
```
Clone and return a new `ReactElement` using `element` as the starting point. The resulting element will have the original element's props with the new props merged in shallowly. New children will replace existing children. Unlike `React.addons.cloneWithProps`, `key` and `ref` from the original element will be preserved. There is no special behavior for merging any props (unlike `cloneWithProps`). See the [v0.13 RC2 blog post](/react/blog/2015/03/03/react-v0.13-rc2.html) for additional details.
### React.createFactory
```javascript
factoryFunction createFactory(
string/ReactClass type
)
```
Return a function that produces ReactElements of a given type. Like `React.createElement`,
the type argument can be either an html tag name string (eg. 'div', 'span', etc), or a
`ReactClass`.
### React.render
```javascript
@@ -57,10 +106,10 @@ Remove a mounted React component from the DOM and clean up its event handlers an
### React.renderToString
```javascript
string renderToString(ReactComponent component)
string renderToString(ReactElement element)
```
Render a component to its initial HTML. This should only be used on the server. React will return an HTML string. You can use this method to generate HTML on the server and send the markup down on the initial request for faster page loads and to allow search engines to crawl your pages for SEO purposes.
Render a ReactElement to its initial HTML. This should only be used on the server. React will return an HTML string. You can use this method to generate HTML on the server and send the markup down on the initial request for faster page loads and to allow search engines to crawl your pages for SEO purposes.
If you call `React.render()` on a node that already has this server-rendered markup, React will preserve it and only attach event handlers, allowing you to have a very performant first-load experience.
@@ -68,7 +117,7 @@ If you call `React.render()` on a node that already has this server-rendered mar
### React.renderToStaticMarkup
```javascript
string renderToStaticMarkup(ReactComponent component)
string renderToStaticMarkup(ReactElement element)
```
Similar to `renderToString`, except this doesn't create extra DOM attributes such as `data-react-id`, that React uses internally. This is useful if you want to use React as a simple static page generator, as stripping away the extra attributes can save lots of bytes.
@@ -83,6 +132,14 @@ boolean isValidElement(* object)
Verifies the object is a ReactElement.
### React.findDOMNode
```javascript
DOMElement findDOMNode(ReactComponent component)
```
If this component has been mounted into the DOM, this returns the corresponding native browser DOM element. This method is useful for reading values out of the DOM, such as form field values and performing DOM measurements. When `render` returns `null` or `false`, `findDOMNode` returns `null`.
### React.DOM
`React.DOM` provides convenience wrappers around `React.createElement` for DOM components. These should only be used when not using JSX. For example, `React.DOM.div(null, 'Hello World!')`

View File

@@ -6,7 +6,7 @@ prev: top-level-api.html
next: component-specs.html
---
## ReactComponent
## React.Component
Instances of a React Component are created internally in React when rendering. These instances are reused in subsequent renders, and can be accessed in your component methods as `this`. The only way to get a handle to a React Component instance outside of React is by storing the return value of `React.render`. Inside other Components, you may use [refs](/react/docs/more-about-refs.html) to achieve the same result.
@@ -14,10 +14,27 @@ Instances of a React Component are created internally in React when rendering. T
### setState
```javascript
setState(object nextState[, function callback])
setState(function|object nextState[, function callback])
```
Merges nextState with the current state. This is the primary method you use to trigger UI updates from event handlers and server request callbacks.
The first argument can be an object (containing zero or more keys to update) or a function (of state and props) that returns an object containing keys to update.
Here is the simple object usage...
```javascript
setState({mykey: 'my new value'});
```
Merges nextState with the current state. This is the primary method you use to trigger UI updates from event handlers and server request callbacks. In addition, you can supply an optional callback function that is executed once `setState` is completed and the component is re-rendered.
It's also possible to pass a function with the signature `function(state, props)`. This can be useful in some cases when you want to enqueue an atomic update that consults the previous value of state+props before setting any values. For instance, suppose we wanted to increment a value in state:
```javascript
setState(function(previousState, currentProps) {
return {myInteger: previousState.myInteger + 1};
});`
```
The second (optional) parameter is a callback function that will be executed once `setState` is completed and the component is re-rendered.
> Notes:
>
@@ -38,8 +55,12 @@ replaceState(object nextState[, function callback])
Like `setState()` but deletes any pre-existing state keys that are not in nextState.
> Note:
>
> This method is not available on ES6 `class` components that extend `React.Component`. It may be removed entirely in a future version of React.
### forceUpdate()
### forceUpdate
```javascript
forceUpdate([function callback])
@@ -47,7 +68,7 @@ forceUpdate([function callback])
If your `render()` method reads from something other than `this.props` or `this.state`, you'll need to tell React when it needs to re-run `render()` by calling `forceUpdate()`. You'll also need to call `forceUpdate()` if you mutate `this.state` directly.
Calling `forceUpdate()` will cause `render()` to be called on the component and its children, but React will still only update the DOM if the markup changes.
Calling `forceUpdate()` will cause `render()` to be called on the component, skipping `shouldComponentUpdate()`. This will trigger the normal lifecycle methods for child components, including the `shouldComponentUpdate()` method of each child. React will still only update the DOM if the markup changes.
Normally you should try to avoid all uses of `forceUpdate()` and only read from `this.props` and `this.state` in `render()`. This makes your application much simpler and more efficient.
@@ -60,8 +81,14 @@ DOMElement getDOMNode()
If this component has been mounted into the DOM, this returns the corresponding native browser DOM element. This method is useful for reading values out of the DOM, such as form field values and performing DOM measurements. When `render` returns `null` or `false`, `this.getDOMNode()` returns `null`.
> Note:
>
> getDOMNode is deprecated and has been replaced with [React.findDOMNode()](/react/docs/top-level-api.html#react.finddomnode).
>
> This method is not available on ES6 `class` components that extend `React.Component`. It may be removed entirely in a future version of React.
### isMounted()
### isMounted
```javascript
bool isMounted()
@@ -69,6 +96,10 @@ bool isMounted()
`isMounted()` returns true if the component is rendered into the DOM, false otherwise. You can use this method to guard asynchronous calls to `setState()` or `forceUpdate()`.
> Note:
>
> This method is not available on ES6 `class` components that extend `React.Component`. It may be removed entirely in a future version of React.
### setProps
@@ -85,7 +116,8 @@ Though calling `React.render()` again on the same node is the preferred way to u
> When possible, the declarative approach of calling `React.render()` again is preferred; it tends to make updates easier to reason about. (There's no significant performance difference between the two approaches.)
>
> This method can only be called on a root-level component. That is, it's only available on the component passed directly to `React.render()` and none of its children. If you're inclined to use `setProps()` on a child component, instead take advantage of reactive updates and pass the new prop to the child component when it's created in `render()`.
>
> This method is not available on ES6 `class` components that extend `React.Component`. It may be removed entirely in a future version of React.
### replaceProps
@@ -94,3 +126,7 @@ replaceProps(object nextProps[, function callback])
```
Like `setProps()` but deletes any pre-existing props instead of merging the two objects.
> Note:
>
> This method is not available on ES6 `class` components that extend `React.Component`. It may be removed entirely in a future version of React.

View File

@@ -21,7 +21,7 @@ The `render()` method is required.
When called, it should examine `this.props` and `this.state` and return a single child component. This child component can be either a virtual representation of a native DOM component (such as `<div />` or `React.DOM.div()`) or another composite component that you've defined yourself.
You can also return `null` or `false` to indicate that you don't want anything rendered. Behind the scenes, React renders a `<noscript>` tag to work with our current diffing algorithm. When returning `null` or `false`, `this.getDOMNode()` will return `null`.
You can also return `null` or `false` to indicate that you don't want anything rendered. Behind the scenes, React renders a `<noscript>` tag to work with our current diffing algorithm. When returning `null` or `false`, `React.findDOMNode(this)` will return `null`.
The `render()` function should be *pure*, meaning that it does not modify component state, it returns the same result each time it's invoked, and it does not read from or write to the DOM or otherwise interact with the browser (e.g., by using `setTimeout`). If you need to interact with the browser, perform your work in `componentDidMount()` or the other lifecycle methods instead. Keeping `render()` pure makes server rendering more practical and makes components easier to think about.
@@ -95,7 +95,7 @@ Methods defined within this block are _static_, meaning that you can run them be
string displayName
```
The `displayName` string is used in debugging messages. JSX sets this value automatically; see [JSX in Depth](/react/docs/jsx-in-depth.html#react-composite-components).
The `displayName` string is used in debugging messages. JSX sets this value automatically; see [JSX in Depth](/react/docs/jsx-in-depth.html#the-transform).
## Lifecycle Methods
@@ -118,14 +118,10 @@ Invoked once, both on the client and server, immediately before the initial rend
componentDidMount()
```
Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via `this.getDOMNode()`.
Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via `React.findDOMNode(this)`.
If you want to integrate with other JavaScript frameworks, set timers using `setTimeout` or `setInterval`, or send AJAX requests, perform those operations in this method.
> Note:
>
> Prior to v0.9, the DOM node was passed in as the last argument. If you were using this, you can still access the DOM node by calling `this.getDOMNode()`.
### Updating: componentWillReceiveProps
@@ -195,14 +191,10 @@ Use this as an opportunity to perform preparation before an update occurs.
componentDidUpdate(object prevProps, object prevState)
```
Invoked immediately after updating occurs. This method is not called for the initial render.
Invoked immediately after the component's updates are flushed to the DOM. This method is not called for the initial render.
Use this as an opportunity to operate on the DOM when the component has been updated.
> Note:
>
> Prior to v0.9, the DOM node was passed in as the last argument. If you were using this, you can still access the DOM node by calling `this.getDOMNode()`.
### Unmounting: componentWillUnmount

View File

@@ -53,22 +53,23 @@ These standard attributes are supported:
```
accept acceptCharset accessKey action allowFullScreen allowTransparency alt
async autoComplete autoPlay cellPadding cellSpacing charSet checked classID
async autoComplete autoFocus autoPlay cellPadding cellSpacing charSet checked classID
className cols colSpan content contentEditable contextMenu controls coords
crossOrigin data dateTime defer dir disabled download draggable encType form
formNoValidate frameBorder height hidden href hrefLang htmlFor httpEquiv icon
id label lang list loop manifest max maxLength media mediaGroup method min
multiple muted name noValidate open pattern placeholder poster preload
radioGroup readOnly rel required role rows rowSpan sandbox scope scrolling
seamless selected shape size sizes span spellCheck src srcDoc srcSet start step
style tabIndex target title type useMap value width wmode
formAction formEncType formMethod formNoValidate formTarget frameBorder height
hidden href hrefLang htmlFor httpEquiv icon id label lang list loop manifest
marginHeight marginWidth max maxLength media mediaGroup method min multiple
muted name noValidate open pattern placeholder poster preload radioGroup
readOnly rel required role rows rowSpan sandbox scope scrolling seamless
selected shape size sizes span spellCheck src srcDoc srcSet start step style
tabIndex target title type useMap value width wmode
```
In addition, the following non-standard attributes are supported:
- `autoCapitalize autoCorrect` for Mobile Safari.
- `property` for [Open Graph](http://ogp.me/) meta tags.
- `itemProp itemScope itemType` for [HTML5 microdata](http://schema.org/docs/gs.html).
- `itemProp itemScope itemType itemRef itemId` for [HTML5 microdata](http://schema.org/docs/gs.html).
There is also the React-specific attribute `dangerouslySetInnerHTML` ([more here](/react/docs/special-non-dom-attributes.html)), used for directly inserting HTML strings into a component.

View File

@@ -17,14 +17,14 @@ boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
Number eventPhase
number eventPhase
boolean isTrusted
DOMEvent nativeEvent
void preventDefault()
void stopPropagation()
DOMEventTarget target
Date timeStamp
String type
number timeStamp
string type
```
> Note:
@@ -35,7 +35,9 @@ String type
## Supported Events
React normalizes events so that they have consistent properties across
different browsers.
different browsers.
The event handlers below are triggered by an event in the bubbling phase. To register an event handler for the capture phase, append `Capture` to the event name; for example, instead of using `onClick`, you would use `onClickCapture` to handle the click event in the capture phase.
### Clipboard Events
@@ -110,11 +112,13 @@ For more information about the onChange event, see [Forms](/react/docs/forms.htm
Event names:
```
onClick onDoubleClick onDrag onDragEnd onDragEnter onDragExit onDragLeave
onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
```
The `onMouseEnter` and `onMouseLeave` events propagate from the component being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
Properties:
```javascript

View File

@@ -0,0 +1,194 @@
---
id: events-zh-CN
title: 事件系统
permalink: events-zh-CN.html
prev: tags-and-attributes-zh-CN.html
next: dom-differences-zh-CN.html
---
## 合成事件
事件处理程序通过 `合成事件``SyntheticEvent`)的实例传递,`SyntheticEvent` 是浏览器原生事件跨浏览器的封装。`SyntheticEvent` 和浏览器原生事件一样有 `stopPropagation()``preventDefault()` 接口,而且这些接口夸浏览器兼容。
如果出于某些原因想使用浏览器原生事件,可以使用 `nativeEvent` 属性获取。每个和成事件(`SyntheticEvent`)对象都有以下属性:
```javascript
boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
Number eventPhase
boolean isTrusted
DOMEvent nativeEvent
void preventDefault()
void stopPropagation()
DOMEventTarget target
Date timeStamp
String type
```
> 注意:
>
> React v0.12 中,事件处理程序返回 `false` 不再停止事件传播,取而代之,应该根据需要手动触发 `e.stopPropagation()` 或 `e.preventDefault()`。
## 支持的事件
React 将事件统一化,使事件在不同浏览器上有一致的属性。
下面的事件处理程序在事件冒泡阶段被触发。如果要注册事件捕获处理程序,应该使用 `Capture` 事件,例如使用 `onClickCapture` 处理点击事件的捕获阶段,而不是 `onClick`
### 剪贴板事件
事件名称:
```
onCopy onCut onPaste
```
属性:
```javascript
DOMDataTransfer clipboardData
```
### 键盘事件
事件名称:
```
onKeyDown onKeyPress onKeyUp
```
属性:
```javascript
boolean altKey
Number charCode
boolean ctrlKey
function getModifierState(key)
String key
Number keyCode
String locale
Number location
boolean metaKey
boolean repeat
boolean shiftKey
Number which
```
### 焦点事件
事件名称
```
onFocus onBlur
```
属性:
```javascript
DOMEventTarget relatedTarget
```
### 表单事件
事件名称:
```
onChange onInput onSubmit
```
关于 `onChange` 事件的更多信息,参见 [表单组件](/react/docs/forms-zh-CN.html)。
### 鼠标事件
事件名称:
```
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
```
属性:
```javascript
boolean altKey
Number button
Number buttons
Number clientX
Number clientY
boolean ctrlKey
function getModifierState(key)
boolean metaKey
Number pageX
Number pageY
DOMEventTarget relatedTarget
Number screenX
Number screenY
boolean shiftKey
```
### 触控事件
在渲染任意组件之前调用 `React.initializeTouchEvents(true)`,以启用触控事件。
事件名称:
```
onTouchCancel onTouchEnd onTouchMove onTouchStart
```
属性:
```javascript
boolean altKey
DOMTouchList changedTouches
boolean ctrlKey
function getModifierState(key)
boolean metaKey
boolean shiftKey
DOMTouchList targetTouches
DOMTouchList touches
```
### 用户界面事件
事件名称:
```
onScroll
```
属性:
```javascript
Number detail
DOMAbstractView view
```
### 滚轮事件
事件名称:
```
onWheel
```
属性:
```javascript
Number deltaMode
Number deltaX
Number deltaY
Number deltaZ
```

View File

@@ -10,4 +10,4 @@ Beside [DOM differences](/react/docs/dom-differences.html), React offers some at
- `key`: an optional, unique identifier. When your component shuffles around during `render` passes, it might be destroyed and recreated due to the diff algorithm. Assigning it a key that persists makes sure the component stays. See more [here](/react/docs/multiple-components.html#dynamic-children).
- `ref`: see [here](/react/docs/more-about-refs.html).
- `dangerouslySetInnerHTML`: takes an object with the key `__html` and a DOM string as value. This is mainly for cooperating with DOM string manipulation libraries. Refer to the last example on the front page.
- `dangerouslySetInnerHTML`: Provides the ability to insert raw HTML, mainly for cooperating with DOM string manipulation libraries. See more [here](/react/tips/dangerously-set-inner-html.html).

View File

@@ -46,9 +46,9 @@ renderB: <Content />
=> [removeNode <Header />], [insertNode <Content />]
```
Having this high level knowledge is a very important aspect of why React diff algorithm is both fast and precise. It provides a good heuristic to quickly prune big parts of the tree and focus on parts likely to be similar.
Having this high level knowledge is a very important aspect of why React's diff algorithm is both fast and precise. It provides a good heuristic to quickly prune big parts of the tree and focus on parts likely to be similar.
It is very unlikely that a `<Header>` element is going generate a DOM that is going to look like what a `<Content>` would generate. Instead of spending time trying to match those two structures, React just re-builds the tree from scratch.
It is very unlikely that a `<Header>` element is going to generate a DOM that is going to look like what a `<Content>` would generate. Instead of spending time trying to match those two structures, React just re-builds the tree from scratch.
As a corollary, if there is a `<Header>` element at the same position in two consecutive renders, you would expect to see a very similar structure and it is worth exploring it.
@@ -121,7 +121,7 @@ In practice, finding a key is not really hard. Most of the time, the element you
## Trade-offs
It is important to remember that the reconciliation algorithm is an implementation detail. React could re-render the whole app on every action, the end-result would be the same. We are regularly refining the heuristics in order to make common use cases faster.
It is important to remember that the reconciliation algorithm is an implementation detail. React could re-render the whole app on every action; the end result would be the same. We are regularly refining the heuristics in order to make common use cases faster.
In the current implementation, you can express the fact that a sub-tree has been moved amongst its siblings, but you cannot tell that it has moved somewhere else. The algorithm will re-render that full sub-tree.

View File

@@ -21,7 +21,7 @@ You can create one of these object through `React.createElement`.
var root = React.createElement('div');
```
To render a new tree into the DOM, you create `ReactElement`s and pass them to `React.render` a long with a regular DOM `Element` (`HTMLElement` or `SVGElement`). `ReactElement`s are not to be confused with DOM `Element`s. A `ReactElement` is a light, stateless, immutable, virtual representation of a DOM `Element`. It is a virtual DOM.
To render a new tree into the DOM, you create `ReactElement`s and pass them to `React.render` along with a regular DOM `Element` (`HTMLElement` or `SVGElement`). `ReactElement`s are not to be confused with DOM `Element`s. A `ReactElement` is a light, stateless, immutable, virtual representation of a DOM `Element`. It is a virtual DOM.
```javascript
React.render(root, document.body);
@@ -62,7 +62,7 @@ var root = div({ className: 'my-div' });
React.render(root, document.body);
```
React already have built-in factories for common HTML tags:
React already has built-in factories for common HTML tags:
```javascript
var root = React.DOM.ul({ className: 'my-list' },
@@ -76,6 +76,7 @@ If you are using JSX you have no need for factories. JSX already provides a conv
## React Nodes
A `ReactNode` can be either:
- `ReactElement`
- `string` (aka `ReactText`)
- `number` (aka `ReactText`)

View File

@@ -2,7 +2,7 @@
id: thinking-in-react
title: Thinking in React
prev: tutorial.html
next: videos.html
next: conferences.html
---
This was originally a [blog post](/react/blog/2013/11/05/thinking-in-react.html) from the [official React blog](/react/blog).
@@ -60,7 +60,7 @@ Now that we've identified the components in our mock, let's arrange them into a
## Step 2: Build a static version in React
<iframe width="100%" height="300" src="http://jsfiddle.net/n25pd/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/reactjs/yun1vgqb/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
Now that you have your component hierarchy it's time to start implementing your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's easiest to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why.
@@ -104,7 +104,7 @@ So finally, our state is:
## Step 4: Identify where your state should live
<iframe width="100%" height="300" src="http://jsfiddle.net/t53sx/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/reactjs/zafjbw1e/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
OK, so we've identified what the minimal set of app state is. Next we need to identify which component mutates, or *owns*, this state.
@@ -129,7 +129,7 @@ You can start seeing how your application will behave: set `filterText` to `"bal
## Step 5: Add inverse data flow
<iframe width="100%" height="300" src="http://jsfiddle.net/F8H7p/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="https://jsfiddle.net/reactjs/n47gckhr/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
So far we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in `FilterableProductTable`.

View File

@@ -5,7 +5,7 @@ prev: getting-started.html
next: thinking-in-react.html
---
We'll be building a simple, but realistic comments box that you can drop into a blog, a basic version of the realtime comments offered by Disqus, LiveFyre or Facebook comments.
We'll be building a simple but realistic comments box that you can drop into a blog, a basic version of the realtime comments offered by Disqus, LiveFyre or Facebook comments.
We'll provide:
@@ -16,25 +16,31 @@ We'll provide:
It'll also have a few neat features:
* **Optimistic commenting:** comments appear in the list before they're saved on the server so it feels fast.
* **Live updates:** as other users comment we'll pop them into the comment view in real time
* **Markdown formatting:** users can use Markdown to format their text
* **Live updates:** other users' comments are popped into the comment view in real time.
* **Markdown formatting:** users can use Markdown to format their text.
### Want to skip all this and just see the source?
[It's all on GitHub.](https://github.com/reactjs/react-tutorial)
### Running a server
While it's not necessary to get started with this tutorial, later on we'll be adding functionality that requires `POST`ing to a running server. If this is something you are intimately familiar with and want to create your own server, please do. For the rest of you who might want to focus on learning about React without having to worry about the server-side aspects, we have written simple servers in a number of languages - JavaScript (using Node.js), Python, Ruby, Go, and PHP. These are all available on GitHub. You can [view the source](https://github.com/reactjs/react-tutorial/) or [download a zip file](https://github.com/reactjs/react-tutorial/archive/master.zip) to get started.
To get started using the tutorial, just start editing `public/index.html`.
### Getting started
For this tutorial we'll use prebuilt JavaScript files on a CDN. Open up your favorite editor and create a new HTML document:
For this tutorial, we'll use prebuilt JavaScript files on a CDN. Open up your favorite editor and create a new HTML document:
```html
<!-- template.html -->
<!-- index.html -->
<html>
<head>
<title>Hello React</title>
<script src="http://fb.me/react-{{site.react_version}}.js"></script>
<script src="http://fb.me/JSXTransformer-{{site.react_version}}.js"></script>
<script src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
<script src="https://fb.me/react-{{site.react_version}}.js"></script>
<script src="https://fb.me/JSXTransformer-{{site.react_version}}.js"></script>
<script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
</head>
<body>
<div id="content"></div>
@@ -141,7 +147,7 @@ var CommentForm = React.createClass({
});
```
Next, update the `CommentBox` component to use its new friends:
Next, update the `CommentBox` component to use these new components:
```javascript{6-8}
// tutorial3.js
@@ -160,32 +166,12 @@ var CommentBox = React.createClass({
Notice how we're mixing HTML tags and components we've built. HTML components are regular React components, just like the ones you define, with one difference. The JSX compiler will automatically rewrite HTML tags to `React.createElement(tagName)` expressions and leave everything else alone. This is to prevent the pollution of the global namespace.
### Component Properties
Let's create our third component, `Comment`. We will want to pass it the author name and comment text so we can reuse the same code for each unique comment. First let's add some comments to the `CommentList`:
```javascript{6-7}
// tutorial4.js
var CommentList = React.createClass({
render: function() {
return (
<div className="commentList">
<Comment author="Pete Hunt">This is one comment</Comment>
<Comment author="Jordan Walke">This is *another* comment</Comment>
</div>
);
}
});
```
Note that we have passed some data from the parent `CommentList` component to the child `Comment` components. For example, we passed *Pete Hunt* (via an attribute) and *This is one comment* (via an XML-like child node) to the first `Comment`. Data passed from parent to children components is called **props**, short for properties.
### Using props
Let's create the Comment component. Using **props** we will be able to read the data passed to it from the `CommentList`, and render some markup:
Let's create the `Comment` component, which will depend on data passed in from it's parent. Data passed in from a parent component is available as a 'property' on the child component. These 'properties' are accessed through `this.props`. Using props we will be able to read the data passed to the `Comment` from the `CommentList`, and render some markup:
```javascript
// tutorial5.js
// tutorial4.js
var Comment = React.createClass({
render: function() {
return (
@@ -202,6 +188,26 @@ var Comment = React.createClass({
By surrounding a JavaScript expression in braces inside JSX (as either an attribute or child), you can drop text or React components into the tree. We access named attributes passed to the component as keys on `this.props` and any nested elements as `this.props.children`.
### Component Properties
Now that we have defined the `Comment` component, we will want to pass it the author name and comment text. This allows us to reuse the same code for each unique comment. Now let's add some comments within our `CommentList`:
```javascript{6-7}
// tutorial5.js
var CommentList = React.createClass({
render: function() {
return (
<div className="commentList">
<Comment author="Pete Hunt">This is one comment</Comment>
<Comment author="Jordan Walke">This is *another* comment</Comment>
</div>
);
}
});
```
Note that we have passed some data from the parent `CommentList` component to the child `Comment` components. For example, we passed *Pete Hunt* (via an attribute) and *This is one comment* (via an XML-like child node) to the first `Comment`. As noted above, the `Comment` component will access these 'properties' through `this.props.author`, and `this.props.children`.
### Adding Markdown
Markdown is a simple way to format your text inline. For example, surrounding text with asterisks will make it emphasized.
@@ -209,13 +215,13 @@ Markdown is a simple way to format your text inline. For example, surrounding te
First, add the third-party **Showdown** library to your application. This is a JavaScript library which takes Markdown text and converts it to raw HTML. This requires a script tag in your head (which we have already included in the React playground):
```html{7}
<!-- template.html -->
<!-- index.html -->
<head>
<title>Hello React</title>
<script src="http://fb.me/react-{{site.react_version}}.js"></script>
<script src="http://fb.me/JSXTransformer-{{site.react_version}}.js"></script>
<script src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/showdown/0.3.1/showdown.min.js"></script>
<script src="https://fb.me/react-{{site.react_version}}.js"></script>
<script src="https://fb.me/JSXTransformer-{{site.react_version}}.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>
```
@@ -379,7 +385,7 @@ When the component is first created, we want to GET some JSON from the server an
We'll use jQuery to help make an asynchronous request to the server.
Note: because this is becoming an AJAX application you'll need to develop your app using a web server rather than as a file sitting on your file system. The easiest way to do this is to run `python -m SimpleHTTPServer` in your application's directory.
Note: because this is becoming an AJAX application you'll need to develop your app using a web server rather than as a file sitting on your file system. [As mentioned above](#running-a-server), we have provided several servers you can use [on GitHub](https://github.com/reactjs/react-tutorial/). They provide the functionality you need for the rest of this tutorial.
```javascript{6-17}
// tutorial13.js
@@ -413,7 +419,7 @@ var CommentBox = React.createClass({
Here, `componentDidMount` is a method called automatically by React when a component is rendered. The key to dynamic updates is the call to `this.setState()`. We replace the old array of comments with the new one from the server and the UI automatically updates itself. Because of this reactivity, it is only a minor change to add live updates. We will use simple polling here but you could easily use WebSockets or other technologies.
```javascript{3,19-20,34}
```javascript{3,14,19-20,34}
// tutorial14.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
@@ -476,19 +482,19 @@ var CommentForm = React.createClass({
Let's make the form interactive. When the user submits the form, we should clear it, submit a request to the server, and refresh the list of comments. To start, let's listen for the form's submit event and clear it.
```javascript{3-14,17-19}
```javascript{3-13,16-19}
// tutorial16.js
var CommentForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var author = this.refs.author.getDOMNode().value.trim();
var text = this.refs.text.getDOMNode().value.trim();
var author = React.findDOMNode(this.refs.author).value.trim();
var text = React.findDOMNode(this.refs.text).value.trim();
if (!text || !author) {
return;
}
// TODO: send request to the server
this.refs.author.getDOMNode().value = '';
this.refs.text.getDOMNode().value = '';
React.findDOMNode(this.refs.author).value = '';
React.findDOMNode(this.refs.text).value = '';
return;
},
render: function() {
@@ -511,7 +517,7 @@ Call `preventDefault()` on the event to prevent the browser's default action of
##### Refs
We use the `ref` attribute to assign a name to a child component and `this.refs` to reference the component. We can call `getDOMNode()` on a component to get the native browser DOM element.
We use the `ref` attribute to assign a name to a child component and `this.refs` to reference the component. We can call `React.findDOMNode(component)` on a component to get the native browser DOM element.
##### Callbacks as props
@@ -563,14 +569,14 @@ Let's call the callback from the `CommentForm` when the user submits the form:
var CommentForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var author = this.refs.author.getDOMNode().value.trim();
var text = this.refs.text.getDOMNode().value.trim();
var author = React.findDOMNode(this.refs.author).value.trim();
var text = React.findDOMNode(this.refs.text).value.trim();
if (!text || !author) {
return;
}
this.props.onCommentSubmit({author: author, text: text});
this.refs.author.getDOMNode().value = '';
this.refs.text.getDOMNode().value = '';
React.findDOMNode(this.refs.author).value = '';
React.findDOMNode(this.refs.text).value = '';
return;
},
render: function() {

View File

@@ -2,7 +2,7 @@
id: videos
title: Videos
permalink: videos.html
prev: thinking-in-react.html
prev: conferences.html
next: complementary-tools.html
---
@@ -96,6 +96,11 @@ A [tagtree.tv](http://tagtree.tv/) video conveying the principles of [Thinking i
By [Tom Occhino](http://tomocchino.com/) and [Jordan Walke](https://github.com/jordwalke)
### Backbone + React + Middleman Screencast
<iframe width="650" height="315" src="//www.youtube.com/embed/iul1fWHVU6A" frameborder="0" allowfullscreen></iframe>
Backbone is a great way in interface a REST API with React. This screencast shows how to integate the two using [Backbone-React-Component](https://github.com/magalhas/backbone-react-component). Middleman is the framework used in this example but could easily be replaced with other frameworks. A supported template of this can be found [here](https://github.com/jbhatab/middleman-backbone-react-template). -- [Open Minded Innovations](http://www.openmindedinnovations.com/)
### Developing User Interfaces With React - Super VanJS
<iframe width="650" height="315" src="//www.youtube.com/embed/1OeXsL5mr4g" frameborder="0" allowfullscreen></iframe>
@@ -127,3 +132,17 @@ by [Stoyan Stefanov](http://www.phpied.com/)
<iframe width="650" height="315" src="//www.youtube.com/embed/i__969noyAM" frameborder="0" allowfullscreen></iframe>
Facebook engineers [Bill Fisher](http://twitter.com/fisherwebdev) and [Jing Chen](http://twitter.com/jingc) talk about Flux and React, and how using an application architecture with a unidirectional data flow cleans up a lot of their code.
### Server-Side Rendering of Isomorphic Apps at SoundCloud
<iframe src="//player.vimeo.com/video/108488724" width="500" height="281" frameborder="0" allowfullscreen></iframe>
Walk-through by [Andres Suarez](https://github.com/zertosh) on how [SoundCloud](https://developers.soundcloud.com/blog/) is using React and Flux for server-side rendering.
[Slides and sample code](https://github.com/zertosh/ssr-demo-kit)
### Introducing React Native (+Playlist) - React.js Conf 2015
<iframe width="650" height="315" src="//www.youtube.com/watch?v=KVZ-P-ZI6W4&index=1&list=PLb0IAmt7-GS1cbw4qonlQztYV1TAW0sCr" frameborder="0" allowfullscreen></iframe>
[Tom Occhino](https://twitter.com/tomocchino) reviews the past and present of React in 2015, and teases where it's going next.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More