Compare commits

..

671 Commits

Author SHA1 Message Date
Paul O’Shannessy
95d82cacd6 Update version to 0.11.0 2014-07-17 13:47:06 -07:00
Paul O’Shannessy
0d5e5bee3c shrinkwrap for 0.11 [skip ci] 2014-07-17 13:47:06 -07:00
Ben Alpert
11e0e5ae44 Performance boost in some cases 2014-07-17 13:43:43 -07:00
Paul O’Shannessy
5f77e6dc51 Upgrade commoner dependency
0.9.5 depended on Node 0.11+, so make sure we don't ever get that.
See https://github.com/reactjs/commoner/pull/65
2014-07-17 12:59:53 -07:00
Ben Alpert
6ee9aa773d Remove stale deprecation note from unmounting docs 2014-07-16 23:22:54 -07:00
Ben Alpert
ba5c7ff507 Add React.Children.count docs 2014-07-16 23:19:45 -07:00
Paul O’Shannessy
0fdd98f0d4 Update authors/acknowledgements [skip ci] 2014-07-16 15:14:49 -07:00
Paul O’Shannessy
c21678f9bc Merge pull request #1818 from chenglou/docs-apply
[Docs] Update addons.update
2014-07-16 14:17:47 -07:00
Paul O’Shannessy
bb6087848d Merge pull request #1821 from chenglou/docs-addons-perf
[Docs] Perf tools
2014-07-16 14:17:30 -07:00
Paul O’Shannessy
62a4ac0f4d Merge pull request #1840 from spicyj/statics-proptypes
When proxying statics functions, copy properties
2014-07-16 13:07:56 -07:00
Ben Alpert
121529bdfd Add "Edit on GitHub" link on docs pages
Ember's docs do this and I rather like the idea of encouraging people to make improvements.
2014-07-16 11:17:00 -07:00
Ben Alpert
dd3167edc9 Reorder reference pages
This order should make more sense; it moves important functions like React.renderComponent up and deprecated/discouraged ones like transferPropsTo and setProps down. No content changes.
2014-07-15 23:03:37 -07:00
Ben Alpert
abb95eed5c Fix comma splice 2014-07-15 22:34:33 -07:00
Paul O’Shannessy
5ea3ff64b6 Merge pull request #1842 from spicyj/jstransform-visitors
Add new jstransform visitors to JSX transform
2014-07-15 16:36:14 -07:00
Ben Alpert
f02264cf83 Add destructuring visitor to JSX harmony transform 2014-07-15 16:34:00 -07:00
Ben Alpert
076047012a When proxying statics functions, copy properties
Test Plan: jest
2014-07-15 15:09:16 -07:00
Cheng Lou
12750ad749 [Docs] Perf tools
Fixes #1814.
@petehunt @joshduck
The images look blurry (taken on retina then shrank down to 50%...)
2014-07-15 11:17:21 -07:00
Paul O’Shannessy
e85e5e9952 Merge pull request #1817 from chenglou/docs-PureRenderMixin
[Docs] Document PureRenderMixin addon
2014-07-15 11:09:16 -07:00
Ben Alpert
76496b3cca Add note about higher/lower-level transition APIs 2014-07-14 21:41:07 -07:00
Cheng Lou
8ebadf1591 [Docs] Update addons.update
Fixes #1815.
Add the new `$apply` command, plus a few examples.

@petehunt
2014-07-14 17:59:22 -07:00
Ben Alpert
7b872cd781 Merge pull request #1813 from baddox/patch-2
Verb agreement grammar fix
2014-07-14 17:08:43 -07:00
Ben Alpert
c26c2d42ac Merge pull request #1812 from baddox/patch-1
Add possessive to fix grammar
2014-07-14 17:07:10 -07:00
Mouad Debbar
97dbada03d Up-to-date React.Children
Make sure we actually include `.count`
2014-07-14 15:01:44 -07:00
Ben Alpert
65b2232f34 Fix typo-ed "of" 2014-07-13 13:09:50 -07:00
Ben Alpert
4a66260b2c Make code in headers not giant 2014-07-13 13:03:12 -07:00
Paul O’Shannessy
b8cc3f510a 0.11-rc blog post 2014-07-13 12:54:41 -07:00
Paul O’Shannessy
ab690586d3 Consolas > Courier New for monospace docs font [skip ci] 2014-07-13 12:26:28 -07:00
Paul O’Shannessy
0f9cec2e78 0.11.0-rc1 2014-07-12 19:50:45 -07:00
Paul O’Shannessy
ec7de52a8f Merge pull request #1825 from zpao/jsx-sourcemap
Add support for inline sourcemaps in jsx executable
2014-07-12 19:50:01 -07:00
Paul O’Shannessy
fc3a3801de Add support for inline sourcemaps in jsx executable
--source-map-inline
2014-07-12 19:49:11 -07:00
Paul O’Shannessy
87c8e69fca Bump dependencies that are known safe
Most of these would have been installed anyway, just making sure what
got shrinkwrapped is what others would experience.
2014-07-12 19:09:00 -07:00
Cheng Lou
8f909233c9 [Docs] Document PureRenderMixin addon
Fixes #1816
2014-07-12 14:56:43 -07:00
Ben Alpert
92d2dcc25f Revert "Add helpful message about pooled classes"
This reverts commit e65f17b86c. This might have a perf impact so we're not going to go with it for now.
2014-07-11 16:00:58 -07:00
Paul O’Shannessy
4526f627f2 Simplify shouldComponentUpdate example [skip ci] 2014-07-11 15:32:48 -07:00
Ben Alpert
a47a6ab1d1 Rewrap tags/attributes lists 2014-07-11 15:23:51 -07:00
Cheng Lou
b38518ff4d [Docs] Better README for react-tools 2014-07-11 15:09:22 -07:00
Paul O’Shannessy
165cb5f70f Merge pull request #1783 from avanderhoorn/patch-1
Update React-tools to support transform as object
2014-07-11 15:00:04 -07:00
Ben Alpert
b14ae9b615 Update AUTHORS and acknowledgements again 2014-07-11 14:51:56 -07:00
Ben Alpert
7e44894219 Tweak wording a bit on renderComponent note 2014-07-11 14:50:46 -07:00
Ben Alpert
694a952d26 Merge pull request #1799 from julen/patch-1
Added note about `renderComponent()` requirement
2014-07-11 14:48:37 -07:00
Ben Alpert
47d3339e1b Don't copy todomvc-flux into starter kit
Test Plan: Ran `grunt release:starter` and looked in build/starter/ to see all the examples but not todomvc-flux.
2014-07-11 14:35:10 -07:00
Ben Alpert
c64df89ecf Fix up getDefaultProps docs 2014-07-11 14:26:42 -07:00
Ben Alpert
a4374c4f74 Update acknowledgements page from AUTHORS 2014-07-11 14:15:53 -07:00
Ben Alpert
d101e2ef30 Update AUTHORS 2014-07-11 14:10:46 -07:00
Paul O’Shannessy
2b0e51bdba Add String.prototype.trim to polyfill check
Also shortens the URL so it fits on 1 line
2014-07-11 10:36:38 -07:00
Paul O’Shannessy
28d94d2dcf Fix react-dislayName-test
[skip ci]
2014-07-11 10:36:07 -07:00
Anthony van der Hoorn
8c1ce8f9c3 Update sourceMap to return .toJSON() output
This means we get a data object back rather than a SourceMapGenerator
2014-07-11 08:44:02 -04:00
Anthony van der Hoorn
b8582b8d1c Refactor transformAsObject to transformWithDetails
This matches current best thinking.
2014-07-11 08:38:28 -04:00
Thomas Shaddox
0d7184f0db Verb agreement grammar fix 2014-07-11 02:57:21 -07:00
Thomas Shaddox
4477e69d52 Add possessive to fix grammar 2014-07-11 02:52:17 -07:00
Julen Ruiz Aizpuru
e0c0e20b49 Docs: added note about renderComponent() requirement 2014-07-11 08:37:44 +02:00
Ben Alpert
774f5a022e tutorial: Fetch data in componentDidMount instead
In a world where this component was server-rendered, we wouldn't want to call the data-fetching code there so it makes more sense to have it in componentDidMount.
2014-07-10 22:33:09 -07:00
Paul O’Shannessy
cd1adc5303 Merge pull request #1796 from enguerran/footer
fix the disappearing footer on the todomvc-flux sample
2014-07-10 20:41:25 -07:00
Paul O’Shannessy
55b7c387da Update supported elements and properties [skip ci] 2014-07-10 20:04:37 -07:00
Paul O’Shannessy
d8aa1c3612 Update polyfills list in docs [skip ci]
Fixes #1744
2014-07-10 17:14:25 -07:00
Paul O’Shannessy
0d8aa8ff65 Update AUTHORS for 0.11 [ci skip] 2014-07-10 14:49:00 -07:00
Paul O’Shannessy
9e582661e3 Merge pull request #1802 from zpao/jsxtransformer-cleanup
Jsxtransformer cleanup
2014-07-09 13:28:49 -07:00
Paul O’Shannessy
31a025a667 Add docblocks and consistent styling to JSXTransformer 2014-07-09 12:51:46 -07:00
Paul O’Shannessy
61d495422d Merge pull request #1801 from zpao/jsxtransformer-sourcemaps
Fix sourcemaps in JSXTransformer for Firefox
2014-07-09 12:49:31 -07:00
Paul O’Shannessy
336890291e Fix sourcemaps in JSXTransformer for Firefox
Fixes #1725
2014-07-09 12:48:02 -07:00
Enguerran
0d481c69a5 another way to fix the footer that is not shown 2014-07-09 10:39:14 +02:00
Paul O’Shannessy
9d5ab297d2 Merge pull request #1784 from wvl/package-built-source-with-npm
Add the built source to npm package. See #1699
2014-07-08 19:22:53 -07:00
Paul O’Shannessy
897b423e0e Merge pull request #1797 from spicyj/transition-group-names
Add displayName to ReactTransitionGroup + friends
2014-07-08 14:40:34 -07:00
Paul O’Shannessy
49c476e1e6 Merge pull request #1786 from zpao/react-tools-readme
Custom readme for react-tools
2014-07-08 14:20:36 -07:00
Ben Alpert
734a345257 Add displayName to ReactTransitionGroup + friends
Fixes facebook/react-devtools#42.

Test Plan: Crossed fingers.
2014-07-08 12:18:46 -07:00
Enguerran
745082c0ac fix the disappearing footer on the todomvc-flux sample 2014-07-08 11:59:07 +02:00
Paul O’Shannessy
785d2cabef Merge pull request #1793 from monsanto/browserify-note
Add a note about production mode for npm installs.
2014-07-07 21:56:51 -07:00
Christopher Monsanto
39ac88595d Remove mention of envify since it is listed in package.json 2014-07-07 15:00:47 -04:00
Anthony van der Hoorn
5c4e451054 Abstracted out common code into innerTransform
As per feedback brought common logic from both `transform` and `transformAsObject` into its own `innerTransform` function.
2014-07-06 16:23:50 -04:00
Christopher Monsanto
9ddb4d4a78 Add a note about production mode for npm installs. 2014-07-05 20:52:42 -04:00
Paul O’Shannessy
5c85f33184 Custom readme for react-tools
Of course this means I can no longer just npm publish from the project
root, but I haven't been anyway.
2014-07-03 17:39:33 -07:00
Wayne Larsen
c1c8ad8e53 Add the built source to npm package. See #1699 2014-07-03 18:21:22 -04:00
Cheng Lou
e10d10e31e Merge pull request #1531 from spicyj/two-face
Give useful error when using two copies of React
2014-07-03 14:45:23 -07:00
Ben Alpert
70bf3e1306 Give useful error when using two copies of React
If we don't error here, we end up with a confusing error later on in this.getDOMNode() where ReactMount doesn't have the proper container registered in its object.
2014-07-03 14:20:31 -07:00
Andrew Zich
559eb89965 make invariant show formatted actual errors in all unminified environments
Because we can have !__DEV__ but unminified, we still want to see the
message in those cases.
2014-07-03 13:53:41 -07:00
Cheng Lou
e8e08127c5 Merge pull request #1461 from spicyj/no-esc-slash
Don't escape slash; it's unnecessary
2014-07-03 11:05:16 -07:00
Paul O’Shannessy
676aac13d0 Update npm dependencies [skip ci] 2014-07-03 09:57:12 -07:00
Anthony van der Hoorn
4ecde425f9 Update React-tools to support transform as object
This change adds an additional function to the exported object to support getting access to the transformed result as an object rather than just a string result - the separate function designed to maintain backwards compatibility. 

This facilitates tools that want the code separate from the sourcemap or anything else as time goes by.
2014-07-03 08:20:55 -04:00
Paul O’Shannessy
12479d3d20 Merge pull request #1780 from jbrantly/issue-1292
Fixing grunt jsx task in Windows
2014-07-02 17:41:18 -07:00
Cheng Lou
7a27d43020 Merge pull request #1779 from spicyj/spell-gram
Fix spelling/grammar in test comment
2014-07-02 15:13:36 -07:00
jbrantly
9e60afdc31 Fixing grunt jsx task in Windows
Spawning node directly instead of relying on shebang in the jsx-internal script

Fixes #1292
2014-07-02 17:26:40 -04:00
Ben Alpert
c8d9957f68 Fix spelling/grammar in test comment 2014-07-02 14:09:38 -07:00
Ben Alpert
a02b6b3d7f Clarify when getDefaultProps is called
Fixes #1778.
2014-07-02 14:06:48 -07:00
Yuval Dekel
40b522c498 Give context for owners of compenent instantiations with propType errors
See modification to the test-file: Basically we add a small hint at the end
of the error warning for propType errors to help identify which instantiation
of the component at hand is faulty.
2014-07-02 12:47:26 -07:00
Paul O’Shannessy
17aef05d75 Stop running so many things in travis
We're not actively looking at most of these and they take up valuable
job time.
2014-07-01 18:11:34 -07:00
Paul O'Shannessy
a4e5327b76 Remove jest usage in ReactDescriptorTest
Until we're only using jest on github, we should stick with Jasmine spies. Soon, hopefully.
2014-06-30 20:55:19 -07:00
Paul O'Shannessy
022e44c95b Cleanup ReactChildren 2014-06-30 20:55:09 -07:00
Guangqiang Dong
1aa9cc6a8b add count() method to ReactChildren
added ReactChildren.count() to count the number of children, and a test case.
2014-06-30 20:54:57 -07:00
Paul O'Shannessy
5b17e75707 Support more properties for image maps
Supporting the `<area>` tag is pretty useless if we don't support the necessary properties.
2014-06-30 20:54:44 -07:00
Paul O’Shannessy
5eb57fa51b Add support to JSX transform for <hyphenated-tags>
This only adds support for whitelisted tags, not arbitrary ones.

Closes #1539
2014-06-30 20:54:41 -07:00
Cheng Lou
3e5c606f3f Merge pull request #1750 from protron/patch-1
Fix to sample code for href in ReactPropTypes
2014-06-30 17:14:58 -07:00
Paul O’Shannessy
dc8ec2fab1 Cache node_modules on Travis
This isn't actually enabled yet for public projects, but this will help
us speed up builds when it does get enabled.

http://docs.travis-ci.com/user/caching/
2014-06-30 14:19:24 -07:00
Ben Alpert
94fd726f86 Merge pull request #1767 from jgebhardt/fixlink
fix link in community roundup #18
2014-06-30 10:48:29 -07:00
Jonas Gebhardt
a8e273f844 fix link in community roundup #18 2014-06-30 10:41:42 -07:00
Ben Alpert
5a0eee3bb6 Merge pull request #1765 from chenglou/docs-tut-again
[Docs] Fix tutorial line highlights, revert ajax in cb
2014-06-30 01:02:29 -07:00
Cheng Lou
66d6e3f391 [Docs] Fix tutorial line highlights, revert ajax in cb 2014-06-30 01:01:48 -07:00
Cheng Lou
108efb4add Merge pull request #1763 from chenglou/docs-tut
[Docs] Put tutorial up-to-date with the code
2014-06-29 21:50:42 -07:00
Cheng Lou
58a463f01c [Docs] Put tutorial up-to-date with the code 2014-06-29 21:46:16 -07:00
Cheng Lou
546bf0ed74 Merge pull request #1760 from spicyj/docs-harmony
Add --harmony option to live JSX compiler page
2014-06-28 17:32:57 -07:00
Ben Alpert
ba67bf1b0d Add --harmony option to live JSX compiler page 2014-06-28 17:29:30 -07:00
Mariano Desanze
bb1a31930b Wrapped line to 80 chars in ReactPropTypes sample 2014-06-28 04:33:45 -03:00
Ben Alpert
bc11793c04 Fix code style in TodoMVC Flux example 2014-06-27 22:16:42 -07:00
Paul O’Shannessy
8dcad5e09c Merge pull request #1622 from gebrits/patch-1
Update todo example. fixes 'Create' that shouldn't happen
2014-06-27 17:57:01 -07:00
Cheng Lou
5ba3911929 [Blog] Update round-up #19 to include more credit 2014-06-27 10:00:41 -07:00
Mariano Desanze
9854be2e46 Fix to sample code for href in ReactPropTypes
Error should be thrown in the previous condition is "not" meet. And the href propType is described as optional in the comment, but the null check was missing.
2014-06-27 11:50:03 -03:00
Sebastian Markbage
ef67406272 Add simple React.createDescriptor hook
This is the minimal runtime change we need to switch the JSX syntax to resolve
to React.createDescriptor(...)
2014-06-26 15:42:18 -07:00
Sebastian Markbage
d0719a5ea4 Preparing to move defaultProps resolution and type validation to the descriptor
This copies the propType and contextType validation to a wrapper around the
descriptor factory. By doing the validation early, we make it easier to track
down bugs. It also prepares for static type checking which should be done at the
usage site.

This validation is not yet active and is just logged using monitorCodeUse. This
will allow us to clean up callsites which would fail this new type of
validation.

I chose to copy the validation of abstracting it out since this is just an
intermediate step to avoid spamming consoles. This makes more a much cleaner
diff review/history. The original validation in the instance will be deleted as
soon as we can turn on the warnings.

Additionally, getDefaultProps are moved to become a static function which is
only executed once. It should be moved to statics but we don't have a
convenient way to merge mixins in statics right now. Deferring to ES6 classes.

This is still a breaking change since you can return an object or array from
getDefaultProps, which later gets mutated and now the shared instance is
mutated. Mutating an object that is passed into you from props is highly
discouraged and likely to lead to subtle bugs anyway. So I'm not too worried.

The defaultProps will later be resolved in the descriptor factory. This will
enable a perf optimizations where we don't create an unnecessary object
allocation when you use default props. It also means that ReactChildren.map
has access to resolved properties which gives them consistent behavior whether
or not the default prop is specified.
2014-06-26 15:40:12 -07:00
Sebastian Markbage
e6134c307e [react jsx transform] Spread attribute -> Object.assign
Add support for spread attributes. Transforms into an Object.assign just
like jstransform does for spread properties in object literals.

Depends on https://github.com/facebook/esprima/pull/22
2014-06-26 15:40:02 -07:00
Paul O’Shannessy
0cf686fe1e Merge pull request #1738 from cassus/master
Add missing markerStart, markerMid, markerEnd SVG attributes
2014-06-26 15:24:30 -07:00
Ben Alpert
991c1c1169 Fix typo in blog post 2014-06-26 15:19:24 -07:00
Paul O’Shannessy
7ec2428611 Merge pull request #1748 from pieterv/community-roundup-19-fix
Change community roundup 19's React Bootstrap author to @stevoland
2014-06-26 15:14:03 -07:00
Pieter Vanderwerff
deb47d5ecc Change community roundup 19's React Bootstrap author to @stevoland 2014-06-27 10:00:10 +12:00
Cheng Lou
dbf41a55a4 {Blog] Community Round-up #19 2014-06-26 13:53:14 -07:00
Paul O’Shannessy
3581a92fc3 Merge pull request #1642 from ryanseddon/trimCSSValues
Correctly trim strings for css properties
2014-06-25 22:02:54 -07:00
Paul O’Shannessy
295da0a795 Merge pull request #1741 from spicyj/mount-unused
Remove unused properties from ReactMount
2014-06-25 21:24:42 -07:00
Ben Alpert
b8ad5a23c6 Remove unused properties from ReactMount
(useTouchEvents lives in EventPluginUtils.)

Test Plan: jest
2014-06-24 22:03:43 -07:00
Cheng Lou
d52bebd07b Merge pull request #1716 from somethingkindawierd/master
Removes value attribute from rendered html of textarea
2014-06-24 19:14:19 -07:00
Paul O’Shannessy
56263c44e8 2 docs fixes.
Fix 404 and extra slash in url
2014-06-24 15:12:19 -07:00
Paul O’Shannessy
2496757364 Simple custom 404 page.
Github doesn't let us handle 404s within a project repository, so we
handle them at the organization level. In order to handle graceully for
specific projects, we're setting up redirects to projects' own 404.html.
2014-06-24 14:11:37 -07:00
Cheng Lou
a0486514a3 Merge pull request #1737 from spicyj/notime
Remove timing metrics from Transaction
2014-06-24 11:02:22 -07:00
Paul O’Shannessy
b018870091 Merge pull request #1664 from spicyj/warn-pooling
Add helpful message about pooled classes
2014-06-24 11:01:21 -07:00
Jon Beebe
e077dd40eb Adds empty onChange handler to textarea test 2014-06-24 07:26:07 -05:00
Cassus Adam Banko
30705f794c Add missing markerStart, markerMid, markerEnd SVG attributes 2014-06-24 11:17:34 +02:00
Ben Alpert
1c44b874fc Remove timing metrics from Transaction
No one uses these and they weren't meant to be left in.

Test Plan: jest
2014-06-23 20:32:12 -07:00
Ben Alpert
e65f17b86c Add helpful message about pooled classes
Hopefully this will make fewer people confused at all of the null properties. The string won't wrap nicely so I tried to keep it pithy:

https://s3.amazonaws.com/uploads.hipchat.com/6574/26709/v8vzKAC784QMkX2/upload.png
2014-06-23 14:30:40 -07:00
Cheng Lou
9d5ad77774 [Docs] Render null returns noscript now
Following #1495.
2014-06-23 13:52:09 -07:00
Cheng Lou
f81e213f41 Merge pull request #1495 from syranide/ie8noscript
Fix ReactEmptyComponent disappearing and throwing in IE8
2014-06-23 13:38:36 -07:00
Ryan Seddon
2bff5c5c7e Correctly trim strings for css properties
* If a unitless value is passed with a space it'll return `1 px`
2014-06-23 09:43:50 +10:00
Ben Alpert
14be8f4547 Merge pull request #1731 from cody/master
Fix example for animation
2014-06-22 12:11:11 -07:00
Stefan Dombrowski
c91f95a092 Fix example for animation
* Highlight the correct lines
* Add missing text to button
* Remove unnecessary div
2014-06-22 18:11:51 +02:00
petehunt
c33cceb466 Expose React.addons.Perf 2014-06-20 17:55:48 -04:00
Paul O’Shannessy
f0fc42af77 Merge pull request #1464 from spicyj/style-esc
Don't double-escape style names
2014-06-20 12:12:18 -07:00
Jonas Enlund
0377ec579e Added missing SVG attributes: fill-opacity, font-family, font-size, opacity, stroke-opacity.
Closes #1557
2014-06-20 12:45:31 -04:00
Josh Bassett
11486f1b31 Add 'patternContentUnits' to SVG attributes.
Closes #1702
2014-06-20 12:45:23 -04:00
Nate Hunzaker
3f29d5d6cb Add support for patternUnits attribute.
The patternUnits attribute defines how a pattern's coordinate system is
defined (x, y, width, height). This is particularly important when using
repeatable patterns in SVG. This commit adds this attribute to the lists
of known properties.

Closes #1548
2014-06-20 11:32:31 -04:00
Brandon Bloom
aebb3261ee Add support for SVG ellipse elements.
Closes #1675
2014-06-20 11:29:19 -04:00
Paul O’Shannessy
77150630e2 Merge pull request #1542 from remixz/gh-1420
Add harmony transform support in browser

Fixes #1420. Moved some code around in the merge to account for more
changes in the transform code.

Conflicts:
	vendor/browser-transforms.js
2014-06-20 10:55:06 -04:00
Andreas Svensson
b36e05b0af Fix ReactEmptyComponent disappearing and throwing in IE8 2014-06-20 10:08:49 +02:00
Ben Newman
3c64461383 Merge pull request #1710 from benjamn/fix-tests-broken-by-undefined-window-references
Fix tests broken by undefined `window` references in ReactEventListener.
2014-06-19 15:33:16 -04:00
Ben Newman
4cef56d73b Fix tests broken by undefined window references in ReactEventListener.
This test breakage blames to e1c2d02fdd.
2014-06-19 15:32:45 -04:00
Paul O’Shannessy
cc920a502f Merge pull request #1724 from spicyj/main-nor
Don't export (undefined) React in main.js
2014-06-19 12:21:13 -07:00
Paul O’Shannessy
af1af19d39 Sync out transform tests 2014-06-19 15:14:54 -04:00
Paul O’Shannessy
2c85658c69 [jsx] Make sure we throw when we get XML namespaces
aad8a2b798
replaced XJSIdentifer with XJSNamespacedName for namespaced items, so we
need to adjust here accordingly.
2014-06-19 15:07:08 -04:00
Ben Alpert
8a6e2cde7f Don't export (undefined) React in main.js
Previously, this was throwing an error. It was unintentionally (I assume) introduced in fc5bb9c.

Test Plan: jest
2014-06-19 11:34:50 -07:00
Paul O’Shannessy
324d41b5f0 Merge pull request #1244 from rayqian/master
add chinese translation support
2014-06-19 11:18:11 -07:00
Jon Beebe
b9c132e58a Removes value from rendered attributes of textarea 2014-06-19 07:14:49 -05:00
Ben Alpert
b0dce1543a Merge pull request #1721 from whatthejeff/patch-1
Fugbix typo.
2014-06-18 20:47:19 -07:00
Jeff Welch
27db8acaf9 Fugbix typo. 2014-06-18 23:36:37 -04:00
Paul O’Shannessy
92e3384cd2 Merge pull request #1513 from danielschonfeld/shouldcomponentupdate-boolean
Warn if shouldComponentUpdate returns anything other than true/false
2014-06-18 11:29:31 -07:00
Paul O’Shannessy
29083d0cec Merge pull request #1713 from bmihelac/patch-1
Missing semicolon in TodoStore.js
2014-06-18 11:17:04 -07:00
Bojan Mihelac
84135bc605 Missing semicolon in TodoStore.js 2014-06-18 10:34:53 +02:00
Ben Alpert
121b290899 Clarify refs and setState callback documentation 2014-06-17 23:20:04 -07:00
Cheng Lou
3d696312ef Merge pull request #1712 from mathieumg/master
Added example of objectOf usage in documentation.
2014-06-17 20:55:13 -07:00
Mathieu M-Gosselin
7fefab5946 Added example of objectOf usage in documentation. 2014-06-17 23:43:25 -04:00
Paul O’Shannessy
7f757347bc Update many npm dependencies
Sauce/connect related things need some more work and I didn't want to
figure those out right now.

Fixes #1701
2014-06-17 14:21:24 -07:00
Paul O’Shannessy
8bbbe900a5 Sync out camelize module
For use in #1662
2014-06-17 09:27:59 -07:00
Ben Alpert
00037b3ec2 Fix tagtree.tv link
Fixes #1697.
2014-06-16 13:56:36 -07:00
Paul O’Shannessy
08a207f401 Merge pull request #910 from andrewdavey/react-transform-source-map
Add sourceMap option to react-tools transform
2014-06-16 13:41:41 -07:00
Cheng Lou
20a50410a2 Merge pull request #1609 from spicyj/tlt-indirect
Remove unnecessary topLevelTypes indirection
2014-06-16 13:07:44 -07:00
Ben Alpert
52127dd7cf Remove unnecessary topLevelTypes indirection
topLevelTypes is a key mirror, so dependency and topLevelType are always the same here.
2014-06-16 12:18:19 -07:00
Pete Hunt
c93583c84f Remove bad perf metric
Remove a bad perf metric. Will investigate later.
2014-06-14 20:40:09 -07:00
Pete Hunt
e1c2d02fdd Create ReactEventListener
Per our discussion friday, this creates ReactEventListener and renames variables to use the "handle"
nomenclature.
2014-06-14 20:38:45 -07:00
Marshall Roch
a6cd945d9f Fix 'this' in static methods
binds static methods on the descriptor to the component's actual constructor, so that `foo.constructor.bar()` and `Foo.bar()` run with the same `this`.
2014-06-14 20:37:51 -07:00
Tim Yung
431155d2e2 Revert #1536
It's causing issues in product code. Reverting until it can be
investigated further.
2014-06-14 20:36:07 -07:00
Kunal Mehta
0f7423f31d Merge pull request #1661 from spicyj/test-ie10-select-multiple
Fix select switching to multiple in IE
2014-06-13 14:24:50 -07:00
Cheng Lou
3eb36415bd Merge pull request #1206 from brandonbloom/apply
$apply directive for update
2014-06-12 20:34:29 -07:00
Cheng Lou
4329d5ac38 Merge pull request #1611 from mathieumg/master
Added 'objectOf' PropType validator to iterate on objects and validate properties.
2014-06-12 20:19:33 -07:00
Brandon Bloom
86161c9c48 $apply command for update 2014-06-12 23:10:14 -04:00
Ben Alpert
7ab5769e18 Merge pull request #1687 from KyleAMathews/patch-2
typo fix
2014-06-12 16:29:19 -07:00
Kyle Mathews
cfdc884582 typo 2014-06-12 16:27:40 -07:00
Ben Alpert
5758f8da35 Merge pull request #1685 from randallsquared/patch-1
Fix correlation direction of wording in Ballmer Peak example.
2014-06-12 12:34:53 -07:00
Randall Randall
6d0e2feb52 Fix wording.
The Ballmer Peak XKCD suggests that it's a graph of ability, rather than bug frequency, which should be inversely correlated with ability.  A simple change of the wording fixes this terrible mishandling of Ballmer Peak data.
2014-06-12 10:15:13 -04:00
Mathieu M-Gosselin
4852c30d62 Added 'objectOf' PropType validator to iterate on object literals and
validate properties.
2014-06-11 21:12:05 -04:00
Cheng Lou
303a719f92 Merge pull request #1658 from spicyj/test-ie10-submit-label
Fix submit-button value test in IE10
2014-06-11 13:44:27 -07:00
Cheng Lou
9eff32c80c Merge pull request #1659 from spicyj/test-ie10-iframe
Fix EnterLeaveEventPlugin-test in IE10
2014-06-11 13:44:16 -07:00
Cheng Lou
92c174fec8 Merge pull request #1671 from gasi/fix-unset-style
Prevent null reference access when unsetting styles
2014-06-11 11:27:37 -07:00
Cheng Lou
36f2999d47 Merge pull request #1660 from spicyj/test-ie10-proptypesname
Fix PropTypes test in IE10
2014-06-11 10:34:28 -07:00
Ben Alpert
8e2dcceee3 Merge pull request #1597 from spicyj/defaultprops-autobind
Auto-bind before getDefaultProps
2014-06-11 10:14:31 -07:00
Ben Alpert
927eb570b9 Merge pull request #1631 from dblandin/master
Update link to @petehunt's react-server-rendering GitHub repo
2014-06-10 13:53:37 -07:00
Ben Alpert
e1e2fbdcf7 Merge pull request #1636 from harshadsabne/master
Update 2014-03-21-react-v0.10.md
2014-06-10 13:45:46 -07:00
Daniel Gasienica
7c2dec5bd3 Prevent null reference access when unsetting styles 2014-06-10 13:33:32 -07:00
Ben Alpert
2f61996ec3 [docs] Point to renderComponent over setProps 2014-06-08 13:04:40 -07:00
Ben Alpert
eaa68b8e6b Fix select switching to multiple in IE
This one was an actual behavioral bug rather than a bug with the tests; our intention was that the first element from the `defaultValue` array would remain selected but IE seemed to be choosing the last one instead. Now we set the value for uncontrolled components in componentDidUpdate when switching from multiple to non-multiple to ensure that a consistent option gets selected.

Test Plan: Ran the ReactDOMSelect tests in jest, phantomjs, IE10, Chrome, and Firefox. Also tested an uncontrolled select manually to make sure that nothing crazy happened when switching between options.
2014-06-07 19:16:34 -07:00
Ben Alpert
7cd5e9b399 Fix PropTypes test in IE10
Test Plan: Ran the test in jest, phantomjs, IE10, Chrome, and Firefox.
2014-06-07 18:56:28 -07:00
Ben Alpert
5790a75622 Fix submit-button value test in IE10
Test Plan: Ran test in jest, phantomjs, IE10, Chrome, and Firefox.
2014-06-07 18:50:29 -07:00
Ben Alpert
e938116549 Fix EnterLeaveEventPlugin-test in IE10
Previously this was failing because iframeDocument.body wasn't properly initialized. Creating the document this way seems to work in all environments

Test Plan: Ran the test in jest, phantomjs, IE10, Chrome, and Firefox.
2014-06-07 18:45:32 -07:00
cpojer
eebcf9f888 Fix ExecutionEnvironment.canUseDOM for IE8. 2014-06-05 12:44:24 -07:00
Christoph Pojer
41ed67d222 Merge pull request #1638 from spicyj/getmodifierstate-2
Fix getEventModifierState, no allocations
2014-06-03 14:36:16 -07:00
Ben Alpert
e501238c10 Fix getEventModifierState, no allocations
Alternative to #1637 that doesn't allocate on every event.

Test Plan: Crossed fingers.
2014-06-03 14:35:29 -07:00
Harshad Sabne
7172b1d5da Update 2014-03-21-react-v0.10.md
Fix link to React v0.10 RC
2014-06-03 21:35:49 +05:30
Pete Hunt
87bcbff218 Merge pull request #1632 from spicyj/img-load-error
Fix onLoad and onError on images
2014-05-30 17:04:41 -07:00
Ben Alpert
3e34739cb9 Fix onLoad and onError on images
Fixes bug introduced in c62c2c5.

Test Plan: Tested that the onLoad event was properly triggered on an image. Didn't test onError but I can only assume that it works equally well.
2014-05-30 16:53:46 -07:00
Devon Blandin
d8a2f12498 Update link to @petehunt's react-server-rendering GitHub repo 2014-05-30 14:14:18 -05:00
Cheng Lou
6ce193614c Merge pull request #1627 from Enome/master
Typo: ClosureScript -> ClojureScript in latest blog post
2014-05-29 16:20:42 -04:00
enome
b72d9f3aab Typo: ClosureScript -> ClojureScript 2014-05-29 22:10:15 +02:00
Ben Alpert
5a856c769d Merge pull request #1614 from chenglou/1-year
[Blog] One-year anniversary post
2014-05-29 11:41:51 -07:00
Cheng Lou
c5f690a7c7 [Blog] One-year anniversary post 2014-05-29 14:39:59 -04:00
Geert-Jan Brits
0c312222e9 Update todo example. fixes 'Create' that shouldn't happen
Currently, an `onBlur` creates a new todo on `TodoTextInput`. This makes sense for existing items but not for new items. I.e consider the following: 

1. cursor on new item ("What needs to be done?")
2. click 'x' on the first item. 

This results in two actions being fired: 

1. TODO_CREATE, with an empty string as 'text'
2. TODO_DESTROY

The proposed fix doesn't send a TODO_CREATE if `text.trim() === "")`
2014-05-29 14:45:42 +02:00
Ben Alpert
8d8dd4d336 Merge pull request #1620 from kmeht/jestDoc
Reference Jest in TestUtils documentation.
2014-05-28 23:53:37 -07:00
Kunal Mehta
055275b833 Reference Jest in TestUtils documentation. 2014-05-28 23:51:22 -07:00
Ben Alpert
3297909545 [docs] Fix grammar 2014-05-28 23:31:02 -07:00
Fred Zhao
50516585a4 Update findComponentRoot and processUpdates warnings for SVG
I ran into a really difficult-to-debug issue with a React app with SVG
elements. Christopher sat down with me for a while and we finally figured out
that the browser was moving non-SVG elements out of a parent `<svg>` node which
triggered the `processUpdates()` invariant. This updates the error message
thrown from there to include this scenario in the possible issues list.
2014-05-28 18:19:49 -07:00
Paul O’Shannessy
6c7abd36dd Sync upstream modules
crateObjectFrom is no longer used (was used in ReactPropTypes). Others are small changes.
2014-05-28 15:13:02 -07:00
Ben Alpert
2e3cf459ba Fix tutorial to have exact translation of example
Fixes #903.
2014-05-28 10:29:34 -07:00
Paul O’Shannessy
0ad8cfad1a Merge pull request #1590 from spicyj/svg-classname
Handle className properly on SVG nodes
2014-05-28 10:14:59 -07:00
Paul O’Shannessy
f230e0a031 Merge pull request #1583 from nhunzaker/jsxtransform-parallel
Load external scripts in parallel in JSXTransformer
2014-05-27 14:31:25 -07:00
Timothy Yung
bca1f0e352 Merge pull request #1536 from spicyj/gh-1169
Attach empty onclick listener to each node
2014-05-27 16:44:08 -04:00
Ben Alpert
e096000bb5 Attach empty onclick listener to each node
Fixes #1169.

This is a more robust way of fixing what MobileSafariClickPlugin previously tried to. Now even if you don't want anything to do with touch events, click events still work properly.

Test Plan: Added a click handler to an `<img />` element and triggered it in the iOS simulator -- it didn't execute before.
2014-05-27 13:40:17 -07:00
Paul O’Shannessy
fa6fe54432 Merge pull request #1596 from mindeavor/patch-1
Fix typo in Flux TodoMVC Tutorial
2014-05-27 11:07:09 -07:00
Tom Haggie
cd3ba59cf1 Updated the ajax to tip to also mention that you need to check
that the component is still mounted before updating it's state.

Closes #1600.
2014-05-26 20:29:48 -07:00
Ben Alpert
03df8d7de0 Ignore built todomvc-flux bundles 2014-05-26 20:27:48 -07:00
Ben Alpert
f761f770e1 Don't load todomvc-common/base.js
Fixes #1603.

It's unnecessary and makes a request to learn.json which doesn't exist.
2014-05-26 20:19:16 -07:00
Ben Alpert
db4a90a9ef Capitalize README for consistency 2014-05-26 20:14:54 -07:00
Ben Alpert
8a460ba2e8 Auto-bind before getDefaultProps
Fixes #1595.
2014-05-25 00:40:39 -07:00
Gilbert
330fa30141 Fix typo in Flux TodoMVC Tutorial
A sentence says "only handles one actionType" when the example code instead handles two.
2014-05-25 00:21:31 -05:00
Ben Alpert
e1457a14fd Run all tests, fix indentation 2014-05-23 23:03:13 -07:00
Ben Alpert
1e268c3591 Merge pull request #1556 from joshma/flux-dispatcher-docs
Update Flux Dispatcher.dispatch and waitFor examples
2014-05-23 23:01:25 -07:00
Ben Alpert
3e30940bf3 Bump to React 0.10 in TodoMVC Flux 2014-05-23 16:09:47 -07:00
Paul O'Shannessy
7a9b81ef55 remove spurios module ref
long long ago in a galaxy far away this was probably a dependency
2014-05-23 15:35:22 -07:00
Joshua Ma
7954a861d1 Add more complicated fourth listener to AppDispatcher-test 2014-05-23 12:42:09 -07:00
Joshua Ma
a616742fce Configure todomvc-flux npm test to use jest 2014-05-23 12:36:38 -07:00
Joshua Ma
f8d0291874 Fix doc typo and remove underscore from local var 2014-05-23 12:34:40 -07:00
Paul O'Shannessy
c62c2c59bb Remove event listeners from native dom wrapper components
Not removing them resulted in leaks as we would hold on to removed nodes forever.

This really showed up with images and the load event where we would unmount and create a new img with the same react id as the old one. We properly cleared and primed the caches but we would handle the load event for both nodes. We would eventually hit an invariant in that path as we tried to handle the event for the removed node, which no longer matched the node we had in the cache.

By forcefully removing the listener, we'll avoid this problem entirely and we should leak fewer DOM nodes.
2014-05-23 11:30:19 -07:00
Ben Alpert
37f61c479e Handle className properly on SVG nodes
This strategy avoids a runtime check for every set (as opposed to using a mutation method).

Test Plan: Verify that changing className works on a div and a rect in latest Chrome, latest Firefox, IE9. Verify that the div works in IE8.
2014-05-22 20:31:04 -07:00
Ben Alpert
e60a893d2f Bump esprima-fb and jstransform versions
Fixes #1584, fixes #1475.
2014-05-22 20:16:37 -07:00
Jeff Morrison
9ef6156d5c Merge pull request #760 from syranide/jsxns
Support for JSX tag namespaces <React:DOM:div />
2014-05-22 15:51:49 -07:00
Paul O’Shannessy
f9ad17db65 Merge pull request #1363 from spicyj/batch-all
Batch subupdates caused by any state update
2014-05-22 15:28:48 -07:00
Ben Alpert
49652c8e20 Merge pull request #1575 from spicyj/dispatch-index
Make promise selection logic clearer
2014-05-21 15:39:53 -07:00
Paul O’Shannessy
cccdc54b68 Merge pull request #1576 from spicyj/ex-shim
Add shims to examples
2014-05-21 15:16:51 -07:00
Ian Obermiller
bf5dfc87dc Error in extractEvents
If the event is on the window object, topScroll, for instance, the topLevelTarget will not have getAttribute defined. Restore the previous `|| !topLevelTarget.attributes` check to avoid an error on every scroll.
2014-05-21 15:12:26 -07:00
Ben Alpert
696e556eae Merge pull request #1579 from gscottolson/master
Improve readability of multi-line nav items.
2014-05-21 12:30:28 -07:00
G Scott Olson
c9bac95034 Fix nested UL spacing. 2014-05-21 15:26:01 -04:00
Nate Hunzaker
59a9251c90 Set executed after run 2014-05-21 15:09:52 -04:00
Nate Hunzaker
b1247690d5 Load in parallel, evaluate linearly as they come in 2014-05-21 15:07:10 -04:00
Pete Hunt
6c34151588 Merge pull request #1577 from piranha/master
better talk in russian
2014-05-21 11:26:29 -07:00
G Scott Olson
7094737782 Improve readability of multi-line nav items. 2014-05-21 10:55:42 -04:00
Alexander Solovyov
4595dbdc7a better talk in russian 2014-05-21 11:52:24 +03:00
Ben Alpert
4cb4bd0220 Add shims to examples
I find myself often using (modified) examples to test in IE and it's a pain to have to add the shims in every time. Might as well just add them in always.
2014-05-21 00:07:18 -07:00
Ben Alpert
e58899cdff Make promise selection logic clearer 2014-05-20 17:09:05 -07:00
Paul O’Shannessy
c6309567c9 Merge pull request #1559 from spicyj/gh-1376
Allow unmounting title tag
2014-05-20 11:23:36 -07:00
Paul O’Shannessy
e63eab111c Merge pull request #1553 from givingstage/invalid_checksum_warning_spacing
Fixed spacing of invalid checksum warning
2014-05-20 11:23:19 -07:00
Paul O’Shannessy
6c595d55dc Merge pull request #1571 from spicyj/style-test
Switch style test to pass in jsdom
2014-05-20 11:22:30 -07:00
remixz
765ee8e5d0 Merge upstream changes 2014-05-19 20:12:57 -07:00
Ben Alpert
2d26451821 Add configuration for running tests with Jest
Can be run with `node_modules/.bin/jest` for now; didn't want to disturb the grunt setup.

Right now one test fails with:

```
 FAIL  browser/ui/__tests__/ReactDOMComponent-test.js (1.423s)
● ReactDOMComponent › updateDOM › it should update styles when mutating style object
  - Expected: '0' toEqual: '0.5'
        at Spec.<anonymous> (src/browser/ui/__tests__/ReactDOMComponent-test.js:99:33)
```

which I can only assume is a jsdom problem -- no other asserts fail.
2014-05-19 16:58:33 -07:00
Ben Alpert
4e5ed8317b Switch style test to pass in jsdom
This should be testing approximately the same thing and passes in Jest.

Test Plan: Cherry-pick Jest config from #1528 and verify that running `jest`.
2014-05-19 16:56:30 -07:00
Ben Alpert
e17086e5df Add componentWillReceiveProps setState test 2014-05-19 15:58:40 -07:00
Paul O’Shannessy
5933d97cb6 Merge pull request #1563 from spicyj/travis-no-sauce
Don't fail Travis on sauce failures
2014-05-19 13:28:09 -07:00
Ben Alpert
8db8e60a38 Don't fail Travis on sauce failures
Fixes #1496.
2014-05-19 13:23:07 -07:00
Paul O’Shannessy
ab58ecefa7 Merge pull request #1564 from spicyj/hop-ie8
Use Object.prototype.hasOwnProperty for doc in IE8
2014-05-19 13:15:25 -07:00
Ben Alpert
550795445e Use Object.prototype.hasOwnProperty for doc in IE8
Test Plan: Loaded ballmer-peak example in IE8 without errors and interacted with the text field.
2014-05-19 13:09:47 -07:00
Paul O’Shannessy
0c6bee049e Merge pull request #1189 from spicyj/hasown
Add hasOwnProperty checks where appropriate
2014-05-19 09:38:56 -07:00
Ben Alpert
4935d04d50 Allow unmounting title tag
cf. #1376.

This is useful for SVG. Dynamically adding and removing `<title>` elements in SVG still won't work properly because of getMarkupWrap but this at least lets you include it in initial render and then unmount the entire `<svg>` without problems.
2014-05-18 23:19:51 -07:00
Nate Hunzaker
0614cfa43e Load scripts in parallel 2014-05-18 16:34:40 -04:00
Ben Alpert
66291d2761 Merge pull request #1558 from nhunzaker/fix-1530
Fix 1530 - Asynchronously load scripts with JSX transformer
2014-05-18 13:04:11 -07:00
Nate Hunzaker
bc79f623a1 Asynchronously load scripts with JSX transformer. 2014-05-18 15:41:41 -04:00
Andrew Davey
2b38795769 Rebased on master 2014-05-18 17:51:14 +01:00
Andrew Davey
fc5bb9c9b2 Add sourceMap option to react-tools transform
Allow tools like grunt-react to include inline source maps in the
generated JavaScript. Browserify can then combine these source maps when
bundling everything together.

Usage:

```
var transform = require('react-tools').transform;
var output = transform(jsxContent, {
  sourceMap: true,
  sourceFilename: 'source.jsx'
});
```

The `output` will have an inline source map comment appended.
2014-05-18 17:42:35 +01:00
Ben Alpert
1baca43391 Mention PropTypes in top-level API
cf. #449
2014-05-18 00:15:35 -07:00
Ben Alpert
f1a5a4c58e Be more specific with createClass, renderComponent
Closes #371.
2014-05-18 00:15:35 -07:00
Ben Alpert
566af16e64 Tweak getting started wording 2014-05-18 00:15:35 -07:00
Joshua Ma
de1f783188 Update todomvc dispatcher to match docs, add AppDispatcher test 2014-05-17 22:01:18 -07:00
Joshua Ma
f12a376f34 Update Flux Dispatcher.dispatch and waitFor examples
The previous examples didn't properly work when 1) a Store callback does
waitFor on Stores that haven't been reached yet and 2) a Store callback
waits on another Store that is already waiting.

The updated example uses constructs Promises up front and then
asynchronously resolves them.
2014-05-17 21:17:08 -07:00
Thomas Shafer
0a7128c70f Fixed spacing of invalid checksum warning 2014-05-17 20:04:52 -07:00
Ben Alpert
e9653aad6a Merge pull request #1552 from t3chnoboy/master
Update Jasmine link
2014-05-17 18:33:51 -07:00
Dmitry Mazuro
8192b8c27f Update Jasmine link 2014-05-18 04:30:02 +03:00
Ben Alpert
78958fe0f5 Remove references to autoflow
Most references were removed in 6e59561; this should be the last.
2014-05-17 15:15:26 -07:00
Ben Alpert
6c331fba07 Add hasOwnProperty checks where appropriate
For boolean-like objects, I've added hasOwnProperty checks in addition to the existing truthiness check even though for most of these dicts, we leave out false keys instead of setting them explicitly to false.

In DOMPropertyOperations, we don't need to check hasOwnProperty if the property is in isStandardName because (with the exception of getPossibleStandardName) the dicts on DOMProperty will now be consistently populated with every valid attribute.
2014-05-16 10:59:51 -07:00
Paul O’Shannessy
4558e2c4bc Merge pull request #1491 from naturalatlas/itemscope
Added support for itemscope, itemtype, itemprop attributes.
2014-05-15 14:48:51 -07:00
Jan Kassens
46de927a28 Merge pull request #1537 from chenglou/rm-filter-attrs
Remove filterAttributes.js
2014-05-15 12:16:35 -07:00
Cheng Lou
80a5463a2c Remove filterAttributes.js
This is no longer needed because of 089a494a1f

mutateHTMLNodeWithMarkup.js was the only one using it.
2014-05-15 14:14:38 -04:00
Ben Alpert
c913c95908 Update Simulate docs to reflect reality
cf. #1532, #1445.
2014-05-14 21:39:00 -07:00
remixz
3f31ec463f Change harmony option to "harmony=true" 2014-05-14 15:50:35 -07:00
remixz
65c258a7b7 Add harmony transform support in browser (Fixes GH-1420)
I implemented this by checking for `type="text/jsx;harmony"`, since this
has a bit of a cleaner implementation rather than parsing a JSON object
out of a data attribute. If in the future there are other options to
pass, it would make sense to move to a system like that.

Along with adding support, there is also a new example added that's
the basic-jsx example with Harmony syntax.
2014-05-13 22:07:02 -07:00
Daniel Schonfeld
7d91277a50 warn when shouldComponentUpdate() returns undefined 2014-05-13 22:44:00 -04:00
Pete Hunt
b66202eb98 Merge pull request #1487 from somethingkindawierd/master
Adds svg mask and pattern dom components
2014-05-13 11:28:59 -07:00
Ben Alpert
808a54f410 Batch subupdates caused by any state update
With this, multiple setState calls triggered by a componentDidUpdate handler (or similar) will be batched together, regardless of if the original setState call was in a batching context.

I also cleaned up some inconsistencies with the order of component updates and callbacks in situations where one component's update directly causes another to update.

Fixes #1147. Helps with #1353 and #1245 as well, though doesn't completely fix them yet.

Test Plan:
grunt test
2014-05-13 10:50:26 -07:00
Paul O’Shannessy
a00199ddd2 Merge pull request #1358 from spicyj/one-transaction
Share reconcile transaction in batched updates
2014-05-13 10:47:03 -07:00
Josh Duck
29f3f74c52 Make perf show all exclusive time, not just render time.
Currently require('ReactDefaultPerf').printExclusive() shows render
time and aggregate componentMount time.

This makes it show exclusive mount time by tracking a stack.
2014-05-12 16:39:09 -07:00
Pete Hunt
7268f44c94 Merge pull request #1504 from spicyj/flux-621
Start Flux video at 10m21s
2014-05-12 13:44:21 -07:00
Pete Hunt
e4f80f301d Merge pull request #1516 from syranide/es5err
Preemptively error when required ES5 shim/shams are not available
2014-05-12 13:40:00 -07:00
Ben Alpert
d46e1588f9 Update Flux README to point at website post/docs 2014-05-12 01:33:53 -07:00
Ben Alpert
76abdddae8 todomvc-flux: Depend on uglify-js, not uglifyjs
Fixes #1505.

Confusingly, the uglify-js package provides the `uglifyjs` binary and `npm run-script build` didn't work if uglify-js wasn't installed globally; now it does.
2014-05-12 01:14:01 -07:00
Andreas Svensson
659b7981e1 Preemptively error when required ES5 shim/shams are not available 2014-05-11 21:20:07 +02:00
Ben Alpert
6b1c546602 Add missing emitChange() to Flux docs 2014-05-10 17:50:26 -03:00
Ben Alpert
6b758ef283 Merge pull request #1503 from dybskiy/patch-2
Update flux-todo-list.md
2014-05-09 15:38:18 -03:00
Ben Alpert
39a0dbaebe Start Flux video at 10m21s 2014-05-09 15:34:12 -03:00
Yuriy Dybskiy
d5a5840d31 Update flux-todo-list.md
Fix broken link to todomvc-flux repo

@spicyj cla signed
2014-05-09 11:11:42 -07:00
Daniel Lo Nigro
bf957c6c50 Fix minor typo 2014-05-09 10:01:40 -07:00
Brian Reavis
f399b68201 Stylistic changes. 2014-05-08 23:25:10 -07:00
fisherwebdev
39ec28f6f4 update Flux tutorial link 2014-05-08 19:57:19 -07:00
Christopher Chedeau
7f9a8385b6 Merge pull request #1499 from vjeux/flux
Flux blog post and tutorial
2014-05-08 16:26:43 -07:00
Vjeux
46995dd2fe Flux blog post and tutorial 2014-05-09 01:22:47 +02:00
Paul O’Shannessy
c4ed2c1c90 Move tagtree image to docs/
Missed this in #1470
2014-05-08 11:52:32 -07:00
Paul O’Shannessy
8af991f10b Codemod mockReturnValue externally
320024555c didn't update the mocks module
here, just the callsites.
2014-05-08 10:47:44 -07:00
Christopher Chedeau
320024555c Codemod mockDefaultReturnValue
The naming is super confusing.

mockReturnValue -> mockReturnValueOnce
mockDefaultReturnValue -> mockReturnValue
2014-05-08 10:11:38 -07:00
Paul O’Shannessy
562b1b201e Merge pull request #1492 from spicyj/rtg-from-false
ReactTransitionGroup: Fix moving from falsey child
2014-05-08 09:46:49 -07:00
Jon Beebe
c50dbb0ec1 Adds svg pattern and mask components 2014-05-08 07:16:28 -05:00
Paul O’Shannessy
32b84a4c5e Merge pull request #1460 from spicyj/tg2
Actually fix transitioning to null
2014-05-07 17:12:05 -07:00
Andreas Svensson
aa044c6b61 Add support for JSX member expressions <React.DOM.div /> 2014-05-08 00:10:10 +02:00
Paul O’Shannessy
aa46ab1862 Merge pull request #1486 from nbostrom/patch-1
Embed video from F8
2014-05-07 11:09:19 -07:00
Paul O’Shannessy
67c68612c0 Title case on videos page 2014-05-07 11:07:49 -07:00
Paul O’Shannessy
9926a2d7f9 Merge pull request #1490 from Vijar/master
Fixed incorrect usage of github api in example
2014-05-07 11:01:05 -07:00
Paul O’Shannessy
4a24283559 Merge pull request #1276 from marcins/bugfix/1275-transitiongroup-android
Fix transition end detection for Android
2014-05-07 10:54:37 -07:00
Paul O’Shannessy
c7c3027081 Small style fixup 2014-05-07 10:44:30 -07:00
Brian Reavis
bfcd4cac48 Use camelCase and declare MUST_USE_ATTRIBUTE. 2014-05-07 10:02:57 -07:00
Ben Alpert
5c9224145e ReactTransitionGroup: Fix moving from falsey child
See http://stackoverflow.com/q/23510413/49485.

Test Plan: grunt fasttest
2014-05-07 09:54:23 -03:00
Brian Reavis
2b196b7cd2 Updated documentation. 2014-05-07 00:41:50 -07:00
Brian Reavis
0fe2fcc27e Added support for itemscope, itemtype, itemprop. 2014-05-07 00:37:06 -07:00
Rajiv Tirumalareddy
b360ed80dd Fixed incorrect usage of github api in example
more: https://developer.github.com/v3/gists/#detailed-gist-representation
2014-05-06 16:42:07 -07:00
Christopher Chedeau
52e1b42d26 Merge pull request #1480 from volkanunsal/patch-1
Update Dispatcher.js
2014-05-06 16:40:14 -07:00
Jon Beebe
c50ad81b06 Adds svg mask and pattern dom components 2014-05-06 11:21:47 -05:00
Paul O’Shannessy
88c94683d6 Revert "Move defaultProps resolution and type validation to the descriptor"
This reverts commit ff52e3df00.

Too many things broke with transferPropsTo
2014-05-06 09:09:51 -07:00
Niklas Boström
dea228e4ae Embed video from F8
Edited in githubs inline editor. Not tested!
2014-05-06 15:18:02 +02:00
Sebastian Markbage
ff52e3df00 Move defaultProps resolution and type validation to the descriptor
This copies the propType and contextType validation to a wrapper around the
descriptor factory. By doing the validation early, we make it easier to track
down bugs. It also prepares for static type checking which should be done at the
usage site.

This validation is not yet active and is just logged using monitorCodeUse. This
will allow us to clean up callsites which would fail this new type of
validation.

I chose to copy the validation instead of abstracting it out to a common abstraction. This is just an
intermediate step to avoid spamming consoles. The original validation in the instance will be deleted as soon as we can turn on the warnings at the callsite. Copy+Delete makes this a more a much cleaner diff review/history.

Additionally, getDefaultProps are moved to become a static function which is
only executed once. It should be moved to statics but we don't have a
convenient way to merge mixins in statics right now. Deferring to ES6 classes.

This is still a breaking change since you can return an object or array from
getDefaultProps, which later gets mutated and now the shared instance is
mutated. Mutating an object that is passed into you from props is highly
discouraged and likely to lead to subtle bugs anyway. So I'm not too worried.

The defaultProps are now resolved in the descriptor factory. This will enable
a perf optimizations where we don't create an unnecessary object allocation
when you use default props. It also means that ReactChildren.map has access to
resolved properties which gives them consistent behavior whether or not the
default prop is specified.

This is a breaking change since it can affect how mapping over children and
transferPropsTo works together with defaultProps.
2014-05-05 17:03:54 -07:00
Paul O’Shannessy
b48a534f6f Merge pull request #1032 from fforw/master
Additional SVG tag and attribute names
2014-05-05 16:54:57 -07:00
Ben Alpert
486b3c0bc5 Move envify from peerDependencies to dependencies
Fixes #1482, closes #1483.

This shouldn't make a practical difference to us and will apparently fix browserify-cdn.
2014-05-05 20:26:23 -03:00
Isaac Salier-Hellendag
d6731e7a0b Merge pull request #776 from syranide/superkey
Even better normalization of KeyboardEvent + MouseEvent
2014-05-05 16:19:02 -05:00
Paul O’Shannessy
c253c786a9 Merge pull request #1468 from dschafer/tutorial
Update jsfiddles in thinking-in-react to remove handleSubmit from forms
2014-05-05 13:10:28 -07:00
volkanunsal
035a648a2d Update Dispatcher.js 2014-05-05 12:20:25 -04:00
volkanunsal
c81c07c816 Update Dispatcher.js 2014-05-04 19:15:44 -04:00
volkanunsal
a7823a3624 Update Dispatcher.js 2014-05-04 19:08:46 -04:00
volkanunsal
31477dbf94 Update Dispatcher.js
I think Array.filter expects a boolean return value, am I correct?
2014-05-04 19:04:51 -04:00
Ben Alpert
f1096c6bb3 Fix ASCII-art arrow alignment 2014-05-03 23:45:12 -03:00
Paul O’Shannessy
064abe3d49 Merge pull request #1470 from hendrikswan/master
Link to tagtree 'Thinking in React' video - on master
2014-05-02 15:22:27 -07:00
Pete Hunt
b02a5dc0f8 Merge pull request #1479 from fisherwebdev/master
Clean up Flux documentation and add more info about dependencies btwn stores
2014-05-02 23:56:06 +02:00
fisherwebdev
b0f82bfe4c Clean up Flux documentation and add more info about managing dependencies between stores 2014-05-02 13:22:15 -07:00
hendrik swanepoel
cdac160439 Fixed a couple of issues with link to tagtree.tv video 2014-05-02 21:28:31 +02:00
Paul O’Shannessy
0dd8f551c0 Merge pull request #1477 from KyleAMathews/patch-1
Typo in Flux example readme
2014-05-02 12:05:20 -07:00
Kyle Mathews
72b830ec4c Typo 2014-05-02 11:10:13 -07:00
petehunt
fa154e6e21 Add some backticks to flux docs 2014-05-02 16:44:43 +02:00
Pete Hunt
d567f37bc3 Merge pull request #1476 from fisherwebdev/master
Additional Flux documentation
2014-05-02 16:42:20 +02:00
fisherwebdev
b97cf7a180 Additional Flux documentation 2014-05-02 07:17:49 -07:00
Andreas Svensson
bf7826c68d Normalize and polyfill KeyboardEvent further, also MouseEvent+TouchEvent
KeyboardEvent now normalizes "charCode", "keyCode", "which" across all browsers
KeyboardEvent has partial "key"-support for KeyDown/KeyUp and full "key"-support for KeyPress.
KeyboardEvent, MouseEvent and TouchEvent now has "getModifierState", polyfill when not implemented.
2014-05-01 16:56:43 +02:00
hendrik swanepoel
6323db7c18 link to tagtree 'Thinking in React' video 2014-05-01 11:30:21 +02:00
dschafer
fbbace6b69 Update jsfiddles in thinking-in-react to remove onSubmit from forms 2014-04-29 19:53:13 -07:00
Ben Alpert
da34209148 Don't double-escape style names
Previously we were escaping both in createMarkupForStyles and then in createMarkupForProperty; now we escape only in the latter (otherwise the hypothetical style name `b&ckground` would become `b&amp;amp;ckground`).

Test Plan: grunt fasttest
2014-04-29 15:50:12 -03:00
Christopher Chedeau
32d80aa5eb Merge pull request #1462 from spicyj/lint
Fix some linty things
2014-04-29 11:34:30 -07:00
Christopher Chedeau
92a3e94528 Merge pull request #1459 from spicyj/ti
Move tooling info to Complementary Tools wiki
2014-04-29 11:33:50 -07:00
Christopher Chedeau
3eee27ebc8 Merge pull request #1463 from andreypopp/example-commonjs
Add basic CommonJS example with browserify
2014-04-29 10:58:14 -07:00
Andrey Popp
93fed1a459 Add basic CommonJS example with browserify 2014-04-29 21:57:08 +04:00
Ben Alpert
d5a4d29532 Fix some linty things 2014-04-28 23:30:05 -03:00
Ben Alpert
0d3622714c Don't escape slash; it's unnecessary
Fixes #1444.

Test Plan: grunt fasttest
2014-04-28 23:22:03 -03:00
Ben Alpert
4b51708ed2 Actually fix transitioning to null
Test Plan: grunt fasttest
2014-04-28 22:16:59 -03:00
Ben Alpert
05cc7b635c Move tooling info to Complementary Tools wiki
I moved the info that was here to the wiki page: https://github.com/facebook/react/wiki/Complementary-Tools; it doesn't need to live in the website any more.
2014-04-28 21:03:19 -03:00
Pete Hunt
b9e215d169 Merge pull request #1458 from spicyj/gh-1457
ReactTransitionGroup: Fix changing to null child
2014-04-28 17:00:22 -07:00
Ben Alpert
9dbbaf12bf ReactTransitionGroup: Fix changing to null child
Fixes #1457.

Test Plan: grunt fasttest
2014-04-28 20:52:42 -03:00
Paul O’Shannessy
d657479a9d Merge branch 'spicyj-nested-render' from #1402 2014-04-27 13:15:58 -07:00
Cheng Lou
8b23a7e699 Warn instead of throw for nested render calls 2014-04-27 13:15:42 -07:00
Cheng Lou
3a796ab47c Merge pull request #1455 from jeffmo/master
Bump jstransform dependency to point at 4.0.1 or higher
2014-04-26 15:38:32 -07:00
jeffmo
a7c3dc8b08 Bump jstransform dependency to point at 4.0.1 or higher 2014-04-26 15:34:40 -07:00
Pete Hunt
50eb9b3e50 Merge pull request #1452 from chenglou/perf-fix
Fix perf suite broken by descriptor change
2014-04-25 11:10:27 -07:00
Cheng Lou
5158a022df Fix perf suite broken by descriptor change 2014-04-25 10:38:17 -07:00
Marcin Szczepanski
cc56629620 Fix transition end detection for Android
Some Android versions have the "transition" and "animation" properties
set on element style objects despite not supporting un-prefxied animations
and transitions.  This change adds an additional sanity check to make sure
the correct event handlers are added for transition groups.
2014-04-25 13:19:25 +10:00
Paul O’Shannessy
28820e0adb Merge pull request #887 from syranide/textdocument
Test innerText/textContent on document.documentElement instead
2014-04-24 16:10:13 -07:00
Paul O’Shannessy
83687b927d Merge pull request #1450 from sahat/patch-1
Update build status svg badge
2014-04-24 15:45:19 -07:00
Sahat Yalkabov
f98995fe08 Update build status svg badge 2014-04-24 18:41:34 -04:00
Paul O’Shannessy
a0dc45e652 Merge pull request #879 from syranide/inlinechild
Remove unnecessary tests from insertChildAt and inline it instead
2014-04-24 15:02:14 -07:00
Andreas Svensson
a9a398b15a Test innerText/textContent on document.documentElement instead 2014-04-24 23:51:05 +02:00
Andreas Svensson
9ee1d92b52 Remove unnecessary tests from insertChildAt and inline it instead 2014-04-24 23:44:41 +02:00
Isaac Salier-Hellendag
cc292c1e22 Fix IE11 collapsed ranges in ReactDOMSelection
In IE10/11, it is apparently possible to have a Selection or Range object that has the following properties:

  - `anchorNode` === `focusNode` (Selection) or `startContainer` === `endContainer` (Range)
  - `anchorOffset` === `focusOffset` (Selection) or `startOffset` === `endOffset` (Range)
  - `isCollapsed` === `false` (Selection) or `collapsed` === `false` (Range)

As defined in http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html, this doesn't really make sense. Since the nodes and offsets are the same, the "collapsed" value should be `true`.

Moreover, when calling `selection.toString()` in this case, it appears that the entire text contents of `body` -- including `<script>` tag contents -- are considered within the selection. I thought maybe the selected nodes were missing from the DOM or something, but no, they're there.

Sidestep all of this in `ReactDOMSelection` by calculating the `collapsed` property manually and setting the selection length directly to zero if it is actually collapsed.

Side note: I think that for selection restoration on contenteditables, we shouldn't try to do this offset calculation. We should just use the structure provided natively (nodes and offsets) since we can restore using that structure as well.
2014-04-24 12:53:08 -07:00
Sven Helmberger
8e0d17c756 Add tspan to JSX transform 2014-04-24 19:13:01 +02:00
Sven Helmberger
0f0328f093 Current set of must-have SVG attributes / tag
The current set of SVG attributes / tag I felt like I needed
them absolutely for my React/SVG editor app.
2014-04-24 19:12:58 +02:00
Jeff Morrison
1b022e9b3a Merge pull request #1441 from zpao/update-jstransform
Upgrade jstransform to 4.0
2014-04-23 16:49:11 -07:00
Cheng Lou
7fa656dae9 Don't let new keys on style from transferPropsTo override old ones
Previous behavior: `transferPropsTo(<div style={{color: 'red'}} />)` would get `color` overriden if we transfer in a `style={{color: 'blue'}}`. This is inconsistent with how other props are transfered.

This simply reverses the order of arguments.

closes #1435
2014-04-23 16:44:32 -07:00
Paul O’Shannessy
4ed9e22a44 Upgrade jstransform to 4.0
Also enables the object-concise-method transform for --harmony

closes #1438
2014-04-23 16:36:45 -07:00
Paul O'Shannessy
3d605da15f Split DefaultDOMPropertyConfig
This makes it a little easier to add SVG properties. It also makes use of that injection that we claim is easy to use and will likely start playing a bigger part soon.

Closes #1009
2014-04-23 16:22:10 -07:00
Paul O’Shannessy
ff60e81fa9 Remove whitespace_transformer package
This was a one-time use thing, let's get rid of it. If we ever need to
push an update, we'll do it from the 0.9-stable branch.
2014-04-23 16:00:44 -07:00
Pete Hunt
df72bd76be Update videos.md 2014-04-23 15:45:48 -07:00
Jan Kassens
514f5fb98b fix warnings in cloneWithProps test
Don't test refs in this case, already testing warning above
2014-04-23 14:14:45 -07:00
Jan Kassens
9e9d8dbe76 fix warnings in ReactComponentLifeCycle test
Don't use inputs to avoid warnings in tests
2014-04-23 14:14:42 -07:00
Jonas Gebhardt
01d41f6e18 better error message for React EventPlugin order check
Ran into this while inadvertently requiring multiple React versions in a separate project (`require('react');` vs `require('React');`
2014-04-21 15:42:25 -07:00
Jan Kassens
4c199daa26 fix log spew from ReactDOMTextarea test
Similar to previous but for textarea. If `value` is set, we have to also set
`onChange` to avoid warnings.
2014-04-21 15:42:00 -07:00
Jan Kassens
089146b2f8 fix log spew from ReactDOMInput test
The prop validation threw a warning that either `onChange` or `readOnly` is required. Set the `onChange` where needed.
2014-04-21 15:41:50 -07:00
Paul O'Shannessy
c8933b947b unbreak server-side/web worker
We're now trying to access document directly at require time. Wrapping in a function prevented that before. But we can simply check what environment we're in first.
2014-04-20 11:44:01 -07:00
Juraj Dudak
385eb1cef1 Fixed a bug in expectRenderedChildAt
React components have _mountIndex, that looks like it is their order in DOM.
If you swap 2 elements in DOM, their order in children array isn't changed, but their _mountIndex is
2014-04-18 12:57:24 -07:00
Christoph Pojer
9a13393ce3 Remove function wrappers in DOMSelection
There is no point in doing the feature detection on every call, unless there is an IE bug where it is not sure about which support for selection it has (totally plausible).
2014-04-18 12:57:05 -07:00
Jonas Gebhardt
3a49ee7d82 Add typed ReactLink to ReactProps
Adds a PropType that checks for proper use of the ReactLink API and optionally validates the type of value passed in via the link. Basically, it's a wrapper around PropTypes.shape that hides the implementation of ReactLink.
2014-04-18 12:56:46 -07:00
Cheng Lou
0a5c22264b Make custom PropTypes return error rather than whatever
The new rule for PropTypes is that it should return an error object if validation fails, not throw, not warn.
2014-04-18 12:56:25 -07:00
Cheng Lou
4487831281 Allow false as an acceptable renderable type value
`false` is renderable.
2014-04-18 12:56:06 -07:00
Cheng Lou
3ee081b125 Merge pull request #1188 from spicyj/comp-spec-inv
Add clearer invariants to composite spec mixing
2014-04-17 12:50:29 -07:00
Cheng Lou
13f799ee8e Merge pull request #1419 from spicyj/inv-process
Add clearer invariant in processUpdates
2014-04-17 01:30:58 -07:00
Ben Alpert
945d041160 Add clearer invariant in processUpdates
The `updatedChildren[j].parentNode.removeChild(updatedChildren[j]);` line below can fail if (1) we're moving/moving the same node twice or (2) the node we're looking for is gone completely. This makes it easier to distinguish between the two cases.

Perf shouldn't be a concern here because this is DOM code and invariants are fast in comparison.

Test Plan: grunt test
2014-04-16 15:09:31 -07:00
Cheng Lou
e9c00b1bae Remove grunt-complexity
The report itself is more or less useful because it detects stuff like
big objects (e.g. CSSProperty) as being too complicated. Furthermore, afaik
nobody refactors the code based on what the report says =).
2014-04-16 11:52:25 -07:00
Paul O’Shannessy
b3f5e863e0 Merge pull request #1340 from matthewwithanm/download-attribute
Support download attribute properly
2014-04-15 16:30:30 -07:00
Cheng Lou
7832b94114 Merge pull request #1412 from gasi/patch-3
Match `setTimeout` delay with documentation
2014-04-15 13:47:20 -07:00
Daniel Gasienica
663dd6f5b3 Match setTimeout delay with documentation 2014-04-15 13:45:09 -07:00
Paul O’Shannessy
0dcbfe831a Merge pull request #1410 from spicyj/sih
Don't try to detach a detached node
2014-04-15 12:59:57 -07:00
Ben Alpert
cc0233dd76 Don't try to detach a detached node
Test Plan: grunt test
2014-04-15 11:27:46 -07:00
Ben Alpert
c9767c2822 Guard top-level methods, not in every render call
Test Plan: grunt test
2014-04-15 00:03:02 -07:00
Matthew Dapena-Tretter
32a7a1cedb Rename "booleanish" to "overloaded boolean" 2014-04-14 23:00:25 -04:00
Cheng Lou
c6df1c2dd2 Fix PropType for travis
closes #1404
2014-04-14 17:20:50 -07:00
Paul O’Shannessy
717eacdb64 Merge pull request #1183 from lrowe/patch-6
meta http-equiv attribute name
2014-04-14 17:03:16 -07:00
Ben Alpert
f27175d166 Fix preposition capitalization 2014-04-14 16:28:46 -07:00
Ben Alpert
14580fb012 Update refs example code to use onChange
Fixes #1408.

Test Plan: Copy each code snippet into jsbin; type in the text box successfully; click the button and see the input clear (and in the second example, get focused).
2014-04-14 16:23:37 -07:00
Pete Hunt
d5533cfb6d Add docs for fasttest 2014-04-14 14:27:23 -07:00
Pete Hunt
d44b6c41d2 Merge pull request #1406 from petehunt/testperf
Improve `grunt test` performance
2014-04-14 13:45:08 -07:00
petehunt
2220f0478c Drastically improve test performance 2014-04-14 11:32:36 -07:00
Cheng Lou
b9c50ee8fd Merge pull request #1403 from spicyj/keyword-spacing
Make code spacing more consistent
2014-04-14 11:06:11 -07:00
Paul O’Shannessy
4c7422f4d3 Merge pull request #1384 from chenglou/render-docs
[Docs] Rendering null/false and getDOMNode
2014-04-14 10:15:14 -07:00
Paul O’Shannessy
34c9e142dc Merge pull request #1386 from georgesisco/master
In the tutorial, carry ajax error checking from step 13 forward to other ajax steps
2014-04-14 10:14:35 -07:00
Laurence Rowe
b5017c26b4 meta http-equiv attribute name 2014-04-13 17:56:03 -04:00
Cheng Lou
ea361e884e Merge pull request #1284 from plievone/directives-2-commands
[addons] Renamed update() directives to commands
2014-04-13 14:25:38 -07:00
Ben Alpert
f923933ef3 Make code spacing more consistent
I'm a little surprised we don't have lint rules for this.
2014-04-13 14:25:11 -07:00
Cheng Lou
716dcead3a Merge pull request #1405 from spicyj/css-tests
Restore CSSTransitionGroup tests
2014-04-13 14:23:53 -07:00
Cheng Lou
3c27f8564d Merge pull request #1324 from jordwalke/executeDispatchesInOrder
Make EventPluginUtils clear dispatchIDs and dispatchListeners
2014-04-13 00:23:26 -07:00
Ben Alpert
b918f7fc07 Restore CSSTransitionGroup tests
Not sure what happened here.

Test Plan: grunt test
2014-04-12 17:05:29 -07:00
Ben Alpert
382be4e9e9 Improve error for nested render calls
In the future we could consider wrapping the entire public API (renderComponent, setProps, setState, etc) in this check but this should do for now.

Test Plan: grunt test
2014-04-12 15:37:48 -07:00
Cheng Lou
775d2a3952 Merge pull request #1184 from spicyj/setInnerHTML
Consolidate innerHTML setting logic
2014-04-12 00:58:37 -07:00
Ben Alpert
534e7c06e9 Consolidate innerHTML setting logic
See https://github.com/facebook/react/commit/7eb33ef#commitcomment-5447724.
2014-04-12 00:41:54 -07:00
Cheng Lou
ed1b4dbfb5 Merge pull request #1394 from spicyj/gh-1164
Add test for isValidDescriptor
2014-04-11 20:48:29 -07:00
Cheng Lou
f4f6b055df Merge pull request #1190 from spicyj/custom-set-null
Remove custom attrs properly when setting to null
2014-04-11 18:02:02 -07:00
Ben Alpert
b067556a93 Merge pull request #1390 from chenglou/doc-new-proptypes
[Docs] new PropType behavior
2014-04-11 17:42:27 -07:00
Cheng Lou
acc9bde1f3 [Docs] new PropType behavior
(Killed the TODOs since they're no longer valid).
2014-04-11 17:40:04 -07:00
Paul O’Shannessy
3e2182fd16 Merge pull request #1231 from spicyj/gh-1227
Batch updates caused by handlers in multiple roots
2014-04-11 17:16:04 -07:00
Paul O'Shannessy
3bf12bba0d add displayName to component spec functions
closes #992
2014-04-11 16:39:45 -07:00
Cheng Lou
d673e51044 Make PropType.object pass for Date and RegExp instances
8855d6153e gave more accurate error messages for date and regexp by returning 'date' and 'regexp' respectively from `getPropType`.
However, for the object primitive check, which compares the instance passed with `getPropType's` return string, `object` !== 'date'.
This adds special hanlding for those.
2014-04-11 16:39:02 -07:00
Paul O’Shannessy
ef81148b09 Merge pull request #925 from chenglou/rm-comm
[Docs] Remove comment section
2014-04-11 11:43:23 -07:00
Paul O’Shannessy
cb2e394b9c Merge pull request #1285 from justinj/weak-shape-checker
Add tests for oneOfType with shape
2014-04-11 11:38:05 -07:00
georgesisco
287db7017e Update tutorial.md 2014-04-10 14:51:10 -04:00
Matthew Dapena-Tretter
1c63a3a7f4 Test more falsey values 2014-04-10 09:21:56 -04:00
Matthew Dapena-Tretter
4b71cf2efe Combine valid value checks 2014-04-10 09:21:56 -04:00
Matthew Dapena-Tretter
77ae237be9 Rename CAN_BE_MINIMIZED to HAS_BOOLEANISH_VALUE 2014-04-10 09:18:39 -04:00
Matthew Dapena-Tretter
422a8d9c2c Support minimizable, non-boolean attributes
Fixes GH-1337
2014-04-10 09:17:39 -04:00
Matthew Dapena-Tretter
13351dd937 Test for correct handling of "download" attribute
These tests currently fail as there is no special treatment for this kind of
attribute.

Related: GH-1337
2014-04-10 09:12:35 -04:00
Cheng Lou
f728846712 docs remove comment section 2014-04-09 22:53:54 -07:00
Ben Alpert
697bf73c5f Add test for isValidDescriptor
Fixes #1164.

Test Plan: grunt test
2014-04-09 22:53:22 -07:00
Justin Jaffray
f88936977f Add tests for oneOfType with shape 2014-04-09 22:23:43 -07:00
Cheng Lou
e17222671e [Docs] Rendering null/false and getDOMNode. 2014-04-09 19:26:42 -07:00
Cheng Lou
8855d6153e Revamp and fix PropTypes
This uses the return value (an Error or nothing) to indicate whether a prop passes validation or not. It used to be done through calling `console.warn` as a side-effect, except this didn't work well with and `oneOfType`, which calls each validator.

The solution was to insert a `.weak` prop to each validator to suppress the warning message. This is overkill and also doesn't work well in because it increases the potential API surface. Plus, letting the validators warn it can't be easily used for logging, especially for custom validators.

So `.weak` is no longer needed: fixes https://github.com/facebook/react/issues/863.

Backward compatibility for custom validators: since they didn't return anything and directly call `console.warn` or something, this doesn't break them.

Improvements:

  - `arrayOf`, `oneOfType` and `oneOf` got better message now, since they can get hold of their validator's message and output that instead of a generic `warning: bla`.
  - More complete tests, including testing custom types and `isRequired` on everything.

Bug fixes:

  - oneOfType(...).isRequired didn't work. The workaround was to use `oneOfType(a.isRequired, b.isRequired, ...)`. This means `oneOfType(a.isRequired, b)` doesn't make sense. The new version simply makes `oneOfType(...).isRequired` possible.
  - `oneOf([true])` worked for 'true' boolean because it converted everything to string before comparing. It no longer does.
- `oneOf([true]).isRequired` didn't work.

(see #1294)
2014-04-09 18:50:53 -07:00
Cheng Lou
5a9d0c6a12 Update invalid render error message
forgot to update the message following the previous diff on rendering null.
2014-04-09 18:50:11 -07:00
Tim Yung
356e85cd6a Separate performanceNow into own project 2014-04-09 18:50:11 -07:00
Josh Yudaken
5c9d616735 Add start property that is used by the <ol> tag
Property was missing
2014-04-09 17:50:34 -07:00
George A Sisco III
af7ea7c999 Carry ajax error checking from step #13 forward to other ajax steps
The following steps also have an ajax function, but the 'error:' param
is gone after #13:
#14
#17
#19
#20
This may be superfluous, but it helped me find an error with something I
was doing - Namely, in my .json file, I had single line javascript
comments ("//") that I copied from the tutorial. I couldn't find the
issue on later steps, but was able to see my issue when the error
handler complained about an unexpected "/" in my file in step #13.
2014-04-09 13:42:13 -04:00
Ben Alpert
4f1ca0ee96 Merge pull request #1381 from marcinkwiatkowski/master
fix typo in 09.4-test-utils.md
2014-04-09 10:05:40 -07:00
Ben Alpert
ddf53f97f0 Share reconcile transaction in batched updates
Should make #1350 better and will also take away any performance hit from #1157.

Test Plan:
grunt test
2014-04-09 01:42:27 -07:00
Paul O’Shannessy
bff6d50796 Merge pull request #1364 from spicyj/key-collisions-2
Ignore children with clashing keys
2014-04-08 18:11:36 -07:00
Marcin Kwiatkowski
5167b7a5b2 fix typo in 09.4-test-utils.md 2014-04-09 01:31:02 +01:00
Paul O’Shannessy
debd3318c7 Merge pull request #1379 from fkling/patch-1
Update 05-reusable-components.md
2014-04-08 15:45:19 -07:00
Felix Kling
af79caf1aa Update 05-reusable-components.md
`any` also seems to accept primitive values, not only objects. And since we already have `React.PropType.object`, the description was confusing.
2014-04-08 15:43:24 -07:00
Christopher Chedeau
009be62906 Document multiple ways to insert comments in JSX 2014-04-08 15:24:09 -07:00
Paul O’Shannessy
ccafb030cb Merge pull request #813 from spicyj/e-view-detail
Normalize view and detail properties
2014-04-08 14:23:46 -07:00
Ben Alpert
348399a594 Let early returns do their thing 2014-04-08 14:08:16 -07:00
Ben Alpert
4d62e1ef59 Don't fail if target.ownerDocument is null
See f71dbab.
2014-04-08 14:08:16 -07:00
Ben Alpert
5fa001b12c Normalize view and detail properties 2014-04-08 14:08:16 -07:00
Cheng Lou
f0f59877aa Make rendering to null work and make it injectable
This allows render to return `null`. Under the hood, this renders a `script` tag.

closes #1127
2014-04-08 10:12:18 -07:00
Paul O'Shannessy
af3c04b43b Warn better for key issues
We weren't warning for key issues at the top level (renderComponent)
level at all. This makes us do that, even if it's not quite perfect.

closes #1351
2014-04-07 18:18:50 -07:00
Karl Mikkelsen
f0a8a397ac Link to Events from Forms
closes #1372
2014-04-07 17:47:41 -07:00
Paul O’Shannessy
127e964808 Merge pull request #1362 from spicyj/cb-queue
Make MountReady more reusable, reduce allocations
2014-04-07 15:46:34 -07:00
Paul O’Shannessy
7f9ab471ac Merge pull request #1365 from akre54/unminified-docs-js
Serve unminified react.js on docs site
2014-04-07 15:42:50 -07:00
Ben Alpert
216fcdeb42 Ignore children with clashing keys
Fixes #566.
2014-04-07 13:50:42 -07:00
Paul O’Shannessy
40cbc074ee Move complementary tools to wiki for easier management. 2014-04-07 12:56:38 -07:00
Pete Hunt
b75d11c603 Merge pull request #1356 from petehunt/server-rendering-example2
React server rendering example
2014-04-08 07:27:58 +12:00
Ben Alpert
6cafc638fa Don't forcibly wrap lines in git commit messages 2014-04-06 23:17:51 -07:00
Adam Krebs
a6211a0fd8 Serve unminified react on docs site. Fixes #1359 2014-04-07 02:13:59 -04:00
Ben Alpert
59d2420b05 Add clearer invariants to composite spec mixing 2014-04-06 21:16:38 -07:00
Ben Alpert
ec6da04f6a Make MountReady more reusable, reduce allocations
Test Plan:
grunt test
2014-04-06 17:06:12 -07:00
petehunt
9a78db3457 Initial add
Add readme

remove gitignore

fix graphic
2014-04-04 18:47:33 -07:00
Daniel Lo Nigro
21de5c816f ReactJS.NET blog post
Closes #1354.
2014-04-04 13:23:24 -07:00
Ben Alpert
ed0ef164c0 Fix appearance of code blocks in lists 2014-04-04 12:55:43 -07:00
Jeff Morrison
9c2b9b1eb6 Merge pull request #970 from syranide/jsxws
Normalize whitespace for transformed JSX code
2014-04-04 10:20:43 -07:00
Paul O’Shannessy
0617696ae4 Merge pull request #1251 from davidxi/patch-1
Update jasmine-support.js
2014-04-03 18:41:59 -07:00
Ben Alpert
933dde9c6d Batch updates caused by handlers in multiple roots
Fixes #1227.

It seems rare that event handlers in two roots nested in the DOM will update the same component in the same tick, but if that happens, the updates should be batched together.
2014-04-03 17:41:04 -07:00
Paul O’Shannessy
ed6f8aea77 Merge pull request #1258 from fisherwebdev/master
TodoMVC Flux Example
2014-04-03 15:10:42 -07:00
Paul O’Shannessy
4f6800c2a4 Merge pull request #1306 from twobit/master
Add dx and dy attributes for SVG text
2014-04-03 15:05:44 -07:00
Paul O’Shannessy
00aa33446b Merge pull request #1325 from venmo/add-scrolling-attribute
Add scrolling attribute for <iframe>
2014-04-03 09:56:07 -07:00
Paul O’Shannessy
079749bac6 Merge pull request #1338 from chenglou/tip-children
[Docs][Tips] Entry on this.props.children and tweak component ref entry
2014-04-03 09:30:53 -07:00
Paul O’Shannessy
0aba933911 Merge pull request #1313 from spicyj/ms-prefix
Support `ms` vendor prefix when generating markup
2014-04-03 09:25:41 -07:00
Ben Alpert
67ff4e5050 Add acknowledgement to Christopher Aue 2014-04-03 07:33:32 -07:00
Ben Alpert
2d66fc4518 Add callback to setProps docs 2014-04-02 15:01:50 -07:00
Sebastian Markbage
b44761135e Remove toJSON
This was temporarily needed since clone on mount introduced a cyclic reference
in __DEV__. This reverts that change since we now have descriptors.

To avoid a problem where toJSON may collide.
2014-04-01 17:07:57 -07:00
Paul O’Shannessy
8ccb363a8e Merge pull request #1308 from chenglou/pure
add `ReactComponentWithPureRenderMixin` to addons
2014-04-01 14:32:18 -07:00
Ben Alpert
e86f7671a0 Merge pull request #1345 from kmeht/referenceDoc
[docs] Amend "References to components" tip to mention descriptors.
2014-04-01 13:40:22 -07:00
Kunal Mehta
93a033a94f Remove erroneous line about static methods. 2014-04-01 13:36:56 -07:00
Kunal Mehta
d236a0538d Simplify comment. 2014-04-01 13:04:09 -07:00
Kunal Mehta
da27fb049a [docs] Amend "References to components" tip to mention descriptors. 2014-04-01 11:42:15 -07:00
Paul O’Shannessy
c8fc3e38ab Merge pull request #1329 from irae/transition-group-leftovers
Remove leftovers from ReactTransitionGroup rewrite
2014-04-01 10:16:53 -07:00
Paul O’Shannessy
a2ed61ee66 Update mailmap post 0.10 (see #1283) 2014-04-01 09:30:08 -07:00
Cheng Lou
dc7242c786 [Docs][Tips] Entry on this.props.children and tweak component ref entry
Component ref entry wasn't registered in nav_tips.
2014-03-31 19:13:16 -07:00
Ben Alpert
f63d0fe2b4 Merge pull request #1336 from Daniel15/making-zpao-happy
[Docs] Consistent use of self-closing tags in layout
2014-03-30 22:43:15 -07:00
Daniel Lo Nigro
306209be9e [Docs] Consistent use of self-closing tags in layout 2014-03-30 22:42:02 -07:00
Ben Newman
60d16be90b Merge pull request #1330 from spicyj/clone-imm
Clone objects in immutable tests.
2014-03-30 19:25:56 -04:00
Ben Alpert
42e20a1488 Fix jshint warnings in grunt/
Fixes #1052.

Test Plan:
jshint grunt
2014-03-30 16:09:08 -07:00
Cheng Lou
7cbbff01e7 Merge pull request #1334 from spicyj/non-numeric-top-level
Don't break on top-level non-numeric object keys
2014-03-30 14:03:18 -07:00
Ben Alpert
a89ed9b8dc Don't break on top-level non-numeric object keys
Previously, this threw (in `__DEV__` only) in `ReactCurrentOwner.current.constructor.displayName` because `ReactCurrentOwner.current` is null:

```
React.renderComponent(<div>{{1: <div />, 2: <div />}}</div>, document.body);
```
2014-03-30 13:55:45 -07:00
Christopher Chedeau
f99123b882 Merge pull request #1332 from chenglou/linter
[Jshint] Allow Jasmine globals in *-test.js
2014-03-30 13:13:49 -07:00
Stephen Murphy
468007612f Merge branch 'master' of github.com:facebook/react 2014-03-30 12:53:26 -07:00
Cheng Lou
09ca4a9c80 [Jshint] Allow Jasmine globals in *-test.js
Editors that inline lint use`.jshintrc and directly lint the open
*-test.js files. This makes those linters actually useful.
2014-03-30 12:52:49 -07:00
Ben Alpert
99e943dd13 Clone objects in immutable tests
Fixes #1314, fixes #1328.

Test Plan:
`grunt test`, `grunt test --debug` in Chrome and Firefox.
2014-03-29 17:01:23 -10:00
Irae
27ea2c7e51 Remove leftovers from ReactTransitionGroup rewrite
Looks like while rewriting @petehunt forgot to remove this block.
See: 9ac27cb551
This block used to contain the only `runNextTick` ocurrences in the whole project.
No tests broken after removal, no documentation affected.
2014-03-29 14:46:02 -07:00
Thomas Boyt
8a69b5bc98 Add scrolling attribute for <iframe> 2014-03-29 13:41:34 -04:00
Jordan W
08baa114cc Make EventPluginUtils clear dispatchIDs and dispatchListeners
The other dispatch utils clear these out and I found a bug where they weren't being cleared out.
I'm thinking this should probably be done in the `SyntheticEvent` constructor but at least this way it's consistent. Also, I know no one else uses `executeDispatchesInOrderStopAtTrue` except the `ResponderEventPlugin`.
2014-03-29 01:17:20 -07:00
Christopher Chedeau
70a8c55023 Merge pull request #1288 from vjeux/server_docs
Add client/server mention in componentDid/WillMount documentation
2014-03-28 23:24:20 -07:00
Christopher Chedeau
98ef7abb1a Merge pull request #1322 from spicyj/transformer-harmony
Add optional harmony support to browser transform
2014-03-28 23:22:17 -07:00
Ben Alpert
e6c93f9246 Add optional harmony support to browser transform
This mirrors the react-tools API; it doesn't include support (yet) for transforming `<script type="text/jsx">` blocks with the ES6 transforms, mostly because I don't have a good API in mind there.

Test Plan:
Ran

    JSXTransformer.transform("var two = () => 2;", {harmony: true}).code

in Chrome's dev console and got back some ES5 code.
2014-03-28 18:26:20 -10:00
Cheng Lou
999b4cf1a8 Merge pull request #1318 from spicyj/existence
Fix spelling of 'existence'
2014-03-28 20:27:38 -07:00
Ben Alpert
4cb83566e0 Merge pull request #1320 from gasi/patch-2
Fix minor typo in `update` `$push` directive
2014-03-28 13:35:04 -10:00
Daniel Gasienica
5fc2ecbe92 Fix minor typo in update $push directive 2014-03-28 16:33:03 -07:00
Josh Duck
e5c8831f90 Formatting
An extra "`" snuck in there.
2014-03-28 14:26:05 -07:00
Ben Alpert
c0de6b51ff Fix spelling of 'existence' 2014-03-28 10:44:03 -10:00
Paul O’Shannessy
a778bf2c51 [blog] The Road to 1.0 2014-03-28 13:38:28 -07:00
Paul O’Shannessy
7982ba0571 Merge pull request #1310 from plievone/patch-1
Fix hasOwnProperty check typo in mixStaticSpecIntoComponent
2014-03-28 13:09:14 -07:00
Isaac Salier-Hellendag
807e3dc423 BeforeInputEventPlugin: Support Opera <= 12
Add support for Opera <= 12 (Presto) in `BeforeInputEventPlugin`.

It turns out that Opera 12 has a `TextEvent` in `window`, but doesn't actually fire any input events. Even `input` apparently doesn't fire. Fall back to keypress handling in this case.
2014-03-28 12:33:10 -07:00
Sebastian Markbage
c40e06f728 First phase to true descriptors
This moves all convenience constructors to use frozen ReactDescriptors.
2014-03-28 12:32:53 -07:00
Tom Occhino
a91c9f38f8 Update CONTRIBUTING.md
Updating doc to point to the brand new CLA form at https://code.facebook.com/cla
2014-03-27 23:57:32 -07:00
Ben Alpert
6406183f78 Support ms vendor prefix when generating markup 2014-03-27 19:46:02 -10:00
Paul O'Shannessy
fe9cecd507 Clean up assertions on descriptors
By making this fail, we catch a lot of tests that are expecting rendered
instances but are actually operating on descriptors.
2014-03-27 13:41:18 -07:00
Pete Hunt
976826aec0 Remove extraneous assert 2014-03-27 13:41:10 -07:00
plievone
65d16883a5 Fix hasOwnProperty check typo in mixStaticSpecIntoComponent 2014-03-27 21:21:12 +02:00
Cheng Lou
858fd2e4e2 Merge pull request #1309 from spicyj/dom-arg-order
Fix docstring arg order in createDOMComponentClass
2014-03-27 11:42:52 -07:00
Cheng Lou
0a483e3799 add ReactComponentWithPureRenderMixin to addons 2014-03-27 11:27:45 -07:00
Ben Alpert
3cdef1a86a Fix docstring arg order in createDOMComponentClass 2014-03-27 08:27:19 -10:00
Stephen Murphy
94c2f961fd added dx and dy for laying out text with relative offsets 2014-03-26 16:57:50 -07:00
fisherwebdev
85339bfdae TodoMVC Flux Example 2014-03-26 12:13:17 -07:00
Isaac Salier-Hellendag
5476f9168b Repair spacebar textInput
Browsers that natively support the `textInput` event appear to have a bug: when preventing default behavior for a `textInput` event occurring for a spacebar keypress, the character is prevented from being inserted **but the browser scrolls down**.

Minimal repro example: http://jsfiddle.net/salier/bX4fw/

This is ridiculous, since scrolling makes no sense when the user is focused in a textinput or contenteditable. Preventing default at the `textInput` stage should mean to prevent the character from being inserted, and should have no impact at all on scrolling behavior. I have filed this as a Chromium bug (https://code.google.com/p/chromium/issues/detail?id=355103) but I'm not going to hold out much hope that they'll fix it.

To resolve this, I'm special-casing the spacebar character at the plugin level, in `BeforeInputEventPlugin`. I looked for ways to do this at the component level, but it seems to me that this is simply a browser bug and it's cleaner to handle it there.

In browsers that can use the native `textInput` event, I'm checking the code of the pressed key. If it's the spacebar, we dispatch the synthetic event as if there were no native `textInput` event -- as if we were running Firefox. Then, if the synthetic event is not canceled and we make it through to the native `textInput` event, bail if the character data is a space character.
2014-03-25 13:05:44 -07:00
Cheng Lou
09333a3819 Remove last uses of {' '} in docs and tests
Whitespace fix is in, so no need for {' '} anymore.
2014-03-25 13:05:44 -07:00
Cheng Lou
edc0fa4c3f assertValidProps for updating DOM components through renderComponent
`renderComponent(<div style={invalidType}/>, container)` throws correctly,
but not when it's called a second time (i.e. updating rather than mounting).
It goes through `ReactDOMComponent.updateComponent` but there wasn't a
props assertion there.
(Removed the assertion in `receiveComponent`)
2014-03-25 13:05:44 -07:00
Isaac Salier-Hellendag
116ee058eb TextInputEventPlugin, SyntheticTextInputEvent
This diff introduces `TextInputEventPlugin` and `SyntheticTextInputEvent`, which are based on Webkit's native `textInput` event.

In Chrome, Safari, and Opera, the `textInput` event fires prior to the insertion of character data into the document. For normal typing, for example, thevent sequence is: `keydown`, `keypress`, `textInput`, `input`, `keyup`. The `textInput` event contains a `data` field corresponding to the character data that will actually be inserted.

There is also a `beforeinput` event described by http://www.w3.org/TR/DOM-Level-3-Events/#event-type-beforeinput, and this is essentially that event, so it may make sense to rename the plugin.

This event is especially useful because it solves a number of issues we can't currently handle with only keypress and composition events:

  - **Windows Chrome: Trailing characters discarded in Korean IME.** For instance, `안녕하세요` becomes `안녕하세` with the final character discarded by the final `compositionend` event. The `textInput` event fires correctly with the final character.
  - **Windows Chrome: Special characters discarded in IME.** Certain ideographs are discarded in IME mode. In Japanese, typing the ideographic space character is not represented by keypress but //is// represented by the subsequent `textInput`. This issue also applies to punctuation characters in Chinese.
  - **OSX Chrome: Characters from palette discarded.** Inserting characters from the OSX character palette fails, since no keypress is fired.

The plugin is useful for Firefox and IE. For these, we record inserted characters via keypress and compositionend events and dispatch the synthetic event with these characters as the `data` field to match the native `textInput` event.

  - Firefox has no corresponding `textInput` event and has not yet implemented `beforeinput`.
  - IE has a native `textinput` event, but it fires after the DOM mutation has already occurred, so it isn't very useful as an analog to the Webkit version. I'm just not going to bother with it.
2014-03-25 13:05:44 -07:00
Christoph Pojer
f10f32aaaf Remove objMapKeyVal 2014-03-25 13:05:44 -07:00
Christoph Pojer
6cbeee1e59 Rename objMap to mapObject
mapObject fits better with other module names ("flattenChildren", "traverseAllChildren" etc.) and highlights that it only works with objects - which is going to be more important once we'll have an ES6 Map polyfill.
2014-03-25 13:05:43 -07:00
Christopher Chedeau
e55b9aa059 Add client/server mention in componentDid/WillMount documentation 2014-03-22 12:18:12 -07:00
plievone
c5bf2ada4b [addons] Renamed update() directives to commands 2014-03-22 01:40:05 +02:00
Paul O’Shannessy
f0eae5086b version bump for 0.11 development 2014-03-21 14:58:52 -07:00
Paul O’Shannessy
aea3949062 0.10 release materials 2014-03-21 14:57:03 -07:00
Paul O’Shannessy
3b2d176f59 Update AUTHORS for 0.10 2014-03-21 13:21:20 -07:00
Pete Hunt
68da0eccbe Merge pull request #1282 from jeffbski/addCodewinds004Videos
add CodeWinds episode 4 w/Pete Hunt to videos
2014-03-21 12:54:48 +00:00
Jeff Barczewski
593889b87a add CodeWinds episode 4 w/Pete Hunt to videos
Added to videos.md
2014-03-21 07:41:06 -05:00
Paul O’Shannessy
732f4717a6 Merge pull request #1186 from chenglou/doc-toString-opt
[Docs] document optional param for renderComponentToString
2014-03-20 17:28:51 -07:00
Ben Newman
7807413256 Upgrade Commoner to v0.9.2 to silence deprecation warnings.
Closes #1278.
2014-03-20 14:43:47 -04:00
Ben Alpert
ec893833ee Merge pull request #1273 from wincent/typo-fix-02
Fix a minor typo in the `update()` docs
2014-03-19 15:37:30 -07:00
Greg Hurrell
5aaf4dbae9 Fix a minor typo in the update() docs 2014-03-19 15:33:43 -07:00
Paul O’Shannessy
ecea2918cf 0.10rc blog post 2014-03-18 22:15:16 -07:00
Paul O’Shannessy
7f24943e5a update version for 0.10rc 2014-03-18 22:09:32 -07:00
Paul O’Shannessy
0491d30e7c re-enable moved root warning 2014-03-18 22:03:25 -07:00
Paul O’Shannessy
55b0222596 Upgrade browserify 2014-03-18 21:33:39 -07:00
Paul O’Shannessy
b95fbbe4a2 Silence tests unsupported in PhantomJS.
These tests can still be run in the browser using `grunt test --debug`.

This is a repeat of 42f8d155f8. For posterity, we
do this because Phantom has a problem with Object.freeze and the test runner
can't do __DEV__ right (because we get rid of that in the build step).
2014-03-18 17:48:16 -07:00
Kunal Mehta
e505e47e01 Separate immutable project
This moves Immutable and Immutable object into the new `immutable` project.
2014-03-18 15:03:26 -07:00
Sebastian Markbage
e0c487649d Logging use of objects as maps for children
Let's start logging objects as maps for children. We may want to deprecate this
and replace it with ImmutableMap and Map data structures instead.

This should ideally be logged in the recursive function but since that loses the
scope of where these children are passed it's easier to start tracking them
here to get an idea of how frequently and where it's used.
2014-03-18 15:01:51 -07:00
Andrew Zich
22057ef61c don't try to use Object.prototype methods as transfer strategies in ReactPropTransferer.mergeProps
While looking up a detail of how `transferPropsTo()` works I noticed that we never check `TransferStrategies.hasOwnProperty(thisKey)` when merging props, just `newProps.hasOwnProperty(thisKey)` and a truthy test for `TransferStrategies[thisKey]`. This means that if our `newProps` has keys like `toString`, `valueOf`, or `constructor` etc. set, we will pull these functions off `TransferStrategies` and invoke them when merging props. In most cases this will just result in a failure to merge and some code without side effects being run but in the case of `valueOf` it will actually generate an exception.
2014-03-18 15:01:46 -07:00
Josh Duck
0278f01d95 Replace function expression with for loop
isCustomAttribute used an anonymous function in place of a for loop.
Swap it out so we're not allocating unnecessarily.
2014-03-18 14:57:08 -07:00
Kunal Mehta
0cec4af8d7 Sync latest Immutable changes 2014-03-18 14:57:04 -07:00
Paul O’Shannessy
8d495f3b6e Revert "Merge pull request #1234 from RReverser/pure-cjs"
This reverts commit 7987e6a51d, reversing
changes made to d88d479685.
2014-03-18 11:25:21 -07:00
Ben Newman
7987e6a51d Merge pull request #1234 from RReverser/pure-cjs
Switched from browserify to pure-cjs bundler.
2014-03-18 12:04:58 -04:00
Paul O’Shannessy
d88d479685 Merge pull request #1193 from spicyj/jsx-polygon
Add polygon tag to transform
2014-03-17 10:07:23 -07:00
Ingvar Stepanyan
3f3187c14f Renamed commojs task to bundle, added failing build if bundler failed. 2014-03-17 16:53:02 +02:00
Ben Alpert
c1443e92e6 Merge pull request #1226 from LilyJ/master
included link to React devtools in tooling-integration. fixes #791
2014-03-16 22:42:14 -07:00
Paul O’Shannessy
52e8f3fdb0 Merge pull request #1248 from asolove/svg-text-anchor
Add svg text-anchor attribute
2014-03-16 22:33:00 -07:00
Paul O’Shannessy
cdf4f07a15 Merge pull request #1229 from spicyj/no-jsx
Avoid JSX in ReactCSSTransitionGroup code
2014-03-16 22:31:24 -07:00
Paul O’Shannessy
6ff116e34b Merge pull request #1262 from vjeux/harmony-react-to
Add support for {harmony: true} to react-tools
2014-03-16 22:30:30 -07:00
Pete Hunt
d889a01caf Fix ref behavior for remounting
I'm thinking that setting up `this.refs` in `mountComponent` is better than `construct`. Followed the same pattern as `ReactComponent.Mixin` and nulling out
the value in `construct` and setting it to its initial value in `mountComponent`.
2014-03-16 22:01:54 -07:00
Pete Hunt
04f9887f0e More actionable error message for <tbody> and nested <p>
This bites people all of the time. Until we have a better solution, let's just make the error message more actionable (most people don't know how the DOM
gets unexpectedly mutated).
2014-03-16 22:01:34 -07:00
Sebastian Markbage
9b427a322f Fix some invalid uses of instances
Breaking this out of the other code mod.
2014-03-16 22:01:30 -07:00
Sebastian Markbage
7bbdcdba96 Reassign variable of rendered component
The component that gets passed into renderComponent isn't guaranteed to be the
instance that gets mounted. We want to clone the instance.

Unit tests need to reason about the mounted instance. The first code mod changes:

  ReactTestUtils.renderIntoDocument(<identifier>)

into

  <identifier> = ReactTestUtils.renderIntoDocument(<identifier>)

Using this scripts:

  scripts/bin/codemod -m -d ~/www --extensions js \
   '^(\s*)ReactTestUtils\.renderIntoDocument\(\s*([$a-zA-Z0-9_]+)\s*\)' \
   '\1\2 = ReactTestUtils.renderIntoDocument(\2)'

In the second case I do the same for React.renderComponent. However, there are
alot more unnecessary matches so I only codemod if the same identifier occurs
later in the file.

  scripts/bin/codemod -m -d ~/www --extensions js \
   '^(\s*)React.renderComponent\(\s*([$a-zA-Z0-9_]+)\s*?,(.*?\n?.*?\s\2\b)' \
   '\1\2 = React.renderComponent(\2,\3'

And one more for ReactMount.renderComponent used by internals.

  scripts/bin/codemod -m -d ~/www --extensions js \
   '^(\s*)ReactMount.renderComponent\(\s*([$a-zA-Z0-9_]+)\s*?,(.*?\n?.*?\s\2\b)' \
   '\1\2 = ReactMount.renderComponent(\2,\3'

This still matches many unnecessary cases where the second occurance of the
identifier is a redeclaration or comment. But this code mod doesn't hurt in
those cases.

Finally I have to do the same for:

  this.<identifier> = React.renderComponent(this.<identifier>,

This is a common pattern for production code but not tests. Some of these call
sites will likely break when we move to true descriptors.

  scripts/bin/codemod -m -d ~/www --extensions js \
   '^(\s*)React.renderComponent\((\s*)this\.([$a-zA-Z0-9\_\.]+)\s*?,' \
   '\1this.\3 = React.renderComponent(\2this.\3,'
2014-03-16 22:01:09 -07:00
Christopher Chedeau
5106b793f7 Add support for {harmony: true} to react-tools
```
require('react-tools').transform(code, {harmony: true});
```

now enables all the harmony es6 transforms that are supported.

This is modeled after https://github.com/facebook/react/blob/master/bin/jsx#L17-L23
2014-03-16 15:38:40 -07:00
Jonas Gebhardt
83e4ef16e6 Community Round-up #18 2014-03-14 16:56:12 -07:00
ray
f6a2888910 change some translation words 2014-03-13 23:28:50 +08:00
ray
b7471bcd93 add translation for getting-started.md 2014-03-13 23:19:29 +08:00
ray
93b6804912 make translation better 2014-03-13 21:12:25 +08:00
ray
3c9b797d21 fix ( 2014-03-13 21:00:25 +08:00
Paul O’Shannessy
308c9a0752 Merge pull request #1181 from lrowe/patch-5
omitClose for all void elements
2014-03-12 16:37:52 -07:00
davidxi
29abe53924 Update jasmine-support.js
fix typo in multiple error messages.
2014-03-12 14:39:14 -04:00
Adam Solove
6a01752f3d Add svg text-anchor attribute. 2014-03-12 10:07:05 -04:00
Andreas Svensson
60d7a02d44 Normalize whitespace for transformed JSX code 2014-03-12 10:03:16 +01:00
Ben Alpert
6fd53815cd Merge pull request #1246 from ericflo/patch-1
Remove Shirtstarter as an example application.
2014-03-11 15:48:20 -07:00
Eric Florenzano
3efa02da91 Remove Shirtstarter as an example application.
We have unexpectedly had to shut Shirtstarter down, so it won't serve as a good React.js example any more unfortunately -- sorry for the documentation churn.
2014-03-11 15:45:14 -07:00
Jeff Morrison
d9af091244 Merge pull request #1242 from syranide/jsxcomfix
Unbreak JSX comment comma fix
2014-03-11 10:13:24 -07:00
Ingvar Stepanyan
25773ed1b3 CommonJS builder config to Grunt style for easier handling and readability. 2014-03-11 13:40:38 +00:00
Ingvar Stepanyan
9e224e615f Renamed browserify tasks/configs to cjs, updated pure-cjs to 1.9.0 for better build speed. 2014-03-11 13:26:36 +02:00
ray
b0f9f73e91 Merge branch 'master' of github.com:rayqian/react
Conflicts:
	docs/docs/01-why-react.zh-CN.md
2014-03-11 17:52:20 +08:00
ray
c6a59c0ae6 fix some translation error 2014-03-11 17:51:09 +08:00
ray
69767d4b79 fix some translation error 2014-03-11 17:42:03 +08:00
ray
c3948483d9 add chinese translation for 01-why-react.md 2014-03-11 17:36:57 +08:00
Cheng Lou
3ce2cd04e2 Merge pull request #1243 from jeffcarp/master
Remove unused variable in ballmer-peak
2014-03-10 21:29:35 -07:00
Jeff Carpenter
652f5aea28 Remove unused variable 2014-03-10 19:48:13 -07:00
Andreas Svensson
280ff2e5a7 Unbreak JSX comment comma fix 2014-03-11 00:31:59 +01:00
Pete Hunt
5ede7fb619 ReactDOMComponent optimization
Slight optimization to not do unneeded reconciles of DOM components
2014-03-10 15:32:20 -07:00
Sebastian Markbage
3ea3274ca4 Clone on mount
This is the first step towards descriptors. This will start cloning the
component when it's mounted instead of mounting the first instance.

This avoids an issue where a reference to the first instance can hang around
in props. Since a mounted component gets mutated, the descriptor changes.

We don't need to clone the props object itself. Mutating the shallow props
object of a child that's passed into you is already flawed. Those cases need to
use cloneWithProps. A props object is considered shallow frozen after it leaves
the render it was created in.
2014-03-10 15:28:54 -07:00
Paul O’Shannessy
2ca810fbf3 Merge pull request #1225 from spicyj/cprop
Fix removing DOM property with mapped name
2014-03-10 11:29:10 -07:00
Pete Hunt
d9dd9d5cb3 Merge pull request #1235 from fxbois/master
Update 08-tooling-integration.md
2014-03-08 20:15:45 -08:00
fxbois
9ffd70c688 Update 08-tooling-integration.md
emacs compatibility
2014-03-08 18:12:05 +01:00
Ingvar Stepanyan
3171436d97 Switched from browserify to pure-cjs bundler.
Optimizations and fix for JSXTransformer build.
Dropped dependency on emulation of Node.js native modules.
Added deamdify step for JSXTransformer build.
2014-03-08 16:33:58 +02:00
Jeff Morrison
9ce7ecc3d9 Merge pull request #1219 from syranide/jsxempty
Fix empty JSX expressions sometimes emitting erroneous commas
2014-03-07 21:23:55 -08:00
Paul O’Shannessy
9f9c8bcebf Merge pull request #1228 from spicyj/grunt-debug
Bring back `grunt test --debug`
2014-03-07 11:18:29 -08:00
Ben Alpert
ec54dcbd8f Avoid JSX in ReactCSSTransitionGroup code
Supposedly we want these to be plain JS.
2014-03-06 22:16:25 -08:00
Ben Alpert
9766ed5797 Bring back grunt test --debug 2014-03-06 22:11:55 -08:00
Ben Alpert
1d209248ef Remove obsolete __VERSION__ references 2014-03-06 20:33:06 -08:00
Ben Alpert
21e06196cd Fix removing DOM property with mapped name 2014-03-06 17:50:01 -08:00
Lily
4b56947560 included link to React devtools in tooling-integration. fixes #791 2014-03-06 13:00:48 -08:00
Paul O’Shannessy
554b677e60 Merge pull request #1180 from evanc/master
Test that Node is a function before using instanceof on it
2014-03-06 11:02:28 -08:00
Andreas Svensson
aa70419f9d Fix empty JSX expressions sometimes emitting erroneous commas 2014-03-06 13:01:03 +01:00
Cheng Lou
af1b63456e Merge pull request #1222 from spicyj/npm-dl
[docs] Add more words to downloads page
2014-03-05 20:23:10 -08:00
Ben Alpert
ac3051530a [docs] Add more words to downloads page 2014-03-05 20:16:50 -08:00
Paul O’Shannessy
c5f56f318a Merge pull request #1208 from passy/patch-3
Fix docstring typo for pure render mixin
2014-03-05 19:13:22 -08:00
Paul O’Shannessy
be2c185888 Merge pull request #1211 from spicyj/freeze
Add Object.freeze to polyfill list
2014-03-05 12:18:20 -08:00
Paul O’Shannessy
7d0e6c6c0b Merge pull request #1192 from spicyj/srcset
Add srcSet attribute
2014-03-04 21:39:46 -08:00
Jing Chen
13aa8d37e6 Allow falsy values in statics
We found that the component would break if we set any statics with the
value 0. It turns out @chenglou already ran into this with
d71736b3ed but the statics code was copied
earlier, and still has this falsy check. Made the same change, updated
the unittest.
2014-03-04 18:15:49 -08:00
Kunal Mehta
06f762da77 Add Immutable
As titled. First of 3 diffs to add Immutable, ImmutableMap, and ImmutableObject. No logic changes.
2014-03-04 18:14:47 -08:00
Kunal Mehta
4ad320dd13 LegacyImmutableObject module
This copies the old implementation of ImmutableObject into LegacyImmutableObject.
2014-03-04 18:14:12 -08:00
Ben Newman
521201f121 Merge pull request #1215 from benjamn/fix-cloneWithProps-test
Fix stale usage of emptyObject in cloneWithProps-test.
2014-03-04 13:27:59 -05:00
Ben Newman
41d30bb7de Re-require cloneWithProps as well, for consistency.
And don't mock `emptyObject`, since that might actually replace it with a
mutable/non-frozen object.
2014-03-04 13:12:59 -05:00
Ben Newman
9c87aef67f Fix stale usage of emptyObject in cloneWithProps-test.
After we run `require('mock-modules').dumpCache()`, the object exported by
the `emptyObject` module will no longer be identical to previously
exported objects, so tests like `expect(component.refs).toBe(emptyObject)`
will fail.

Note that this behavior only manifests itself in tests, because of course
we do not call `dumpCache` in production code.

We could consider storing the `emptyObject` globally to thwart the effects
of `dumpCache`, but it's more idiomatic simply to re-`require` the latest
version of `emptyObject`.
2014-03-04 12:59:55 -05:00
Ben Alpert
c3cfcf073d Remove custom attrs properly when setting to null
I don't think this particular codepath was exercised at all (because all the callers call deleteValueForProperty) but this fixes a bug here nonetheless.
2014-03-03 17:43:03 -08:00
Ben Alpert
ec8b0d7fbf Add srcSet attribute
Chrome beta supports this now: http://blog.chromium.org/2014/02/chrome-34-responsive-images-and_9316.html.
2014-03-03 17:12:00 -08:00
Ben Alpert
e954a1c0d9 Add Object.freeze to polyfill list 2014-03-03 15:55:19 -08:00
Paul O’Shannessy
1d27770b40 Fix verion-check to look in right place for React.js 2014-03-03 15:35:10 -08:00
Paul O’Shannessy
4c4446d283 Sync more vendored modules 2014-03-03 15:34:14 -08:00
Pete Hunt
a8fc3b940d Move UI-thread-only browser modules to browser/ui/
This also deletes an unused module.
2014-03-03 15:07:11 -08:00
Pete Hunt
6666538316 Unbreak refs
If no refs are rendered, `this.refs` is undefined. This is bad since it deopts & is hard to look for. Instead we should make `this.refs` an immutable empty object.
2014-03-03 15:06:57 -08:00
Sebastian Markbage
620c1bc2ff Add more owner context to monitoring
Always include context and specifically include the component that was missing a key.
2014-03-03 15:06:39 -08:00
Cheng Lou
99dab49f92 Refactor rendering to string without checksum & React ID
Finalize API for rendering to static markup.
Instead of passing a boolean option to `renderComponentToString`, just use another method.
2014-03-03 15:06:27 -08:00
Pete Hunt
9b0534eb77 ReactRAFBatchingStrategy
This will go in React addons only for now until we figure out `pendingState`.
2014-03-03 15:06:14 -08:00
Sebastian Markbage
eee04b19e1 Add monitor module for logging instrumentation
This adds an instrumentation hook for logging so that we can monitor invalid API
usage before we're ready to issue a warning.

I took the opportunity to update some console.warns to use the warning module
instead. The remaining console.warns
will be replaced by the warning module after we've cleaned up the callsites.
2014-03-03 15:05:53 -08:00
Cheng Lou
f734083a17 Better name for server-side rendering without React ID & checksum
"staticMarkup" sounds way better than "noChecksumNoID".
Also avoids some double negations.
2014-03-03 15:05:35 -08:00
Christoph Pojer
3fe9f9f336 Fix ReactPropTypesTest
children should never be defined as propType, so changing the test to use an actual prop.
2014-03-03 15:05:26 -08:00
Jan Kassens
e39c19423a temporarily disable warning 2014-03-03 15:05:10 -08:00
Cheng Lou
6203e53d16 Fix IE8 disabled input throwing on focus
When IE8 focuses a disabled item, it throws
This makes sure the we're not focusing the item during selection restoration/autofocus when the element's disabled.
2014-03-03 15:04:34 -08:00
Ben Alpert
88a4a566ae Merge pull request #1209 from petehunt/thinking-in-react
Add thinking in react to the official docs + cleanup
2014-03-03 10:40:28 -08:00
petehunt
2f6656e3e9 fix 2014-03-03 10:39:41 -08:00
petehunt
a0ecf47242 Add thinking in react to the official docs 2014-03-03 10:37:33 -08:00
Cheng Lou
4b670a08fa Merge pull request #1207 from passy/patch-2
Add missing backtick in complementary-tools.md
2014-03-02 16:21:35 -08:00
Pascal Hartig
6b78cfb0f4 Fix docstring typo for pure render mixin 2014-03-02 22:18:10 +00:00
Pascal Hartig
8df5e55efd Add missing backtick in complementary-tools.md 2014-03-02 22:10:24 +00:00
Pete Hunt
237adacc3a Merge pull request #1204 from jmingov/patch-1
Updated React Version to 0.9.0
2014-03-01 17:01:12 -08:00
Pete Hunt
90e996324a Merge pull request #1203 from fson/jsx-integrations
Merge the lists of JSX integrations in the docs.
2014-03-01 14:24:58 -08:00
3boll
b2649dd73b Updated React Version 0.9.0
**Updated Url's:**

CDN:

    http://fb.me/react-0.9.0.js

    http://fb.me/JSXTransformer-0.9.0.js

Starter Kit

    http://facebook.github.io/react/downloads/react-0.9.0.zip
2014-03-01 21:12:17 +01:00
Ville Immonen
0217461d16 Merge the lists of JSX integrations in the docs.
There were these two lists of JSX tools at Complimentary Tools
and Tooling Integration, that were a bit out of sync with each other.

Bring them together and add a link to the former from the latter.
2014-03-01 16:50:40 +02:00
Pete Hunt
3c4f45fe45 Merge pull request #1200 from ericflo/patch-1
Add Shirtstarter to examples of production apps.
2014-02-28 13:42:28 -08:00
Eric Florenzano
6485e21956 Add Shirtstarter to examples of production apps.
Shirtstarter is 100% built on React.
2014-02-28 13:40:14 -08:00
Paul O’Shannessy
ae72e6ef91 Merge pull request #1082 from spicyj/class-false
Ensure className={false} turns into string 'false'
2014-02-27 16:41:41 -08:00
Ben Alpert
42444f6bb9 Add polygon tag to transform
Fixes #1144.
2014-02-27 12:32:24 -08:00
Cheng Lou
071d2a947c [Docs] document optional param for renderComponentToString 2014-02-26 15:11:53 -08:00
Ben Alpert
298a05517e Tweak propTypes examples for clarity in oneOfType 2014-02-26 15:03:47 -08:00
Laurence Rowe
cbfbb54c1d omitClose for all void elements
According to http://www.w3.org/TR/html5/syntax.html#void-elements the following elements should not specify end tags:

area, base, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr
2014-02-25 20:03:16 -08:00
evanc
26179d2b79 Test that Node is a function before using instanceof on it 2014-02-25 17:55:31 -08:00
Pete Hunt
ba78edbed8 Update complementary-tools.md 2014-02-25 17:01:00 -08:00
Paul O’Shannessy
34b6707132 Merge pull request #1166 from chenglou/docs-examples-consolidate
[Docs] Consolidate the two examples sections
2014-02-25 16:45:01 -08:00
Paul O’Shannessy
7b773a6b3d make <hasOwnProperty/> transform correctly 2014-02-24 18:03:02 -08:00
Paul O’Shannessy
1dfc5c79f9 Merge pull request #1148 from spicyj/jsx-constructor
Make JSX transform not break on 'constructor' attr
2014-02-24 17:20:25 -08:00
Ben Alpert
04111d5228 Add acknowledgements page 2014-02-24 17:18:57 -08:00
Jonas Gebhardt
a6c1b91c7d fix typo in community round-up #17 2014-02-24 15:27:02 -08:00
Pete Hunt
f34f0d2912 Update README.md 2014-02-24 14:25:09 -08:00
Pete Hunt
46cae63d2c Merge pull request #1156 from chenglou/1154
Remove TodoMVCs from examples/
2014-02-24 14:24:12 -08:00
Jonas Gebhardt
5049fc6b05 Community Round-up # 17 2014-02-24 14:20:17 -08:00
Pete Hunt
8b1279e6b2 Merge pull request #1174 from spicyj/addons-update
Add update() to React.addons
2014-02-24 14:10:07 -08:00
Ben Alpert
854d1f7c1b Add update() to React.addons 2014-02-24 14:05:29 -08:00
Pete Hunt
ab2d59f8b0 [addons] update() immutability helper
Dealing with immutable data is hard. This provides a simple helper (ported from the IG codebase) that makes dealing with immutable JSON data easier. Designed to be familiar for people who use MongoDB.
2014-02-24 13:58:51 -08:00
Cheng Lou
25cafec4a9 [Docs] Consolidate the two examples sections
Also made the formatting more consistent between complementary-tools and
examples.
2014-02-23 18:58:28 -08:00
Ben Alpert
61c287c5ea [docs] Fix version in lifecycle argument note
Fixes #1163.
2014-02-23 16:49:27 -08:00
Pete Hunt
7bba8c3257 Merge pull request #1155 from petehunt/update-helper
Add update() docs
2014-02-21 15:58:39 -08:00
Cheng Lou
2f0507f730 Remove TodoMVCs from examples/
Fixes #1154.
Added a README to point to TodoMVC's site instead.
2014-02-21 14:31:54 -08:00
petehunt
989f6f987d Add update() docs 2014-02-21 13:07:51 -08:00
Ben Alpert
e2b006f9ae .dataTransfer not .dragTransfer 2014-02-21 12:13:21 -08:00
Ben Alpert
141ff66986 Merge pull request #1150 from andreypopp/update-react-router-component-link
docs: update react-router-component link
2014-02-21 11:30:26 -08:00
Andrey Popp
da0b34e945 docs: update link for react-async 2014-02-21 18:30:19 +04:00
Andrey Popp
cbce621570 docs: update react-router-component link 2014-02-21 15:51:27 +04:00
Ben Alpert
472be09ff6 Make JSX transform not break on 'constructor' attr 2014-02-20 21:44:58 -08:00
Ben Alpert
7144a9f241 Merge pull request #1146 from dlau/patch-1
incorrect include in css transition group example?
2014-02-20 19:13:14 -08:00
Daryl Lau
8aaf5fdbf4 incorrect include in css transition group example?
TransitionGroup maps to ReactTransitionGroup, shouldn't it be a ReactCSSTransitionGroup?
2014-02-20 18:26:56 -08:00
Ben Alpert
445611f3e6 Add html5shiv to polyfill docs
cf. #1030
2014-02-20 17:21:41 -08:00
Pete Hunt
b79a3cbd21 Break more browser deps in core
This is part of what Sebastian suggested. We require it into every component that explicitly needs it and inject it as a default mixin for composite components in
the browser environment. This change frees us up to inject everything in ReactComponent.
2014-02-20 16:55:17 -08:00
Jason Bonta
0790040aac update docblock
...for typechecking.
2014-02-20 16:55:01 -08:00
Cheng Lou
2900997b5f Fix transaction test comments
Probably got copy/pasted in.
2014-02-20 16:54:52 -08:00
Cheng Lou
7eb33ef176 simplify mountImageIntoNode's way of putting markup in innerHTML
Instead of removing the node from the document before changing its innerHTML, just do it directly.
The comment seems to be outdated for years. http://jsperf.com/detach-while-setting-innerhtml
2014-02-20 16:54:43 -08:00
Cheng Lou
5545887a48 Allow rendering markup string without checksum and React ID
This fixes https://github.com/facebook/react/pull/994.
Also fixes https://github.com/facebook/react/issues/1079.
Server-rendering without ID/checksum now works. Also won't call didMount.
2014-02-20 16:54:20 -08:00
Paul O’Shannessy
e29584b49b Update authors 2014-02-20 15:20:27 -08:00
Jeff Morrison
c43b3f406c Merge pull request #1143 from jeffmo/npm_test
Add support for `npm test`
2014-02-20 13:15:09 -08:00
jeffmo
a4d6796705 Add support for npm test 2014-02-20 13:10:05 -08:00
Ben Alpert
89d4d352e1 Tweak tutorial wording to be more accurate 2014-02-20 11:40:14 -08:00
Paul O’Shannessy
f3c1383af9 Add context deprecation to changelog, reformat 2014-02-20 10:32:21 -08:00
Shaun Trennery
c32e398a5c Addition of 'this.context' component breaking change
this.context on components is now reserved for internal use by React

closes #1141
2014-02-20 10:32:12 -08:00
Paul O’Shannessy
95edc396df version bump to 0.10.0-alpha 2014-02-19 22:53:29 -08:00
Ben Alpert
1de77f1fbe Ensure className={false} turns into string 'false'
Fixes inconsistency shown by http://jsfiddle.net/zpao/qeXLm/.
2014-02-19 13:47:35 -08:00
355 changed files with 14987 additions and 6801 deletions

View File

@@ -12,3 +12,6 @@ trim_trailing_whitespace = true
[*.md]
max_line_length = 0
trim_trailing_whitespace = false
[COMMIT_EDITMSG]
max_line_length = 0

View File

@@ -1,12 +1,26 @@
Ben Newman <bn@cs.stanford.edu> <benjamn@fb.com>
Bill Fisher <fisherwebdev@gmail.com>
Cheng Lou <chenglou92@gmail.com> <chenglou@fb.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>
Dan Schafer <dschafer@fb.com>
Daniel Gasienica <daniel@gasienica.ch> <daniel@fiftythree.com>
Daniel Gasienica <daniel@gasienica.ch> <dgasienica@zynga.com>
Daniel Lo Nigro <daniel@dan.cx> <danlo@fb.com>
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>
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>
Ingvar Stepanyan <me@rreverser.com> <rreverser@ubuntu.rreverser.a4.internal.cloudapp.net>
Irae Carvalho <irae@irae.pro.br>
Jaime Mingo <j.mingov@3boll.com>
James Brantly <james@jbrantly.com>
Jan Kassens <jan@kassens.net> <jkassens@fb.com>
Jason Bonta <jbonta@gmail.com> <jasonbonta@fb.com>
Jason Trill <jason@jasontrill.com>
Jeff Morrison <jeff@anafx.com> <Jeff@anafx.com>
@@ -18,8 +32,10 @@ Jordan Walke <jordojw@gmail.com> <jordanjcw@fb.com>
Josh Duck <josh@fb.com> <github@joshduck.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>
Michal Srb <xixixao@seznam.cz> xixixao <xixixao@seznam.cz>
Nick Gavalas <njg57@cornell.edu>
Nick Thompson <ncthom91@gmail.com> <nickt@instagram.com>
@@ -30,7 +46,9 @@ Pete Hunt <floydophone@gmail.com> <pete.hunt@fb.com>
Pete Hunt <floydophone@gmail.com> <pete@instagram.com>
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>
Ray <ray@tomo.im>
Richard Feldman <richard.t.feldman@gmail.com> <richard@noredink.com>
Richard Livesey <Livesey7@hotmail.co.uk>
Sander Spies <sandermail@gmail.com>
@@ -40,3 +58,5 @@ 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>
Zach Bruggeman <mail@bruggie.com> <zbruggeman@me.com>

View File

@@ -2,12 +2,15 @@
language: node_js
node_js:
- '0.10'
cache:
directories:
- node_modules
script:
- |
grunt $TEST_TYPE
after_script:
- |
if [ "$TEST_TYPE" = test:full ] && [ "$SERVER" ]; then
if [ "$TEST_TYPE" = test ] && [ "$SERVER" ]; then
grunt build
curl \
-F "react=@build/react.js" \
@@ -26,16 +29,9 @@ after_script:
fi
env:
matrix:
- TEST_TYPE=test:full
- TEST_TYPE=test
- TEST_TYPE=lint
- TEST_TYPE=perf:full
- TEST_TYPE=test:coverage
- TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie11
- TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie10
- TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie9
- TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie8
- TEST_TYPE=test:webdriver:saucelabs:ios
- TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=safari
- TEST_TYPE=test:webdriver:saucelabs:modern
global:
# SERVER
- secure: qPvsJ46XzGrdIuPA70b55xQNGF8jcK7N1LN5CCQYYocXLa+fBrl+fTE77QvehOPhqwJXcj6kOxI+sY0KrVwV7gmq2XY2HZGWUSCxTN0SZlNIzqPA80Y7G/yOjA4PUt8LKgP+8tptyhTAY56qf+hgW8BoLiKOdztYF2p+3zXOLuA=
@@ -47,6 +43,7 @@ matrix:
- env: TEST_TYPE=lint
- env: TEST_TYPE=test:coverage
- env: TEST_TYPE=perf:full
- env: TEST_TYPE=test:webdriver:saucelabs:modern
- env: TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie11
- env: TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie10
- env: TEST_TYPE=test:webdriver:saucelabs BROWSER_NAME=ie9

79
AUTHORS
View File

@@ -1,3 +1,5 @@
Adam Krebs <amk528@cs.nyu.edu>
Adam Solove <asolove@gmail.com>
Alan deLevie <adelevie@gmail.com>
Alex Zelenskiy <azelenskiy@fb.com>
Alexander Solovyov <alexander@solovyov.net>
@@ -5,82 +7,131 @@ Andreas Svensson <andreas@syranide.com>
Andrew Davey <andrew@equin.co.uk>
Andrew Zich <azich@fb.com>
Andrey Popp <8mayday@gmail.com>
Anthony van der Hoorn <anthony.vanderhoorn@gmail.com>
Ayman Osman <aymano.osman@gmail.com>
Ben Alpert <spicyjalapeno@gmail.com>
Ben Newman <bn@cs.stanford.edu>
Ben Ripkens <bripkens.dev@gmail.com>
Bill Fisher <fisherwebdev@gmail.com>
Bob Eagan <bob@synapsestudios.com>
Bojan Mihelac <bmihelac@mihelac.org>
Brandon Bloom <brandon@brandonbloom.name>
Brian Cooke <bri@bricooke.com>
Brian Kim <briankimpossible@gmail.com>
Brian Reavis <brian@thirdroute.com>
Brian Rue <brian@rollbar.com>
Cam Spiers <camspiers@gmail.com>
Cassus Adam Banko <banko.adam@gmail.com>
Cat Chen <catchen@fb.com>
Cheng Lou <chenglou92@gmail.com>
Christian Roman <chroman16@gmail.com>
Christoph Pojer <christoph.pojer@gmail.com>
Christopher Monsanto <chris@monsan.to>
Clay Allsopp <clay.allsopp@gmail.com>
Connor McSheffrey <c@conr.me>
Dan Schafer <dschafer@fb.com>
Daniel Gasienica <dgasienica@zynga.com>
Daniel Lo Nigro <danlo@fb.com>
Daniel Gasienica <daniel@gasienica.ch>
Daniel Lo Nigro <daniel@dan.cx>
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>
Devon Blandin <dblandin@gmail.com>
Dmitry Mazuro <dmitry.mazuro@icloud.com>
Dustin Getz <dgetz@wingspan.com>
Enguerran <engcolson@gmail.com>
Eric Clemmons <eric@smarterspam.com>
Eric Florenzano <floguy@gmail.com>
Eric Schoffstall <contra@wearefractal.com>
Evan Coonrod <evan@paloalto.com>
Fabio M. Costa <fabiomcosta@gmail.com>
Felipe Oliveira Carvalho <felipekde@gmail.com>
Felix Kling <fkling@fb.com>
Felix Kling <felix.kling@gmx.net>
Fernando Correia <fernando@servicero.com>
François-Xavier Bois <fxbois@gmail.com>
Fred Zhao <fredz@fb.com>
G Scott Olson <gscottolson@gmail.com>
Geert Pasteels <geert.pasteels@gmail.com>
Geert-Jan Brits <gbrits@gmail.com>
George A Sisco III <george.sisco@gmail.com>
Gilbert <gilbertbgarza@gmail.com>
Greg Hurrell <glh@fb.com>
Greg Roodt <groodt@gmail.com>
Guangqiang Dong <gqdong@fb.com>
Guido Bouman <m@guido.vc>
Harry Hull <harry.hull1@gmail.com>
Harshad Sabne <harshadsabne@users.noreply.github.com>
Hendrik Swanepoel <hendrik.swanepoel@gmail.com>
Hugo Jobling <me@thisishugo.com>
Ian Obermiller <iano@fb.com>
Ingvar Stepanyan <me@rreverser.com>
Irae Carvalho <irae@irae.pro.br>
Isaac Salier-Hellendag <isaac@fb.com>
Ivan Kozik <ivan@ludios.org>
Jaime Mingo <j.mingov@3boll.com>
Jakub Malinowski <jakubmal@gmail.com>
James Brantly <james@jbrantly.com>
James Ide <ide@fb.com>
Jamie Wong <jamie.lf.wong@gmail.com>
Jamison Dance <jergason@gmail.com>
Jan Kassens <jkassens@fb.com>
Jan Kassens <jan@kassens.net>
Jared Forsyth <jared@jaredforsyth.com>
Jason Bonta <jbonta@gmail.com>
Jason Trill <jason@jasontrill.com>
Jean Lauliac <lauliacj@gmail.com>
Jeff Barczewski <jeff.barczewski@gmail.com>
Jeff Carpenter <gcarpenterv@gmail.com>
Jeff Morrison <jeff@anafx.com>
Jeff Welch <whatthejeff@gmail.com>
Jeffrey Lin <lin.jeffrey@gmail.com>
Jignesh Kakadiya <jigneshhk1992@gmail.com>
Jing Chen <jingc@fb.com>
Johannes Baiter <johannes.baiter@gmail.com>
John Watson <jwatson@fb.com>
Jon Beebe <jon.beebe@daveramsey.com>
Jonas Enlund <jonas.enlund@gmail.com>
Jonas Gebhardt <jonas@instagram.com>
Jonathan Hsu <jhiswin@gmail.com>
Jordan Walke <jordojw@gmail.com>
Josh Bassett <josh.bassett@gmail.com>
Josh Duck <josh@fb.com>
Josh Yudaken <yud@instagram.com>
Joshua Ma <me@joshma.com>
Julen Ruiz Aizpuru <julenx@gmail.com>
Jun Wu <quark@lihdd.net>
Juraj Dudak <jdudak@fb.com>
Justin Jaffray <justinjaffray@khanacademy.org>
Karl Mikkelsen <karl@kingkarl.com>
Keito Uchiyama <projects@keito.me>
Kit Randel <kit@nocturne.net.nz>
Kunal Mehta <k.mehta@berkeley.edu>
Kyle Mathews <mathews.kyle@gmail.com>
Laurence Rowe <l@lrowe.co.uk>
Levi McCallum <levi@levimccallum.com>
Lily <qvang.j@gmail.com>
Logan Allen <loganfynne@gmail.com>
Luigy Leon <luichi.19@gmail.com>
Marcin Kwiatkowski <marcin.kwiatkowski@hotmail.com>
Marcin Szczepanski <marcins@gmail.com>
Mariano Desanze <protronm@gmail.com>
Mark Richardson <echo@fb.com>
Marshall Roch <mroch@fb.com>
Martin Andert <mandert@gmail.com>
Martin Konicek <mkonicek@fb.com>
Mathieu M-Gosselin <mathieumg@gmail.com>
Matt Harrison <mt.harrison86@gmail.com>
Matthew Dapena-Tretter <m@tthewwithanm.com>
Matti Nelimarkka <matti.nelimarkka@hiit.fi>
Michal Srb <xixixao@seznam.cz>
Mouad Debbar <mdebbar@fb.com>
Nadeesha Cabral <nadeesha.cabral@gmail.com>
Nate Hunzaker <nate.hunzaker@gmail.com>
Nicholas Bergson-Shilcock <me@nicholasbs.net>
Nick Gavalas <njg57@cornell.edu>
Nick Thompson <ncthom91@gmail.com>
Niklas Boström <nbostrom@gmail.com>
Owen Coutts <owenc@fb.com>
Pascal Hartig <passy@twitter.com>
Paul OShannessy <paul@oshannessy.com>
@@ -90,20 +141,38 @@ Pete Hunt <floydophone@gmail.com>
Peter Cottle <pcottle@fb.com>
Petri Lievonen <plievone@cc.hut.fi>
Pieter Vanderwerff <me@pieter.io>
Rajiv Tirumalareddy <rajivtreddy@gmail.com>
Randall Randall <randall@randallsquared.com>
Ray <ray@tomo.im>
Richard D. Worth <rdworth@gmail.com>
Richard Feldman <richard.t.feldman@gmail.com>
Richard Livesey <Livesey7@hotmail.co.uk>
Ryan Seddon <seddon.ryan@gmail.com>
Sahat Yalkabov <sakhat@gmail.com>
Sander Spies <sandermail@gmail.com>
Sean Kinsey <oyvind@fb.com>
Sebastian Markbåge <sebastian@calyptus.eu>
Shaun Trennery <shaun.trennery@gmail.com>
Simon Højberg <r.hackr@gmail.com>
Stefan Dombrowski <sdo451@gmail.com>
Stephen Murphy <smurphy3@apple.com>
Stoyan Stefanov <ssttoo@ymail.com>
Sundeep Malladi <sundeep.malladi@gmail.com>
Sven Helmberger <fforw@gmx.de>
Thomas Aylott <oblivious@subtlegradient.com>
Thomas Boyt <thomas.boyt@venmo.com>
Thomas Shaddox <thomas@heyzap.com>
Thomas Shafer <thomasjshafer@gmail.com>
Timothy Yung <yungsters@gmail.com>
Tom Haggie <thaggie@gmail.com>
Tom Occhino <tomocchino@gmail.com>
Ville Immonen <ville.immonen@iki.fi>
Vjeux <vjeuxx@gmail.com>
Volkan Unsal <spocksplanet@gmail.com>
Wayne Larsen <wayne@larsen.st>
Wincent Colaiuta <win@wincent.com>
Zach Bruggeman <zbruggeman@me.com>
Yuriy Dybskiy <yuriy@dybskiy.com>
Yuval Dekel <thedekel@fb.com>
Zach Bruggeman <mail@bruggie.com>
davidxi <davidgraycn@gmail.com>
imagentleman <imagentlemail@gmail.com>

View File

@@ -1,3 +1,27 @@
## 0.10.0 (March 21, 2014)
### React Core
#### New Features
* Added warnings to help migrate towards descriptors
* Made it possible to server render without React-related markup (`data-reactid`, `data-react-checksum`). This DOM will not be mountable by React. [Read the docs for `React.renderComponentToStaticMarkup`](http://facebook.github.io/react/docs/top-level-api.html#react.rendercomponenttostaticmarkup)
* Added support for more attributes:
* `srcSet` for `<img>` to specify images at different pixel ratios
* `textAnchor` for SVG
#### Bug Fixes
* Ensure all void elements dont insert a closing tag into the markup.
* Ensure `className={false}` behaves consistently
* Ensure `this.refs` is defined, even if no refs are specified.
### Addons
* `update` function to deal with immutable data. [Read the docs](http://facebook.github.io/react/docs/update.html)
### react-tools
* Added an option argument to `transform` function. The only option supported is `harmony`, which behaves the same as `jsx --harmony` on the command line. This uses the ES6 transforms from [jstransform](https://github.com/facebook/jstransform).
## 0.9.0 (February 20, 2014)
### React Core

View File

@@ -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://developers.facebook.com/opensource/cla>
Complete your CLA here: <https://code.facebook.com/cla>
## Bugs

View File

@@ -20,15 +20,14 @@ module.exports = function(grunt) {
copy: require('./grunt/config/copy'),
jsx: require('./grunt/config/jsx'),
browserify: require('./grunt/config/browserify'),
populist: require('./grunt/config/populist'),
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'),
npm: require('./grunt/config/npm'),
clean: ['./build', './*.gem', './docs/_site', './examples/shared/*.js', '.module-cache'],
jshint: require('./grunt/config/jshint'),
compare_size: require('./grunt/config/compare_size'),
complexity: require('./grunt/config/complexity')
compare_size: require('./grunt/config/compare_size')
});
grunt.config.set('compress', require('./grunt/config/compress'));
@@ -67,7 +66,8 @@ module.exports = function(grunt) {
grunt.registerTask('npm-react:release', npmReactTasks.buildRelease);
grunt.registerTask('npm-react:pack', npmReactTasks.packRelease);
grunt.registerTask('npm-react-tools:pack', npmReactToolsTasks.pack);
grunt.registerTask('npm-react-tools:release', npmReactToolsTasks.buildRelease);
grunt.registerTask('npm-react-tools:pack', npmReactToolsTasks.packRelease);
grunt.registerTask('version-check', versionCheckTask);
@@ -150,6 +150,18 @@ module.exports = function(grunt) {
'webdriver-jasmine:saucelabs_' + (process.env.BROWSER_NAME || 'ie8')
]);
grunt.registerTask('test:webdriver:saucelabs:modern', [
'build:test',
'build:basic',
'connect',
'sauce-tunnel',
'webdriver-jasmine:saucelabs_android',
'webdriver-jasmine:saucelabs_firefox',
'webdriver-jasmine:saucelabs_chrome',
'webdriver-jasmine:saucelabs_ie11'
]);
grunt.registerTask('test:webdriver:saucelabs:ie', [
'build:test',
'build:basic',
@@ -179,7 +191,20 @@ module.exports = function(grunt) {
'test:webdriver:phantomjs',
'coverage:parse'
]);
grunt.registerTask('test', ['build:test', 'build:basic', 'test:webdriver:phantomjs']);
grunt.registerTask('fasttest', function() {
if (grunt.option('debug')) {
grunt.task.run('build:test', 'connect:server:keepalive');
} else {
grunt.task.run('build:test', 'test:webdriver:phantomjs');
}
});
grunt.registerTask('test', function() {
if (grunt.option('debug')) {
grunt.task.run('build:test', 'build:basic', 'connect:server:keepalive');
} else {
grunt.task.run('build:test', 'build:basic', 'test:webdriver:phantomjs');
}
});
grunt.registerTask('perf', ['build:perf', 'perf:webdriver:phantomjs']);
grunt.registerTask('npm:test', ['build', 'npm:pack']);
@@ -196,6 +221,7 @@ module.exports = function(grunt) {
'browserify:addonsMin',
'npm-react:release',
'npm-react:pack',
'npm-react-tools:release',
'npm-react-tools:pack',
'copy:react_docs',
'compare_size'

View File

@@ -1,4 +1,4 @@
# [React](http://facebook.github.io/react) [![Build Status](https://travis-ci.org/facebook/react.png?branch=master)](https://travis-ci.org/facebook/react)
# [React](http://facebook.github.io/react) [![Build Status](https://travis-ci.org/facebook/react.svg?branch=master)](https://travis-ci.org/facebook/react)
React is a JavaScript library for building user interfaces.
@@ -8,10 +8,6 @@ React is a JavaScript library for building user interfaces.
[Learn how to use React in your own project.](http://facebook.github.io/react/docs/getting-started.html)
## The `react` npm package has recently changed!
If you're looking for jeffbski's [React.js](https://github.com/jeffbski/autoflow) project, it's now in `npm` as `autoflow` rather than `react`.
## Examples
We have several examples [on the website](http://facebook.github.io/react/). Here is the first one to get you started:
@@ -40,12 +36,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.8.0.js"></script>
<script src="http://fb.me/react-0.10.0.js"></script>
<!-- In-browser JSX transformer, remove when pre-compiling JSX. -->
<script src="http://fb.me/JSXTransformer-0.8.0.js"></script>
<script src="http://fb.me/JSXTransformer-0.10.0.js"></script>
```
We've also built a [starter kit](http://facebook.github.io/react/downloads/react-0.8.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.10.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.
If you'd like to use [bower](http://bower.io), it's as easy as:
@@ -87,6 +83,10 @@ We use grunt to automate many tasks. Run `grunt -h` to see a mostly complete lis
```sh
# Build and run tests with PhantomJS
grunt test
# Build and run tests in your browser
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
grunt lint
# Wipe out build directory

18
bin/jsx
View File

@@ -2,8 +2,7 @@
// -*- mode: js -*-
"use strict";
var visitors = require('../vendor/fbtransform/visitors');
var transform = require('jstransform').transform;
var transform = require('../main').transform;
require('commoner').version(
require('../package.json').version
@@ -12,13 +11,14 @@ require('commoner').version(
}).option(
'--harmony',
'Turns on JS transformations such as ES6 Classes etc.'
).option(
'--source-map-inline',
'Embed inline sourcemap in transformed source'
).process(function(id, source) {
// This is where JSX, ES6, etc. desugaring happens.
var visitorList;
if (this.options.harmony) {
visitorList = visitors.getAllVisitors();
} else {
visitorList = visitors.transformVisitors.react;
}
return transform(visitorList, source).code;
var options = {
harmony: this.options.harmony,
sourceMap: this.options.sourceMapInline
};
return transform(source, options);
});

8
docs/404.md Normal file
View File

@@ -0,0 +1,8 @@
---
layout: single
title: Page Not Found
---
We couldn't find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

View File

@@ -55,7 +55,7 @@ $ rake watch # Automatically compiles as needed.
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 relase tag in the main repository.
**Note:** This should only be done for new releases. You should create a tag corresponding to the release tag in the main repository.
### Removing the Jekyll / Ruby Dependency

View File

@@ -13,7 +13,7 @@ redcarpet:
pygments: true
name: React
markdown: redcarpet
react_version: 0.9.0
react_version: 0.10.0
description: A JavaScript library for building user interfaces
relative_permalinks: true
paginate: 5

View File

@@ -4,9 +4,9 @@
@import '_solarized';
@mixin code-typography {
font-family: 'source-code-pro', Menlo, 'Courier New', Consolas, monospace;
font-size: 13px;
line-height: 20px;
font-family: 'source-code-pro', Menlo, Consolas, 'Courier New', monospace;
font-size: 0.8em;
line-height: 1.5;
}
$skinnyContentWidth: 650px;
@@ -224,10 +224,11 @@ h1, h2, h3, h4, h5, h6 {
margin: 0;
}
ul ul {
margin-left: 20px;
margin: 6px 0 0 20px;
}
li {
margin: 0;
line-height: 16px;
margin: 0 0 6px;
}
h3 {
text-transform: uppercase;
@@ -454,6 +455,11 @@ section.black content {
padding-top: 20px;
width: 1220px;
label.compiler-option {
display: block;
margin-top: 5px;
}
#jsxCompiler {
margin-top: 20px;
}
@@ -560,6 +566,19 @@ figure {
margin: 0 auto;
}
h1 {
// Contains .edit-page-link
@include clearfix;
}
.edit-page-link {
float: right;
font-size: 16px;
font-weight: normal;
line-height: 20px;
margin-top: 17px;
}
/* Blog */
.post-list-item + .post-list-item {
@@ -683,7 +702,12 @@ p code {
}
.highlight pre code {
font-size: inherit;
/* Respect line-height defined in <code> styles above */
display: block;
/* Cancel out styles for `li code` in case we have a <pre> within an <li>. */
background: none;
padding: 0;
}
.highlight pre .lineno {

View File

@@ -53,6 +53,12 @@
title: Test Utilities
- id: clone-with-props
title: Cloning Components
- id: update
title: Immutability Helpers
- id: pure-render-mixin
title: PureRenderMixin
- id: perf
title: Performance Tools
- title: Reference
items:
- id: top-level-api
@@ -71,3 +77,9 @@
title: Special Non-DOM Attributes
- id: reconciliation
title: Reconciliation
- title: Flux
items:
- id: flux-overview
title: Flux Overview
- id: flux-todo-list
title: Flux Todo List

View File

@@ -30,3 +30,7 @@
title: Communicate Between Components
- id: expose-component-functions
title: Expose Component Functions
- id: references-to-components
title: References to Components
- id: children-undefined
title: this.props.children undefined

View File

@@ -13,15 +13,38 @@ var HelloMessage = React.createClass({\n\
React.renderComponent(<HelloMessage name=\"John\" />, mountNode);\
";
var transformer = function(code) {
return JSXTransformer.transform(code).code;
function transformer(harmony, code) {
return JSXTransformer.transform(code, {harmony: harmony}).code;
}
var CompilerPlayground = React.createClass({
getInitialState: function() {
return {harmony: false};
},
handleHarmonyChange: function(e) {
this.setState({harmony: e.target.checked});
},
render: function() {
return (
<div>
<ReactPlayground
codeText={HELLO_COMPONENT}
renderCode={true}
transformer={transformer.bind(null, this.state.harmony)}
showCompiledJSTab={false}
/>
<label className="compiler-option">
<input
type="checkbox"
onChange={this.handleHarmonyChange}
checked={this.state.harmony} />{' '}
Enable ES6 transforms (<code>--harmony</code>)
</label>
</div>
);
},
});
React.renderComponent(
<ReactPlayground
codeText={HELLO_COMPONENT}
renderCode={true}
transformer={transformer}
showCompiledJSTab={false}
/>,
<CompilerPlayground />,
document.getElementById('jsxCompiler')
);

View File

@@ -173,10 +173,11 @@ var ReactPlayground = React.createClass({
this.executeCode();
},
componentWillUpdate: function(nextProps, nextState) {
componentDidUpdate: function(prevProps, prevState) {
// execute code only when the state's not being updated by switching tab
// this avoids re-displaying the error, which comes after a certain delay
if (this.state.code !== nextState.code) {
if (this.props.transformer !== prevProps.transformer ||
this.state.code !== prevState.code) {
this.executeCode();
}
},

View File

@@ -6,12 +6,12 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>React | {{ page.title }}</title>
<meta name="viewport" content="width=device-width">
<meta property="og:title" content="React | {{ page.title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="http://facebook.github.io/react{{ page.url }}" />
<meta property="og:image" content="http://facebook.github.io/react/img/logo_og.png" />
<meta property="og:description" content="A JavaScript library for building user interfaces" />
<meta property="fb:app_id" content="623268441017527" />
<meta property="og:title" content="React | {{ page.title }}">
<meta property="og:type" content="website">
<meta property="og:url" content="http://facebook.github.io/react{{ page.url }}">
<meta property="og:image" content="http://facebook.github.io/react/img/logo_og.png">
<meta property="og:description" content="A JavaScript library for building user interfaces">
<meta property="fb:app_id" content="623268441017527">
<link rel="shortcut icon" href="/react/favicon.ico">
<link rel="alternate" type="application/rss+xml" title="{{ site.name }}" href="{{ site.url }}{{ site.baseurl }}/feed.xml">
@@ -30,7 +30,7 @@
<![endif]-->
<script type="text/javascript" src="/react/js/codemirror.js"></script>
<script type="text/javascript" src="/react/js/javascript.js"></script>
<script type="text/javascript" src="/react/js/react.min.js"></script>
<script type="text/javascript" src="/react/js/react.js"></script>
<script type="text/javascript" src="/react/js/JSXTransformer.js"></script>
<script type="text/javascript" src="/react/js/live_editor.js"></script>
<script type="text/javascript" src="/react/js/showdown.js"></script>

View File

@@ -7,8 +7,12 @@ sectionid: docs
{% include nav_docs.html %}
<div class="inner-content">
<h1>{{ page.title }}</h1>
<h1>
{{ page.title }}
<a class="edit-page-link" href="https://github.com/facebook/react/tree/master/docs/{{ page.path }}" target="_blank">Edit on GitHub</a>
</h1>
<div class="subHeader">{{ page.description }}</div>
{{ content }}
<div class="docs-prevnext">
@@ -19,7 +23,5 @@ sectionid: docs
<a class="docs-next" href="/react/docs/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
<div class="fb-comments" data-width="650" data-num-posts="10" data-href="{{ site.url }}{{ site.baseurl }}{{ page.url }}"></div>
</div>
</section>

View File

@@ -16,6 +16,5 @@ sectionid: blog
</div>
<div class="fb-like" data-send="true" data-width="650" data-show-faces="false"></div>
<div class="fb-comments" data-width="650" data-num-posts="10" data-href="{{ site.url }}{{ site.baseurl }}{{ page.url }}"></div>
</div>
</section>

View File

@@ -19,7 +19,5 @@ sectionid: tips
<a class="docs-next" href="/react/tips/{{ page.next }}">Next &rarr;</a>
{% endif %}
</div>
<div class="fb-comments" data-width="650" data-num-posts="10" data-href="{{ site.url }}{{ site.baseurl }}{{ page.url }}"></div>
</div>
</section>

View File

@@ -75,7 +75,7 @@ some pretty cool things with it:
- We've built internal prototypes that run React apps in a web worker and use
React to drive **native iOS views** via an Objective-C bridge.
- You can run React
[on the server](http://github.com/petehunt/react-server-rendering)
[on the server](http://github.com/petehunt/react-server-rendering-example)
for SEO, performance, code sharing and overall flexibility.
- Events behave in a consistent, standards-compliant way in all browsers
(including IE8) and automatically use

View File

@@ -22,7 +22,7 @@ We're looking forward to part 2!
## React vs. async DOM manipulation
Eliseu Monar ([@eliseumds](https://twitter.com/eliseumds))'s post "[ReactJS vs async concurrent rendering](http://eliseu.tk/post/77843550010/vitalbox-pchr-reactjs-vs-async-concurrent-rendering)" is a great example of how React quite literally renders a whole array of common web development work(arounds) obsolete.
Eliseu Monar ([@eliseumds](https://twitter.com/eliseumds))'s post "[ReactJS vs async concurrent rendering](http://eliseumds.tumblr.com/post/77843550010/vitalbox-pchr-reactjs-vs-async-concurrent-rendering)" is a great example of how React quite literally renders a whole array of common web development work(arounds) obsolete.

View File

@@ -8,13 +8,13 @@ author: Paul OShannessy
The release candidate is available for download from the CDN:
* **React**
Dev build with warnings: <http://fb.me/react-0.10.0-rc1.js>
Minified build for production: <http://fb.me/react-0.10.0-rc1.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.10.0-rc1.js>
Minified build for production: <http://fb.me/react-with-addons-0.10.0-rc1.min.js>
* **In-Browser JSX transformer**
* **React**
Dev build with warnings: <http://fb.me/react-0.10.0-rc1.js>
Minified build for production: <http://fb.me/react-0.10.0-rc1.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.10.0-rc1.js>
Minified build for production: <http://fb.me/react-with-addons-0.10.0-rc1.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.10.0-rc1.js>
We've also published version `0.10.0-rc1` of the `react` and `react-tools` packages on npm and the `react` package on bower.
@@ -53,9 +53,10 @@ The plan for v0.11 is that we will go fully to "descriptors". Method calls on th
### React Core
#### New Features
* Made it possible to server render without React-related markup (`data-reactid`, `data-react-checksum`) - `React.renderComponentToStaticMarkup`
* Added warnings to help migrate towards descriptors
* Made it possible to server render without React-related markup (`data-reactid`, `data-react-checksum`). This DOM will not be mountable by React. [Read the docs for `React.renderComponentToStaticMarkup`](/react/docs/top-level-api.html#react.rendercomponenttostaticmarkup)
* Added support for more attributes:
* `srcSet` for `<img>` to images at different pixel ratios
* `srcSet` for `<img>` to specify images at different pixel ratios
* `textAnchor` for SVG
#### Bug Fixes
@@ -65,7 +66,7 @@ The plan for v0.11 is that we will go fully to "descriptors". Method calls on th
### Addons
* `update` function to deal with immutable data.
* `update` function to deal with immutable data. [Read the docs](/react/docs/update.html)
### react-tools
* Added an option argument to `transform` function. The only option supported is `harmony`, which behaves the same as `jsx --harmony` on the command line. This uses the ES6 transforms from [jstransform](https://github.com/facebook/jstransform).

View File

@@ -0,0 +1,73 @@
---
title: React v0.10
layout: post
author: Paul OShannessy
---
Hot on the heels of the [release candidate earlier this week](/react/blog/2014/03/19/react-v0.10-rc1.html), we're ready to call v0.10 done. The only major issue we discovered had to do with the `react-tools` package, which has been updated. We've copied over the changelog from the RC with some small clarifying changes.
The release is available for download from the CDN:
* **React**
Dev build with warnings: <http://fb.me/react-0.10.0.js>
Minified build for production: <http://fb.me/react-0.10.0.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.10.0.js>
Minified build for production: <http://fb.me/react-with-addons-0.10.0.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.10.0.js>
We've also published version `0.10.0` of the `react` and `react-tools` packages on npm and the `react` package on bower.
Please try these builds out and [file an issue on GitHub](https://github.com/facebook/react/issues/new) if you see anything awry.
## Clone On Mount
The main purpose of this release is to provide a smooth upgrade path as we evolve some of the implementation of core. In v0.9 we started warning in cases where you called methods on unmounted components. This is part of an effort to enforce the idea that the return value of a component (`React.DOM.div()`, `MyComponent()`) is in fact not a reference to the component instance React uses in the virtual DOM. The return value is instead a light-weight object that React knows how to use. Since the return value currently is a reference to the same object React uses internally, we need to make this transition in stages as many people have come to depend on this implementation detail.
In 0.10, were adding more warnings to catch a similar set of patterns. When a component is mounted we clone it and use that object for our internal representation. This allows us to capture calls you think youre making to a mounted component. Well forward them on to the right object, but also warn you that this is breaking. See “Access to the Mounted Instance” on [this page](http://fb.me/react-warning-descriptors). Most of the time you can solve your pattern by using refs.
Storing a reference to your top level component is a pattern touched upon on that page, but another examples that demonstrates what we see a lot of:
```js
// This is a common pattern. However instance here really refers to a
// "descriptor", not necessarily the mounted instance.
var instance = <MyComponent/>;
React.renderComponent(instance);
// ...
instance.setProps(...);
// The change here is very simple. The return value of renderComponent will be
// the mounted instance.
var instance = React.renderComponent(<MyComponent/>)
// ...
instance.setProps(...);
```
These warnings and method forwarding are only enabled in the development build. The production builds continue to work as they did in v0.9. We strongly encourage you to use the development builds to catch these warnings and fix the call sites.
The plan for v0.11 is that we will go fully to "descriptors". Method calls on the return value of `MyComponent()` will fail hard.
## Changelog
### React Core
#### New Features
* Added warnings to help migrate towards descriptors
* Made it possible to server render without React-related markup (`data-reactid`, `data-react-checksum`). This DOM will not be mountable by React. [Read the docs for `React.renderComponentToStaticMarkup`](/react/docs/top-level-api.html#react.rendercomponenttostaticmarkup)
* Added support for more attributes:
* `srcSet` for `<img>` to specify images at different pixel ratios
* `textAnchor` for SVG
#### Bug Fixes
* Ensure all void elements dont insert a closing tag into the markup.
* Ensure `className={false}` behaves consistently
* Ensure `this.refs` is defined, even if no refs are specified.
### Addons
* `update` function to deal with immutable data. [Read the docs](/react/docs/update.html)
### react-tools
* Added an option argument to `transform` function. The only option supported is `harmony`, which behaves the same as `jsx --harmony` on the command line. This uses the ES6 transforms from [jstransform](https://github.com/facebook/jstransform).

View File

@@ -0,0 +1,57 @@
---
title: The Road to 1.0
layout: post
author: Paul O'Shannessy
---
When we launched React last spring, we purposefully decided not to call it 1.0. It was production ready, but we had plans to evolve APIs and behavior as we saw how people were using React, both internally and externally. We've learned a lot over the past 9 months and we've thought a lot about what 1.0 will mean for React. A couple weeks ago, I outlined [several projects][projects] that we have planned to take us to 1.0 and beyond. Today I'm writing a bit more about them to give our users a better insight into our plans.
Our primary goal with 1.0 is to clarify our messaging and converge on an API that is aligned with our goals. In order to do that, we want to clean up bad patterns we've seen in use and really help enable developers write good code.
## Descriptors
The first part of this is what we're calling "descriptors". I talked about this briefly in our [v0.10 announcements][v0.10]. The goal here is to separate our virtual DOM representation from our use of it. Simply, this means the return value of a component (e.g. `React.DOM.div()`, `MyComponent()`) will be a simple object containing the information React needs to render. Currently the object returned is actually linked to React's internal representation of the component and even directly to the DOM element. This has enabled some bad patterns that are quite contrary to how we want people to use React. That's our failure.
We added some warnings in v0.9 to start migrating some of these bad patterns. With v0.10 we'll catch more. You'll see more on this soon as we expect to ship v0.11 with descriptors.
## API Cleanup
This is really connected to everything. We want to keep the API as simple as possible and help developers [fall into the pit of success][pitofsuccess]. Enabling bad patterns with bad APIs is not success.
## ES6
Before we even launched React publicly, members of the team were talking about how we could leverage ES6, namely classes, to improve the experience of creating React components. Calling `React.createClass(...)` isn't great. We don't quite have the right answer here yet, but we're close. We want to make sure we make this as simple as possible. It could look like this:
```js
class MyComponent extends React.Component {
render() {
...
}
}
```
There are other features of ES6 we're already using in core. I'm sure we'll see more of that. The `jsx` executable we ship with `react-tools` already supports transforming many parts of ES6 into code that will run on older browsers.
## Context
While we haven't documented `context`, it exists in some form in React already. It exists as a way to pass values through a tree without having to use props at every single point. We've seen this need crop up time and time again, so we want to make this as easy as possible. It's use has performance tradeoffs, and there are known weaknesses in our implementation, so we want to make sure this is a solid feature.
## Addons
As you may know, we ship a separate build of React with some extra features we called "addons". While this has served us fine, it's not great for our users. It's made testing harder, but also results in more cache misses for people using a CDN. The problem we face is that many of these "addons" need access to parts of React that we don't expose publicly. Our goal is to ship each addon on its own and let each hook into React as needed. This would also allow others to write and distribute "addons".
## Browser Support
As much as we'd all like to stop supporting older browsers, it's not always possible. Facebook still supports IE8. While React won't support IE8 forever, our goal is to have 1.0 support IE8. Hopefully we can continue to abstract some of these rough parts.
## Animations
Finding a way to define animations in a declarative way is a hard problem. We've been exploring the space for a long time. We've introduced some half-measures to alleviate some use cases, but the larger problem remains. While we'd like to make this a part of 1.0, realistically we don't think we'll have a good solution in place.
## Miscellaneous
There are several other things I listed on [our projects page][projects] that we're tracking. Some of them are internals and have no obvious outward effect (improve tests, repo separation, updated test runner). I encourage you to take a look.
[v0.10]: http://facebook.github.io/react/blog/2014/03/21/react-v0.10.html
[pitofsuccess]: http://blog.codinghorror.com/falling-into-the-pit-of-success/
[projects]: https://github.com/facebook/react/wiki/Projects

View File

@@ -0,0 +1,38 @@
---
title: "Use React and JSX in ASP.NET MVC"
layout: post
author: Daniel Lo Nigro
---
Today we're happy to announce the initial release of
[ReactJS.NET](http://reactjs.net/), which makes it easier to use React and JSX
in .NET applications, focusing specifically on ASP.NET MVC web applications.
It has several purposes:
- On-the-fly JSX to JavaScript compilation. Simply reference JSX files and they
will be compiled and cached server-side.
```html
<script src="@Url.Content("/Scripts/HelloWorld.jsx")"></script>
```
- JSX to JavaScript compilation via popular minification/combination libraries
(Cassette and ASP.NET Bundling and Minification). This is suggested for
production websites.
- Server-side component rendering to make your initial render super fast.
Even though we are focusing on ASP.NET MVC, ReactJS.NET can also be used in
Web Forms applications as well as non-web applications (for example, in build
scripts). ReactJS.NET currently only works on Microsoft .NET but we are working
on support for Linux and Mac OS X via Mono as well.
Installation
------------
ReactJS.NET is packaged in NuGet. Simply run `Install-Package React.Mvc4` in the
package manager console or search NuGet for "React" to install it.
[See the documentation](http://reactjs.net/docs) for more information. The
GitHub project contains
[a sample website](https://github.com/reactjs/React.NET/tree/master/src/React.Sample.Mvc4)
demonstrating all of the features.
Let us know what you think, and feel free to send through any feedback and
report bugs [on GitHub](https://github.com/reactjs/React.NET).

View File

@@ -0,0 +1,17 @@
---
title: "Flux: An Application Architecture for React"
layout: post
author: Bill Fisher and Jing Chen
---
We recently spoke at one of f8's breakout session about Flux, a data flow architecture that works well with React. Check out the video here:
<figure><iframe width="560" height="315" src="//www.youtube.com/embed/nYkdrAPrdcw?list=PLb0IAmt7-GS188xDYE-u1ShQmFFGbrk0v&start=621" frameborder="0" allowfullscreen></iframe></figure>
To summarize, Flux works well for us because the single directional data flow makes it easy to understand and modify an application as it becomes more complicated. We found that two-way data bindings lead to cascading updates, where changing one data model led to another data model updating, making it very difficult to predict what would change as the result of a single user interaction.
In Flux, the Dispatcher is a singleton that directs the flow of data and ensures that updates do not cascade. As an application grows, the Dispatcher becomes more vital, as it can also manage dependencies between stores by invoking the registered callbacks in a specific order.
When a user interacts with a React view, the view sends an action (usually represented as a JavaScript object with some fields) through the dispatcher, which notifies the various stores that hold the application's data and business logic. When the stores change state, they notify the views that something has updated. This works especially well with React's declarative model, which allows the stores to send updates without specifying how to transition views between states.
Flux is more of a pattern than a formal framework, so you can start using Flux immediately without a lot of new code. An [example of this architecture](https://github.com/facebook/react/tree/master/examples/todomvc-flux) is available, along with more [detailed documentation](http://facebook.github.io/react/docs/flux-overview.html) and a [tutorial](http://facebook.github.io/react/docs/flux-todo-list.html). Look for more examples to come in the future.

View File

@@ -0,0 +1,15 @@
---
title: "One Year of Open-Source React"
layout: post
author: Cheng Lou
---
Today marks the one-year open-source anniversary of React.
Its been a crazy ride. 2.3k commits and 1.5k issues and pull requests later, were approaching version 1.0 and nearing 7k Github stars, with big names such as Khan Academy, New York Times, and Airbnb (and naturally, Facebook and Instagram) using React in production, and many more developers blogging their success stories with it. The [roadmap](http://facebook.github.io/react/blog/2014/03/28/the-road-to-1.0.html) gives a glimpse into the future of the library; exciting stuff lies ahead!
Every success has its story. React was born out of our frustration at existing solutions for building UIs. When it was first suggested at Facebook, few people thought that functionally re-rendering everything and diffing the results could ever perform well. However, support grew after we built the first implementation and people wrote their first components. When we open-sourced React, the initial reception was [similarly skeptical](http://www.reddit.com/r/programming/comments/1fak87/react_facebooks_latest_javascript_client_library/). It challenges many pre-established conventions and received mostly disapproving first-impressions, intermingled with positive ones that often were votes of confidence in Facebooks engineering capabilities. On an open, competitive platform such as the web, it's been hard to convince people to try React. [JSX](http://facebook.github.io/react/docs/jsx-in-depth.html), in particular, filtered out a huge chunk of potential early adopters.
Fast forward one year, React has strongly [grown in popularity](https://news.ycombinator.com/item?id=7489959). Special acknowledgments go to Khan Academy, the ClojureScript community, and established frameworks such as Ember and Angular for contributing to and debating on our work. We'd also like to thank all the [individual contributors](https://github.com/facebook/react/graphs/contributors) who have taken the time to help out over the past year. React, as a library and as a new paradigm on the web, wouldn't have gained as much traction without them. In the future, we will continue to try to set an example of what's possible to achieve when we rethink about current “best practices”.
Heres to another year!

View File

@@ -0,0 +1,55 @@
---
title: "Community Round-up #19"
layout: post
author: Cheng Lou
---
## React Meetups!
Ever wanted to find developers who also share the same interest in React than you? Recently, there has been a React Meetup in [San Francisco](http://www.meetup.com/ReactJS-San-Francisco/) (courtesy of [Telmate](http://www.telmate.com)), and one in [London](http://www.meetup.com/London-React-User-Group/) (courtesy of [Stuart Harris](http://www.meetup.com/London-React-User-Group/members/105837542/), [Cain Ullah](http://www.meetup.com/London-React-User-Group/members/15509971/) and [Zoe Merchant](http://www.meetup.com/London-React-User-Group/members/137058242/)). These two events have been big successes; a second one in London is [already planned](http://www.meetup.com/London-React-User-Group/events/191406572/).
If you don't live near San Francisco or London, why not start one in your community?
## Complementary Tools
In case you haven't seen it, we've consolidated the tooling solution around React on [this wiki page](https://github.com/facebook/react/wiki/Complementary-Tools). Some of the notable recent entries include:
- [Ryan Florence](https://github.com/rpflorence) and [Michael Jackson](https://github.com/mjackson)'s [react-nested-router](https://github.com/rpflorence/react-nested-router), which is a translation of the Ember router API to React.
- [Stephen J. Collings](https://github.com/stevoland)'s [react-bootstrap](https://github.com/react-bootstrap/react-bootstrap), which wraps the popular framework with a bit of React goodness. The [website](http://react-bootstrap.github.io/components.html) features live-editable demos.
- [Andrey Popp](https://github.com/andreypopp)'s [react-quickstart](https://github.com/andreypopp/react-quickstart), which gives you a quick template for server-side rendering and routing, among other features.
These are some of the links that often pop up on the #reactjs IRC channel. If you made something that you think deserves to be shown on the wiki, feel free to add it!
## React in Interesting Places
The core concepts React themselves is something very valuable that the community is exploring and pushing further. A year ago, we wouldn't have imagined something like [Bruce Hauman](http://rigsomelight.com)'s [Flappy Bird ClojureScript port](http://rigsomelight.com/2014/05/01/interactive-programming-flappy-bird-clojurescript.html), whose interactive programming has been made possible through React:
<iframe width="560" height="315" src="//www.youtube.com/embed/KZjFVdU8VLI" frameborder="0" allowfullscreen></iframe>
And don't forget [Pete Hunt](https://github.com/petehunt)'s Wolfenstein 3D rendering engine in React ([source code](https://github.com/petehunt/wolfenstein3D-react/blob/master/js/renderer.js#L183)). While it's nearly a year old, it's still a nice demo.
[![](/react/img/blog/wolfenstein_react.png)](http://www.petehunt.net/wolfenstein3D-react/wolf3d.html)
Give us a shoutout on IRC or [React Google Groups](https://groups.google.com/forum/#!forum/reactjs) if you've used React in some Interesting places.
## Even More People Using React
### Prismatic
[Prismatic](http://getprismatic.com/home) recently shrank their codebase fivefold with the help of React and its popular ClojureScript wrapper, [Om](https://github.com/swannodette/om). They detailed their very positive experience [here](http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/).
> Finally, the state is normalized: each piece of information is represented in a single place. Since React ensures consistency between the DOM and the application data, the programmer can focus on ensuring that the state properly stays up to date in response to user input. If the application state is normalized, then this consistency is guaranteed by definition, completely avoiding the possibility of an entire class of common bugs.
### Adobe Brackets
[Kevin Dangoor](http://www.kevindangoor.com) works on [Brackets](http://brackets.io/?lang=en), the open-source code editor. After writing [his first impression on React](http://www.kevindangoor.com/2014/05/simplifying-code-with-react/), he followed up with another insightful [article](http://www.kevindangoor.com/2014/05/react-in-brackets/) on how to gradually make the code transition, how to preserve the editor's good parts, and how to tune Brackets' tooling around JSX.
> We dont need to switch to React everywhere, all at once. Its not a framework that imposes anything on the application structure. [...] Easy, iterative adoption is definitely something in Reacts favor for us.
### Storehouse
[Storehouse](https://www.storehouse.co) (Apple Design Award 2014)'s web presence is build with React. Here's [an example story](https://www.storehouse.co/stories/y2ad-mexico-city-clouds). Congratulations on the award!
### Vim Awesome
[Vim Awesome](http://vimawesome.com), an open-source Vim plugins directory built on React, was just launched. Be sure to [check out the source code](https://github.com/divad12/vim-awesome) if you're curious to see an example of how to build a small single-page React app.
## Random Tweets
<blockquote class="twitter-tweet" lang="en"><p>Spent 12 hours so far with <a href="https://twitter.com/hashtag/reactjs?src=hash">#reactjs</a>. Spent another 2 wondering why we&#39;ve been doing JS frameworks wrong until now. React makes me happy.</p>&mdash; Paul Irwin (@paulirwin) <a href="https://twitter.com/paulirwin/statuses/481263947589242882">June 24, 2014</a></blockquote>

View File

@@ -0,0 +1,147 @@
---
title: React v0.11 RC
layout: post
author: Paul OShannessy
---
It's that time again… we're just about ready to ship a new React release! v0.11 includes a wide array of bug fixes and features. We highlighted some of the most important changes below, along with the full changelog.
The release candidate is available for download from the CDN:
* **React**
Dev build with warnings: <http://fb.me/react-0.11.0-rc1.js>
Minified build for production: <http://fb.me/react-0.11.0-rc1.min.js>
* **React with Add-Ons**
Dev build with warnings: <http://fb.me/react-with-addons-0.11.0-rc1.js>
Minified build for production: <http://fb.me/react-with-addons-0.11.0-rc1.min.js>
* **In-Browser JSX transformer**
<http://fb.me/JSXTransformer-0.11.0-rc1.js>
We've also published version `0.11.0-rc1` of the `react` and `react-tools` packages on npm and the `react` package on bower.
Please try these builds out and [file an issue on GitHub](https://github.com/facebook/react/issues/new) if you see anything awry.
# Blog Post
## `getDefaultProps`
Starting in React 0.11, `getDefaultProps()` is called only once when `React.createClass()` is called, instead of each time a component is rendered. This means that `getDefaultProps()` can no longer vary its return value based on `this.props` and any objects will be shared across all instances. This change improves performance and will make it possible in the future to do PropTypes checks earlier in the rendering process, allowing us to give better error messages.
## Rendering to `null`
Since React's release, people have been using work arounds to "render nothing". Usually this means returning an empty `<div/>` or `<span/>`. Some people even got clever and started returning `<noscript/>` to avoid extraneous DOM nodes. We finally provided a "blessed" solution that allows developers to writing meaningful code. Returning `null` in an explicit indication to React that you do not want anything rendered. Behind the scenes we make this work with a `<noscript>` element, though in the future we hope to not put anything in the document. In the mean time, `<noscript>` elements do not affect layout in any way, so you can feel safe using `null` today!
```js
// Before
render: function() {
if (!this.state.visible) {
return <span/>;
}
// ...
}
// After
render: function() {
if (!this.state.visible) {
return null;
}
// ...
}
```
## JSX Namespacing
Another feature request we've been hearing for a long time is the ability to have namespaces in JSX. Given that JSX is just JavaScript, we didn't want to use XML namespacing. Instead we opted for a standard JS approach: object property access. Instead of assigning variables to access components stored in an object (such as a component library), you can now use the component directly as `<Namespace.Component/>`.
```js
// Before
var UI = require('UI');
var UILayout = UI.Layout;
var UIButton = UI.Button;
var UILabel = UI.Label;
render: function() {
return <UILayout><UIButton /><UILabel>text</UILabel></UILayout>;
}
// After
var UI = require('UI');
render: function() {
return <UI.Layout><UI.Button /><UI.Label>text</UI.Label></UI.Layout>;
}
```
## Improved keyboard event normalization
Keyboard events now contain a normalized `e.key` value according to the [DOM Level 3 Events spec](http://www.w3.org/TR/DOM-Level-3-Events/#keys-special), allowing you to write simpler key handling code that works in all browsers, such as:
```js
handleKeyDown: function(e) {
if (e.key === 'Enter') {
// Handle enter key
} else if (e.key === ' ') {
// Handle spacebar
} else if (e.key === 'ArrowLeft') {
// Handle left arrow
}
},
```
Keyboard and mouse events also now include a normalized `e.getModifierState()` that works consistently across browsers.
## Changelog
### React Core
#### Breaking Changes
* `getDefaultProps()` is now called once per class and shared across all instances
#### New Features
* Rendering to `null`
* Keyboard events include normalized `e.key` and `e.getModifierState()` properties
* New normalized `onBeforeInput` event
* `React.Children.count` has been added as a helper for counting the number of children
#### Bug Fixes
* Re-renders are batched in more cases
* Events: `e.view` properly normalized
* Added Support for more HTML attributes (`coords`, `crossOrigin`, `download`, `hrefLang`, `mediaGroup`, `muted`, `scrolling`, `shape`, `srcSet`, `start`, `useMap`)
* Improved SVG support
* Changing `className` on a mounted SVG component now works correctly
* Added support for elements `mask` and `tspan`
* Added support for attributes `dx`, `dy`, `fillOpacity`, `fontFamily`, `fontSize`, `markerEnd`, `markerMid`, `markerStart`, `opacity`, `patternContentUnits`, `patternUnits`, `preserveAspectRatio`, `strokeDasharray`, `strokeOpacity`
* CSS property names with vendor prefixes (`Webkit`, `ms`, `Moz`, `O`) are now handled properly
* Duplicate keys no longer cause a hard error; now a warning is logged (and only one of the children with the same key is shown)
* `img` event listeners are now unbound properly, preventing the error "Two valid but unequal nodes with the same `data-reactid`"
* Added explicit warning when missing polyfills
### React With Addons
* PureRenderMixin
* Perf: a new set of tools to help with performance analysis
* Update: New `$apply` command to transform values
* TransitionGroup bug fixes with null elements, Android
### React NPM Module
* Now includes the pre-built packages under `dist/`.
* `envify` is properly listed as a dependency instead of a peer dependency
### JSX
* Added support for namespaces, eg `<Components.Checkbox />`
* JSXTransformer
* Enable the same `harmony` features available in the command line with `<script type="text/jsx;harmony=true">`
* Scripts are downloaded in parallel for more speed. They are still executed in order (as you would expect with normal script tags)
* Fixed a bug preventing sourcemaps from working in Firefox
### React Tools Module
* Improved readme with usage and API information
* Improved ES6 transforms available with `--harmony` option
* Added `--source-map-inline` option to the `jsx` executable
* New `transformWithDetails` API which gives access to the raw sourcemap data

View File

@@ -8,6 +8,8 @@ We'd like to thank all of our contributors:
<div class="three-column">
<ul>
<li>Adam Krebs</li>
<li>Adam Solove</li>
<li>Alan deLevie</li>
<li>Alex Zelenskiy</li>
<li>Alexander Solovyov</li>
@@ -15,46 +17,74 @@ We'd like to thank all of our contributors:
<li>Andrew Davey</li>
<li>Andrew Zich</li>
<li>Andrey Popp</li>
<li>Anthony van der Hoorn</li>
<li>Ayman Osman</li>
<li>Ben Alpert</li>
<li>Ben Newman</li>
<li>Ben Ripkens</li>
<li>Bill Fisher</li>
<li>Bob Eagan</li>
<li>Bojan Mihelac</li>
<li>Brandon Bloom</li>
<li>Brian Cooke</li>
<li>Brian Kim</li>
<li>Brian Reavis</li>
<li>Brian Rue</li>
<li>Cam Spiers</li>
<li>Cassus Adam Banko</li>
<li>Cat Chen</li>
<li>Cheng Lou</li>
<li>Christian Roman</li>
<li>Christoph Pojer</li>
<li>Christopher Monsanto</li>
<li>Clay Allsopp</li>
<li>Connor McSheffrey</li>
<li>Dan Schafer</li>
<li>Daniel Gasienica</li>
<li>Daniel Lo Nigro</li>
<li>Daniel Miladinov</li>
<li>Daniel Schonfeld</li>
<li>Danny Ben-David</li>
<li>Daryl Lau</li>
<li>David Hellsing</li>
<li>David Hu</li>
<li>Devon Blandin</li>
<li>Dmitry Mazuro</li>
<li>Dustin Getz</li>
<li>Enguerran</li>
<li>Eric Clemmons</li>
<li>Eric Florenzano</li>
<li>Eric Schoffstall</li>
<li>Evan Coonrod</li>
<li>Fabio M. Costa</li>
<li>Felipe Oliveira Carvalho</li>
<li>Felix Kling</li>
<li>Fernando Correia</li>
<li>Greg Roodt</li>
<li>François-Xavier Bois</li>
<li>Fred Zhao</li>
<li>G Scott Olson</li>
<li>Geert Pasteels</li>
<li>Geert-Jan Brits</li>
<li>George A Sisco III</li>
<li>Gilbert</li>
<li>Greg Hurrell</li>
</ul>
<ul>
<li>Greg Roodt</li>
<li>Guangqiang Dong</li>
<li>Guido Bouman</li>
<li>Harry Hull</li>
<li>Harshad Sabne</li>
<li>Hendrik Swanepoel</li>
<li>Hugo Jobling</li>
<li>Ian Obermiller</li>
<li>Ingvar Stepanyan</li>
<li>Irae Carvalho</li>
<li>Isaac Salier-Hellendag</li>
<li>Ivan Kozik</li>
<li>Jaime Mingo</li>
<li>Jakub Malinowski</li>
<li>James Brantly</li>
<li>James Ide</li>
<li>Jamie Wong</li>
<li>Jamison Dance</li>
@@ -63,38 +93,59 @@ We'd like to thank all of our contributors:
<li>Jason Bonta</li>
<li>Jason Trill</li>
<li>Jean Lauliac</li>
<li>Jeff Barczewski</li>
<li>Jeff Carpenter</li>
<li>Jeff Morrison</li>
<li>Jeff Welch</li>
<li>Jeffrey Lin</li>
<li>Jignesh Kakadiya</li>
<li>Jing Chen</li>
<li>Johannes Baiter</li>
<li>John Watson</li>
<li>Jon Beebe</li>
<li>Jonas Enlund</li>
<li>Jonas Gebhardt</li>
<li>Jonathan Hsu</li>
<li>Jordan Walke</li>
<li>Josh Bassett</li>
<li>Josh Duck</li>
<li>Josh Yudaken</li>
<li>Joshua Ma</li>
<li>Julen Ruiz Aizpuru</li>
<li>Jun Wu</li>
<li>Juraj Dudak</li>
<li>Justin Jaffray</li>
<li>Karl Mikkelsen</li>
<li>Keito Uchiyama</li>
<li>Kit Randel</li>
<li>Kunal Mehta</li>
<li>Kyle Mathews</li>
<li>Laurence Rowe</li>
<li>Levi McCallum</li>
<li>Lily</li>
<li>Logan Allen</li>
<li>Luigy Leon</li>
<li>Marcin Kwiatkowski</li>
<li>Marcin Szczepanski</li>
<li>Mariano Desanze</li>
<li>Mark Richardson</li>
</ul>
<ul>
<li>Marshall Roch</li>
<li>Martin Andert</li>
<li>Martin Konicek</li>
</ul>
<ul>
<li>Mathieu M-Gosselin</li>
<li>Matt Harrison</li>
<li>Matthew Dapena-Tretter</li>
<li>Matti Nelimarkka</li>
<li>Michal Srb</li>
<li>Mouad Debbar</li>
<li>Nadeesha Cabral</li>
<li>Nate Hunzaker</li>
<li>Nicholas Bergson-Shilcock</li>
<li>Nick Gavalas</li>
<li>Nick Thompson</li>
<li>Niklas Boström</li>
<li>Owen Coutts</li>
<li>Pascal Hartig</li>
<li>Paul OShannessy</li>
@@ -104,24 +155,42 @@ We'd like to thank all of our contributors:
<li>Peter Cottle</li>
<li>Petri Lievonen</li>
<li>Pieter Vanderwerff</li>
<li>Rajiv Tirumalareddy</li>
<li>Randall Randall</li>
<li>Ray</li>
<li>Richard D. Worth</li>
<li>Richard Feldman</li>
<li>Richard Livesey</li>
<li>Ryan Seddon</li>
<li>Sahat Yalkabov</li>
<li>Sander Spies</li>
<li>Sean Kinsey</li>
<li>Sebastian Markbåge</li>
<li>Shaun Trennery</li>
<li>Simon Højberg</li>
<li>Stefan Dombrowski</li>
<li>Stephen Murphy</li>
<li>Stoyan Stefanov</li>
<li>Sundeep Malladi</li>
<li>Sven Helmberger</li>
<li>Thomas Aylott</li>
<li>Thomas Boyt</li>
<li>Thomas Shaddox</li>
<li>Thomas Shafer</li>
<li>Timothy Yung</li>
<li>Tom Haggie</li>
<li>Tom Occhino</li>
<li>Ville Immonen</li>
<li>Vjeux</li>
<li>Volkan Unsal</li>
<li>Wayne Larsen</li>
<li>Wincent Colaiuta</li>
<li>Yuriy Dybskiy</li>
<li>Yuval Dekel</li>
<li>Zach Bruggeman</li>
<li>davidxi</li>
<li>imagentleman</li>
</ul>
</div>
In addition, we're grateful to [Jeff Barczewski](https://github.com/jeffbski) for allowing us to use the `react` package name on npm.
In addition, we're grateful to [Jeff Barczewski](https://github.com/jeffbski) for allowing us to use the [react](https://www.npmjs.org/package/react) package name on npm and to [Christopher Aue](http://christopheraue.net/) for letting us use the [reactjs.com](http://reactjs.com/) domain name and the [@reactjs](https://twitter.com/reactjs) username on Twitter.

View File

@@ -20,7 +20,7 @@ sectionid: blog
<div class="pagination">
{% if paginator.previous_page %}
<a href="/react/{{ paginator.previous_page_path }}" class="previous">
<a href="/react{{ paginator.previous_page_path }}" class="previous">
&laquo; Previous Page
</a>
{% endif %}

View File

@@ -0,0 +1,33 @@
---
id: why-react-zh-CN
title: 为什么使用 React?
layout: docs
permalink: why-react-zh-CN.html
next: displaying-data.html
---
React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库。很人多认为 React 是 **[MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)** 中的 **V**(视图)。
我们创造 React 是为了解决一个问题:**构建随着时间数据不断变化的大规模应用程序**。为了达到这个目标React 采用下面两个主要的思想。
### 简单
仅仅只要表达出你的应用程序在任一个时间点应该长的样子然后当底层的数据变了React 会自动处理所有用户界面的更新。
### 表达能力 (Declarative)
当数据变化了React 概念上是类似点击了更新的按钮,但仅会更新变化的部分。
## 构建可组合的组件
React 都是关于构建可复用的组件。事实上,通过 React 你*唯一*要做的事情就是构建组件。得益于其良好的封装性组件使代码复用、测试和关注分离separation of concerns更加简单。
## 给它5分钟的时间
React挑战了很多传统的知识第一眼看上去可能很多想法有点疯狂。当你阅读这篇指南请[给它5分钟的时间](http://37signals.com/svn/posts/3124-give-it-five-minutes);那些疯狂的想法已经帮助 Facebook 和 Instagram 从里到外创建了上千的组件了。
## 了解更多
你可以从这篇[博客](http://facebook.github.io/react/blog/2013/06/05/why-react.html)了解更多我们创造 React 的动机。

View File

@@ -161,10 +161,20 @@ var content = Container(null, window.isLoggedIn ? Nav(null) : Login(null));
### Comments
It's easy to add comments within your JSX; they're just JS expressions:
It's easy to add comments within your JSX; they're just JS expressions. You just need to be careful to put `{}` around the comments when you are within the children section of a tag.
```javascript
var content = <Container>{/* this is a comment */}<Nav /></Container>;
var content = (
<Nav>
{/* child comment, put {} around */}
<Person
/* multi
line
comment */
name={window.isLoggedIn ? window.name : ''} // end of line comment
/>
</Nav>
);
```

View File

@@ -43,7 +43,7 @@ React.renderComponent(
With React you simply pass your event handler as a camelCased prop similar to how you'd do it in normal HTML. React ensures that all events behave identically in IE8 and above by implementing a synthetic event system. That is, React knows how to bubble and capture events according to the spec, and the events passed to your event handler are guaranteed to be consistent with [the W3C spec](http://www.w3.org/TR/DOM-Level-3-Events/), regardless of which browser you're using.
If you'd like to use React on a touch device (i.e. a phone or tablet), simply call `React.initializeTouchEvents(true);` to turn them on.
If you'd like to use React on a touch device such as a phone or tablet, simply call `React.initializeTouchEvents(true);` to enable touch event handling.
## Under the Hood: Autobinding and Event Delegation
@@ -80,7 +80,7 @@ A common pattern is to create several stateless components that just render data
**State should contain data that a component's event handlers may change to trigger a UI update.** In real apps this data tends to be very small and JSON-serializable. When building a stateful component, think about the minimal possible representation of its state, and only store those properties in `this.state`. Inside of `render()` simply compute any other information you need based on this state. You'll find that thinking about and writing applications in this way tends to lead to the most correct application, since adding redundant or computed values to state means that you need to explicitly keep them in sync rather than rely on React computing them for you.
## What *Shouldn't* Go in State?
## What *Shouldnt* Go in State?
`this.state` should only contain the minimal amount of data needed to represent your UI's state. As such, it should not contain:

View File

@@ -51,23 +51,28 @@ React.createClass({
// An array of a certain type
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
// An object with property values of a certain type
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
// An object taking on a particular shape
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
}),
// You can chain any of the above with isRequired to make sure a warning is
// shown if the prop isn't provided.
// You can chain any of the above with `isRequired` to make sure a warning
// is shown if the prop isn't provided.
requiredFunc: React.PropTypes.func.isRequired,
// An object of any kind
// A value of any data type
requiredAny: React.PropTypes.any.isRequired,
// You can also specify a custom validator.
// You can also specify a custom validator. It should return an Error
// object if the validation fails. Don't `console.warn` or throw, as this
// won't work inside `oneOfType`.
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
console.warn('Validation failed!');
return new Error('Validation failed!');
}
}
},

View File

@@ -9,6 +9,7 @@ next: working-with-the-browser.html
Form components such as `<input>`, `<textarea>`, and `<option>` differ from other native components because they can be mutated via user interactions. These components provide interfaces that make it easier to manage forms in response to user interactions.
For information on events on `<form>` see [Form Events](/react/docs/events.html#form-events).
## Interactive Props

View File

@@ -116,16 +116,20 @@ In addition to that philosophy, we've also taken the stance that we, as authors
`es5-shim.js` from [kriskowal's es5-shim](https://github.com/kriskowal/es5-shim) provides the following that React needs:
* `Array.isArray`
* `Array.prototype.every`
* `Array.prototype.forEach`
* `Array.prototype.indexOf`
* `Array.prototype.some`
* `Array.prototype.map`
* `Date.now`
* `Function.prototype.bind`
* `Object.keys`
* `String.prototype.split`
* `String.prototype.trim`
`es5-sham.js`, also from [kriskowal's es5-shim](https://github.com/kriskowal/es5-shim), provides the following that React needs:
* `Object.create`
* `Object.freeze`
The unminified build of React needs the following from [paulmillr's console-polyfill](https://github.com/paulmillr/console-polyfill).

View File

@@ -15,7 +15,7 @@ Consider the case when you wish to tell an `<input />` element (that exists with
getInitialState: function() {
return {userInput: ''};
},
handleKeyUp: function(e) {
handleChange: function(e) {
this.setState({userInput: e.target.value});
},
clearAndFocusInput: function() {
@@ -26,11 +26,11 @@ Consider the case when you wish to tell an `<input />` element (that exists with
return (
<div>
<div onClick={this.clearAndFocusInput}>
Click To Focus and Reset
Click to Focus and Reset
</div>
<input
value={this.state.userInput}
onKeyUp={this.handleKeyUp}
onChange={this.handleChange}
/>
</div>
);
@@ -72,17 +72,19 @@ React supports a very special property that you can attach to any component that
It's as simple as:
**1.** Assign a `ref` attribute to anything returned from `render` such as:
1. Assign a `ref` attribute to anything returned from `render` such as:
```html
<input ref="myInput" />
```
```html
<input ref="myInput" />
```
**2.** In some other code (typically event handler code), access the **backing instance** via `this.refs` as in:
2. In some other code (typically event handler code), access the **backing instance** via `this.refs` as in:
```javascript
```javascript
this.refs.myInput
```
```
You can access the component's DOM node directly by calling `this.refs.myInput.getDOMNode()`.
## Completing the Example
@@ -91,23 +93,26 @@ It's as simple as:
getInitialState: function() {
return {userInput: ''};
},
handleKeyUp: function(e) {
handleChange: function(e) {
this.setState({userInput: e.target.value});
},
clearAndFocusInput: function() {
this.setState({userInput: ''}); // Clear the input
this.refs.theInput.getDOMNode().focus(); // Boom! Focused!
// Clear the input
this.setState({userInput: ''}, function() {
// This code executes after the component is re-rendered
this.refs.theInput.getDOMNode().focus(); // Boom! Focused!
});
},
render: function() {
return (
<div>
<div onClick={this.clearAndFocusInput}>
Click To Focus and Reset
Click to Focus and Reset
</div>
<input
ref="theInput"
value={this.state.userInput}
onKeyUp={this.handleKeyUp}
onChange={this.handleChange}
/>
</div>
);
@@ -132,4 +137,4 @@ Refs are a great way to send a message to a particular child instance in a way t
- *Never* access refs inside of any component's render method - or while any component's render method is even running anywhere in the call stack.
- If you want to preserve Google Closure Compiler Crushing resilience, make sure to never access as a property what was specified as a string. This means you must access using `this.refs['myRefString']` if your ref was defined as `ref="myRefString"`.
- If you have not programmed several apps with React, your first inclination is usually going to be to try to use refs to "make things happen" in your app. If this is the case, take a moment and think more critically about where `state` should be owned in the component hierarchy. Often, it becomes clear that the proper place to "own" that state is at a higher level in the hierarchy. Placing the state there often eliminates any desire to use `ref`s to "make things happen" - instead, the data flow will usually accomplish your goal.
- If you have not programmed several apps with React, your first inclination is usually going to be to try to use refs to "make things happen" in your app. If this is the case, take a moment and think more critically about where `state` should be owned in the component hierarchy. Often, it becomes clear that the proper place to "own" that state is at a higher level in the hierarchy. Placing the state there often eliminates any desire to use `ref`s to "make things happen" instead, the data flow will usually accomplish your goal.

View File

@@ -38,14 +38,4 @@ If you have [npm](http://npmjs.org/), you can simply run `npm install -g react-t
### Helpful Open-Source Projects
The open-source community has built tools that integrate JSX with several build systems. See [JSX integrations](/react/docs/complementary-tools.html#jsx-integrations) for the full list.
### Syntax Highlighting & Linting
* Many editors already include reasonable support for JSX (Vim, Emacs js2-mode).
* [JSX syntax highlighting](https://github.com/yungsters/sublime/blob/master/tmLanguage/JavaScript%20(JSX\).tmLanguage) is available for Sublime Text and other editors
that support `*.tmLanguage`.
* [web-mode.el](http://web-mode.org) is an autonomous emacs major mode that indents and highlights JSX
* Linting provides accurate line numbers after compiling without sourcemaps.
* Elements use standard scoping so linters can find usage of out-of-scope components.
The open-source community has built tools that integrate JSX with several editors and build systems. See [JSX integrations](https://github.com/facebook/react/wiki/Complementary-Tools#jsx-integrations) for the full list.

View File

@@ -11,7 +11,9 @@ next: animation.html
- [`ReactTransitions`](animation.html), for dealing with animations and transitions that are usually not simple to implement, such as before a component's removal.
- [`ReactLink`](two-way-binding-helpers.html), to simplify the coordination between user's form input data and and the component's state.
- [`classSet`](class-name-manipulation.html), for manipulating the DOM `class` string a bit more cleanly.
- [`classSet()`](class-name-manipulation.html), for manipulating the DOM `class` string a bit more cleanly.
- [`ReactTestUtils`](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.
- [`update()`](update.html), a helper function that makes dealing with immutable data in JavaScript easier.
To get the add-ons, use `react-with-addons.js` (and its minified counterpart) rather than the common `react.js`.

View File

@@ -17,7 +17,7 @@ React provides a `ReactTransitionGroup` addon component as a low-level API for a
`ReactCSSTransitionGroup` is the interface to `ReactTransitions`. This is a simple element that wraps all of the components you are interested in animating. Here's an example where we fade list items in and out.
```javascript{22-24}
```javascript{30-32}
/** @jsx React.DOM */
var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
@@ -33,7 +33,7 @@ var TodoList = React.createClass({
},
handleRemove: function(i) {
var newItems = this.state.items;
newItems.splice(i, 1)
newItems.splice(i, 1);
this.setState({items: newItems});
},
render: function() {
@@ -46,7 +46,7 @@ var TodoList = React.createClass({
}.bind(this));
return (
<div>
<div><button onClick={this.handleAdd} /></div>
<button onClick={this.handleAdd}>Add Item</button>
<ReactCSSTransitionGroup transitionName="example">
{items}
</ReactCSSTransitionGroup>
@@ -88,6 +88,10 @@ You'll notice that when you try to remove an item `ReactCSSTransitionGroup` keep
You can disable animating `enter` or `leave` animations if you want. For example, sometimes you may want an `enter` animation and no `leave` animation, but `ReactCSSTransitionGroup` waits for an animation to complete before removing your DOM node. You can add `transitionEnter={false}` or `transitionLeave={false}` props to `ReactCSSTransitionGroup` to disable these animations.
> Note:
>
> When using `ReactCSSTransitionGroup`, there's no way for your components to be notified when a transition has ended or to perform any more complex logic around animation. If you want more fine-grained control, you can use the lower-level `ReactTransitionGroup` API which provides the hooks you need to do custom transitions.
## 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.

View File

@@ -7,22 +7,23 @@ prev: class-name-manipulation.html
next: clone-with-props.html
---
`React.addons.TestUtils` makes it easy to test React components in the testing framework of your choice (we use [Jasmine](http://pivotal.github.io/jasmine/) with [jsdom](https://github.com/tmpvar/jsdom)).
`React.addons.TestUtils` makes it easy to test React components in the testing framework of your choice (we use [Jest](http://facebook.github.io/jest/)).
### Simulate
```javascript
Simulate.{eventName}({ReactComponent|DOMElement} element, object eventData)
Simulate.{eventName}(DOMElement element, object eventData)
```
Simulate an event dispatch on a React component instance or browser DOM node with optional `eventData` event data. **This is possibly the single most useful utility in `ReactTestUtils`.**
Simulate an event dispatch on a DOM node with optional `eventData` event data. **This is possibly the single most useful utility in `ReactTestUtils`.**
Example usage:
```javascript
React.addons.TestUtils.Simulate.click(myComponent);
React.addons.TestUtils.Simulate.change(myComponent);
React.addons.TestUtils.Simulate.keydown(myComponent, {key: "Enter"});
var node = this.refs.input.getDOMNode();
React.addons.TestUtils.Simulate.click(node);
React.addons.TestUtils.Simulate.change(node);
React.addons.TestUtils.Simulate.keyDown(node, {key: "Enter"});
```
`Simulate` has a method for every event that React understands.
@@ -94,7 +95,7 @@ Traverse all components in `tree` and accumulate all components where `test(comp
### scryRenderedDOMComponentsWithClass
```javascript
array scryRenderedDOMComponentsWithClass(ReactCompoennt tree, string className)
array scryRenderedDOMComponentsWithClass(ReactComponent tree, string className)
```
Finds all instance of components in the rendered tree that are DOM components with the class name matching `className`.

View File

@@ -4,6 +4,7 @@ title: Cloning Components
layout: docs
permalink: clone-with-props.html
prev: test-utils.html
next: update.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.

101
docs/docs/09.6-update.md Normal file
View File

@@ -0,0 +1,101 @@
---
id: update
title: Immutability Helpers
layout: docs
permalink: update.html
prev: clone-with-props.html
next: pure-render-mixin.html
---
React lets you use whatever style of data management you want, including mutation. However, if you can use immutable data in performance-critical parts of your application it's easy to implement a fast `shouldComponentUpdate()` method to significantly speed up your app.
Dealing with immutable data in JavaScript is more difficult than in languages designed for it, like [Clojure](http://clojure.org/). However, we've provided a simple immutability helper, `update()`, that makes dealing with this type of data much easier, *without* fundamentally changing how your data is represented.
## The main idea
If you mutate data like this:
```js
myData.x.y.z = 7;
// or...
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:
```js
var newData = deepCopy(myData);
newData.x.y.z = 7;
newData.a.b.push(9);
```
Unfortunately, deep copies are expensive, and sometimes impossible. You can alleviate this by only copying objects that need to be changed and by reusing the objects that haven't changed. Unfortunately, in today's JavaScript this can be cumbersome:
```js
var newData = extend(myData, {
x: extend(myData.x, {
y: extend(myData.x.y, {z: 7}),
}),
a: extend(myData.a, {b: myData.a.b.concat(9)})
});
```
While this is fairly performant (since it only shallow copies `log n` objects and reuses the rest), it's a big pain to write. Look at all the repetition! This is not only annoying, but also provides a large surface area for bugs.
`update()` provides simple syntactic sugar around this pattern to make writing this code easier. This code becomes:
```js
var newData = React.addons.update(myData, {
x: {y: {z: {$set: 7}}},
a: {b: {$push: [9]}}
});
```
While the syntax takes a little getting used to (though it's inspired by [MongoDB's query language](http://docs.mongodb.org/manual/core/crud-introduction/#query)) there's no redundancy, it's statically analyzable and it's not much more typing than the mutative version.
The `$`-prefixed keys are called *commands*. The data structure they are "mutating" is called the *target*.
## Available commands
* `{$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.
* `{$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.
## Examples
### Simple push
```js
var initialArray = [1, 2, 3];
var newArray = update(initialArray, {$push: [4]}); // => [1, 2, 3, 4]
```
`initialArray` is still `[1, 2, 3]`.
### Nested collections
```js
var collection = [1, 2, {a: [12, 17, 15]}];
var newCollection = update(collection, {2: {a: {$splice: [[1, 1, 13, 14]]}}});
// => [1, 2, {a: [12, 13, 14, 15]}]
```
This accesses `collection`'s index `2`, key `a`, and does a splice of one item starting from index `1` (to remove `17`) while inserting `13` and `14`.
### Updating a value based on its current one
```js
var obj = {a: 5, b: 3};
var newObj = update(obj, {b: {$apply: function(x) {return x * 2;}}});
// => {a: 5, b: 6}
// This is equivalent, but gets verbose for deeply nested collections:
var newObj2 = update(obj, {b: {$set: obj.b * 2}});
```
### (Shallow) merge
```js
var obj = {a: 5, b: 3};
var newObj = update(obj, {$merge: {b: 6, c: 7}}); // => {a: 5, b: 6, c: 7}
```

View File

@@ -0,0 +1,31 @@
---
id: pure-render-mixin
title: PureRenderMixin
layout: docs
permalink: pure-render-mixin.html
prev: update.html
next: perf.html
---
If your React component's render function is "pure" (in other words, it renders the same result given the same props and state), you can use this mixin for a performance boost in some cases.
Example:
```js
var PureRenderMixin = require('react').addons.PureRenderMixin;
React.createClass({
mixins: [PureRenderMixin],
render: function() {
return <div className={this.props.className}>foo</div>;
}
});
```
Under the hood, the mixin implements [shouldComponentUpdate](/react/docs/component-specs.html#updating-shouldcomponentupdate), in which it compares the current props and state with the next ones and returns `false` if the equalities pass.
> 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.
>
> Furthermore, `shouldComponentUpdate` skips updates for the whole component subtree. Make sure all the children components are also "pure".

70
docs/docs/09.8-perf.md Normal file
View File

@@ -0,0 +1,70 @@
---
id: perf
title: Performance Tools
layout: docs
permalink: perf.html
prev: pure-render-mixin.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.
In addition to giving you an overview of your app's overall performance, ReactPerf is a profiling tool that tells you exactly where you need to put these hooks.
> Note:
>
> The dev build of React is slower than the prod build, due to all the extra logic for providing, for example, React's friendly console warnings (stripped away in the prod build). Therefore, the profiler only serves to indicate the _relatively_ expensive parts of your app.
## General API
### `Perf.start()` and `Perf.stop()`
Start/stop the measurement. The React operations in-between are recorded for analyses below. Operations that took an insignificant amount of time are ignored.
### `Perf.printInclusive(measurements)`
Prints the overall time taken. If no argument's passed, defaults to all the measurements from the last recording. This prints a nicely formatted table in the console, like so:
![](/react/img/docs/perf-inclusive.png)
### `Perf.printExclusive(measurements)`
"Exclusive" times don't include the times taken to mount the components: processing props, `getInitialState`, call `componentWillMount` and `componentDidMount`, etc.
![](/react/img/docs/perf-exclusive.png)
### `Perf.printWasted(measurements)`
**The most useful part of the profiler**.
"Wasted" time is spent on components that didn't actually render anything, e.g. the render stayed the same, so the DOM wasn't touched.
![](/react/img/docs/perf-wasted.png)
### `Perf.printDOM(measurements)`
Prints the underlying DOM manipulations, e.g. "set innerHTML" and "remove".
![](/react/img/docs/perf-dom.png)
## Advanced API
The above print methods use `Perf.getLastMeasurements()` to pretty-print the result.
### `Perf.getLastMeasurements()`
Get the measurements array from the last start-stop session. The array contains objects, each of which looks like this:
```js
{
// The term "inclusive" and "exclusive" are explained below
"exclusive": {},
// '.0.0' is the React ID of the node
"inclusive": {".0.0": 0.0670000008540228, ".0": 0.3259999939473346},
"render": {".0": 0.036999990697950125, ".0.0": 0.010000003385357559},
// Number of instances
"counts": {".0": 1, ".0.0": 1},
// DOM touches
"writes": {},
// Extra debugging info
"displayNames": {
".0": {"current": "App", "owner": "<root>"},
".0.0": {"current": "Box", "owner": "App"}
},
"totalTime": 0.48499999684281647
}
```

View File

@@ -7,54 +7,4 @@ prev: videos.html
next: examples.html
---
React is a small library that does one thing well. Here's a list of tools we've found that work really well with React when building applications.
If you want your project on this list, or think one of these projects should be removed, [open an issue on GitHub](https://github.com/facebook/react/issues/new).
### JSX integrations
* **[jsxhint](https://npmjs.org/package/jsxhint)** [JSHint](http://jshint.com/) (linting) support.
* **[reactify](https://npmjs.org/package/reactify)** [Browserify](http://browserify.org/) transform.
* **[node-jsx](https://npmjs.org/package/node-jsx)** Native [Node](http://nodejs.org/) support.
* **[jsx-loader](https://npmjs.org/package/jsx-loader)** Loader for [webpack](http://webpack.github.io/).
* **[grunt-react](https://npmjs.org/package/grunt-react)** [GruntJS](http://gruntjs.com/) task.
* **[gulp-react](https://npmjs.org/package/gulp-react)** [GulpJS](http://gulpjs.com/) plugin.
* **[jsx-requirejs-plugin](https://github.com/philix/jsx-requirejs-plugin)** [RequireJS](http://requirejs.org/) plugin.
* **[react-meteor](https://github.com/benjamn/react-meteor)** [Meteor](http://www.meteor.com/) plugin.
* **[pyReact](https://github.com/facebook/react-python)** [Python](http://www.python.org/) bridge to JSX.
* **[react-rails](https://github.com/facebook/react-rails)** Ruby gem for using JSX with [Ruby on Rails](http://rubyonrails.org/).
### Full-stack starter kits
* **[react-quickstart](https://github.com/andreypopp/react-quickstart)** Quick-start template for `express`, `browserify`, `react-router-component` and `react-async` (**includes "isomorphic" server rendering**).
* **[generator-react-webpack](https://github.com/newtriks/generator-react-webpack)** [Yeoman](http://yeoman.io/) generator for React and Webpack.
* **[Genesis Skeleton](http://genesis-skeleton.com/)** Modern, opinionated, full-stack starter kit for rapid, streamlined application development (supports React).
* **[react-starter-template](https://github.com/johnthethird/react-starter-template)** Starter template with Gulp, Webpack and Bootstrap.
* **[react-brunch](https://npmjs.org/package/react-brunch)** [Brunch](http://brunch.io/) plugin.
* **[react-browserify-template](https://github.com/petehunt/react-browserify-template)** Quick-start with Browserify.
### Routing
* **[director](https://github.com/flatiron/director)** (For an example see [TodoMVC](https://github.com/tastejs/todomvc/blob/gh-pages/architecture-examples/react/js/app.jsx#L29)).
* **[Backbone](http://backbonejs.org/)** (For an example see [github-issues-viewer](https://github.com/jaredly/github-issues-viewer)).
* **[react-router](https://github.com/jaredly/react-router)** (Example coming soon).
* **[react-router-component](http://andreypopp.viewdocs.io/react-router-component)**
### Model management
* **[react.backbone](https://github.com/usepropeller/react.backbone)** Use [Backbone](http://backbonejs.org) models with React.
* **[cortex](https://github.com/mquan/cortex/)** A JavaScript library for centrally managing data with React.
* **[avers](https://github.com/wereHamster/avers)** A modern client-side model abstraction library.
### Data fetching
* **[react-async](http://andreypopp.viewdocs.io/react-async)** Adds a `getInitialStateAsync(cb)` method suitable for data fetching on both the client and the server.
* **[superagent](http://visionmedia.github.io/superagent/)** A lightweight "isomorphic" library for AJAX requests.
### UI components
* **[react-bootstrap](https://github.com/stevoland/react-bootstrap)** Bootstrap 3 components built with React.
* **[react-topcoat](https://github.com/plaxdan/react-topcoat)** Topcoat components built with React.
* **[react-lorem-component](https://github.com/martinandert/react-lorem-component)** Lorem Ipsum placeholder component.
* **[wingspan-forms](https://github.com/wingspan/wingspan-forms)** React library for dynamic forms & grids; widgets provided by KendoUI.
* **[react-translate-component](https://github.com/martinandert/react-translate-component)** React component for i18n.
This page has moved to the [GitHub wiki](https://github.com/facebook/react/wiki/Complementary-Tools).

View File

@@ -11,7 +11,6 @@ prev: complementary-tools.html
* **[Instagram.com](http://instagram.com/)** is 100% built on React, both public site and internal tools.
* **[Facebook.com](http://www.facebook.com/)**'s commenting interface, business management tools, [Lookback video editor](http://facebook.com/lookback/edit), page insights, and most, if not all, new JS development.
* **[Khan Academy](http://khanacademy.org/)** uses React for most new JS development.
* **[Shirtstarter](https://www.shirtstarter.com/)** is 100% built on React.
* **[Sberbank](http://sberbank.ru/moscow/ru/person/)**, Russia's number one bank, is built with React.
* **[The New York Times's 2014 Red Carpet Project](http://www.nytimes.com/interactive/2014/02/02/fashion/red-carpet-project.html?_r=0)** is built with React.

View File

@@ -0,0 +1,97 @@
---
id: flux-overview
title: Flux Application Architecture
layout: docs
next: flux-todo-list.html
---
Flux is the application architecture that Facebook uses for building client-side web applications. It complements React's composable view components by utilizing a unidirectional data flow. It's more of a pattern rather than a formal framework, and you can start using Flux immediately without a lot of new code.
<figure><iframe width="560" height="315" src="//www.youtube.com/embed/nYkdrAPrdcw?list=PLb0IAmt7-GS188xDYE-u1ShQmFFGbrk0v&start=621" frameborder="0" allowfullscreen></iframe></figure>
Flux applications have three major parts: the dispatcher, the stores, and the views (React components). These should not be confused with Model-View-Controller. Controllers do exist in a Flux application, but they are controller-views — views often found at the top of the hierarchy that retrieve data from the stores and pass this data down to their children. Additionally, actions — dispatcher helper methods — are often used to support a semantic dispatcher API. It can be useful to think of them as a fourth part of the Flux update cycle.
Flux eschews MVC in favor of a unidirectional data flow. When a user interacts with a React view, the view propagates an action through a central dispatcher, to the various stores that hold the application's data and business logic, which updates all of the views that are affected. This works especially well with React's declarative programming style, which allows the store to send updates without specifying how to transition views between states.
We originally set out to deal correctly with derived data: for example, we wanted to show an unread count for message threads while another view showed a list of threads, with the unread ones highlighted. This was difficult to handle with MVC — marking a single thread as read would update the thread model, and then also need to update the unread count model. These dependencies and cascading updates often occur in a large MVC application, leading to a tangled weave of data flow and unpredictable results.
Control is inverted with stores: the stores accept updates and reconcile them as appropriate, rather than depending on something external to update its data in a consistent way. Nothing outside the store has any insight into how it manages the data for its domain, helping to keep a clear separation of concerns. This also makes stores more testable than models, especially since stores have no direct setter methods like `setAsRead()`, but instead have only an input point for the payload, which is delivered through the dispatcher and originates with actions.
## Structure and Data Flow
Data in a Flux application flows in a single direction, in a cycle:
<pre>
Views ---> (actions) ----> Dispatcher ---> (registered callback) ---> Stores -------+
Ʌ |
| V
+-- (Controller-Views "change" event handlers) ---- (Stores emit "change" events) --+
</pre>
A unidirectional data flow is central to the Flux pattern, and in fact Flux takes its name from the Latin word for flow. In the above diagram, the dispatcher, stores and views are independent nodes with distinct inputs and outputs. The actions are simply discrete, semantic helper functions that facilitate passing data to the dispatcher.
All data flows through the dispatcher as a central hub. Actions most often originate from user interactions with the views, and are nothing more than a call into the dispatcher. The dispatcher then invokes the callbacks that the stores have registered with it, effectively dispatching the data payload contained in the actions to all stores. Within their registered callbacks, stores determine which actions they are interested in, and respond accordingly. The stores then emit a "change" event to alert the controller-views that a change to the data layer has occurred. Controller-views listen for these events and retrieve data from the stores in an event handler. The controller-views call their own `render()` method via `setState()` or `forceUpdate()`, updating themselves and all of their children.
This structure allows us to reason easily about our application in a way that is reminiscent of functional reactive programming, or more specifically data-flow programming or flow-based programming, where data flows through the application in a single direction — there are no two-way bindings. Application state is maintained only in the stores, allowing the different parts of the application to remain highly decoupled. Where dependencies do occur between stores, they are kept in a strict hierarchy, with synchronous updates managed by the dispatcher.
We found that two-way data bindings led to cascading updates, where changing one object led to another object changing, which could also trigger more updates. As applications grew, these cascading updates made it very difficult to predict what would change as the result of one user interaction. When updates can only change data within a single round, the system as a whole becomes more predictable.
Let's look at the various parts of the Flux update cycle up close. A good place to start is the dispatcher.
### A Single Dispatcher
The dispatcher is the central hub that manages all data flow in a Flux application. It is essentially a registry of callbacks into the stores. Each store registers itself and provides a callback. When the dispatcher responds to an action, all stores in the application are sent the data payload provided by the action via the callbacks in the registry.
As an application grows, the dispatcher becomes more vital, as it can manage dependencies between stores by invoking the registered callbacks in a specific order. Stores can declaratively wait for other stores to finish updating, and then update themselves accordingly.
### Stores
Stores contain the application state and logic. Their role is somewhat similar to a model in a traditional MVC, but they manage the state of many objects — they are not instances of one object. Nor are they the same as Backbone's collections. More than simply managing a collection of ORM-style objects, stores manage the application state for a particular __domain__ within the application.
For example, Facebook's [Lookback Video Editor](https://facebook.com/lookback/edit) utilized a TimeStore that kept track of the playback time position and the playback state. On the other hand, the same application's ImageStore kept track of a collection of images. The TodoStore in our [TodoMVC example](https://github.com/facebook/react/tree/master/examples/todomvc-flux) is similar in that it manages a collection of to-do items. A store exhibits characteristics of both a collection of models and a singleton model of a logical domain.
As mentioned above, a store registers itself with the dispatcher and provides it with a callback. This callback receives the action's data payload as a parameter. The payload contains a type attribute, identifying the action's type. Within the store's registered callback, a switch statement based on the action's type is used to interpret the payload and to provide the proper hooks into the store's internal methods. This allows an action to result in an update to the state of the store, via the dispatcher. After the stores are updated, they broadcast an event declaring that their state has changed, so the views may query the new state and update themselves.
### Views and Controller-Views
React provides the kind of composable views we need for the view layer. Close to the top of the nested view hierarchy, a special kind of view listens for events that are broadcast by the stores that it depends on. One could call this a controller-view, as it provides the glue code to get the data from the stores and to pass this data down the chain of its descendants. We might have one of these controller-views governing any significant section of the page.
When it receives the event from the store, it first requests the new data it needs via the stores' public getter methods. It then calls its own `setState()` or `forceUpdate()` methods, causing its `render()` method and the `render()` method of all its descendants to run.
We often pass the entire state of the store down the chain of views in a single object, allowing different descendants to use what they need. In addition to keeping the controller-like behavior at the top of the hierarchy, and thus keeping our descendant views as functionally pure as possible, passing down the entire state of the store in a single object also has the effect of reducing the number of props we need to manage.
Occasionally we may need to add additional controller-views deeper in the hierarchy to keep components simple. This might help us to better encapsulate a section of the hierarchy related to a specific data domain. Be aware, however, that controller-views deeper in the hierarchy can violate the singular flow of data by introducing a new, potentially conflicting entry point for the data flow. In making the decision of whether to add a deep controller-view, balance the gain of simpler components against the complexity of multiple data updates flowing into the hierarchy at different points. These multiple data updates can lead to odd effects, with React's render method getting invoked repeatedly by updates from different controller-views, potentially increasing the difficulty of debugging.
### Actions
The dispatcher exposes a method that allows a view to trigger a dispatch to the stores, and to include a payload of data, or an action. The action construction may be wrapped into a semantic helper method which sends the payload to the dispatcher. For example, we may want to change the text of a to-do item in a to-do list application. We would create an action with a function signature like `updateText(todoId, newText)` in our `TodoActions` module. This method may be invoked from within our views' event handlers, so we can call it in response to a user action. This action method also adds the action type to the payload, so that when the payload is interpreted in the store, it can respond appropriately to a payload with a particular action type. In our example, this type might be named something like `TODO_UPDATE_TEXT`.
Actions may also come from other places, such as the server. This happens, for example, during data initialization. It may also happen when the server returns an error code or when the server has updates to provide to the application. We'll talk more about server actions in a future article. In this post we're only concerned with the basics of the data flow.
### What About that Dispatcher?
As mentioned earlier, the dispatcher is also able to manage dependencies between stores. This functionality is available through the `waitFor()` method within the Dispatcher class. We did not need to use this method within the extremely simple [TodoMVC application](https://github.com/facebook/react/tree/master/examples/todomvc-flux), but we have included it [in the example dispatcher](https://github.com/facebook/react/blob/master/examples/todomvc-flux/js/dispatcher/Dispatcher.js#L110) as an example of what a dispatcher should be able to do in a larger, more complex application.
Within the TodoStore's registered callback we could explicitly wait for any dependencies to first update before moving forward:
```javascript
case 'TODO_CREATE':
Dispatcher.waitFor([
PrependedTextStore.dispatcherIndex,
YetAnotherStore.dispatcherIndex
], function() {
TodoStore.create(PrependedTextStore.getText() + ' ' + action.text);
TodoStore.emit('change');
});
break;
```
The arguments for `waitFor()` are an array of dispatcher registry indexes, and a final callback to invoke after the callbacks at the given indexes have completed. Thus the store that is invoking `waitFor()` can depend on the state of another store to inform how it should update its own state.
A problem arises if we create circular dependencies. If Store A waits for Store B, and B waits for A, then we'll have a very bad situation on our hands. We'll need a more robust dispatcher that flags these circular dependencies with console errors, and this is not easily accomplished with promises. Unfortunately, that's a bit beyond the scope of this documentation. In the future we hope to cover how to build a more robust dispatcher and how to initialize, update, and save the state of the application with persistent data, like a web service API.

616
docs/docs/flux-todo-list.md Normal file
View File

@@ -0,0 +1,616 @@
---
id: flux-todo-list
title: Flux TodoMVC Tutorial
layout: docs
prev: flux-overview.html
---
To demonstrate the Flux architecture with some example code, let's take on the classic TodoMVC application. The entire application is available in the React GitHub repo within the [todomvc-flux](https://github.com/facebook/react/tree/master/examples/todomvc-flux) example directory, but let's walk through the development of it a step at a time.
To begin, we'll need some boilerplate and get up and running with a module system. Node's module system, based on CommonJS, will fit the bill very nicely and we can build off of [react-boilerplate](https://github.com/petehunt/react-boilerplate) to get up and running quickly. Assuming you have npm installed, simply clone the react-boilerplate code from GitHub, and navigate into the resulting directory in Terminal (or whatever CLI application you like). Next run the npm scripts to get up and running: `npm install`, then `npm run build`, and lastly `npm start` to continuously build using Browserify.
The TodoMVC example has all this built into it as well, but if you're starting with react-boilerplate make sure you edit your package.json file to match the file structure and dependencies described in the TodoMVC example's [package.json](https://github.com/facebook/react/tree/master/examples/todomvc-flux/package.json), or else your code won't match up with the explanations below.
Source Code Structure
---------------------
The resulting index.js file may be used as the entry point into our app, but we'll put most of our code in a 'js' directory. Let's let Browserify do its thing, and now we'll open a new tab in Terminal (or a GUI file browser) to look at the directory. It should look something like this:
```
myapp
|
+ ...
+ js
|
+ app.js
+ bundle.js // generated by Browserify whenever we make changes.
+ index.html
+ ...
```
Next we'll dive into the js directory, and layout our application's primary directory structure:
```
myapp
|
+ ...
+ js
|
+ actions
+ components // all React components, both views and controller-views
+ constants
+ dispatcher
+ stores
+ app.js
+ bundle.js
+ index.html
+ ...
```
Creating a Dispatcher
---------------------
Now we are ready to create a dispatcher. Here is an naive example of a Dispatcher class, written with JavaScript promises, polyfilled with Jake Archibald's [ES6-Promises](https://github.com/jakearchibald/ES6-Promises) module.
```javascript
var Promise = require('es6-promise').Promise;
var merge = require('react/lib/merge');
var _callbacks = [];
var _promises = [];
/**
* Add a promise to the queue of callback invocation promises.
* @param {function} callback The Store's registered callback.
* @param {object} payload The data from the Action.
*/
var _addPromise = function(callback, payload) {
_promises.push(new Promise(function(resolve, reject) {
if (callback(payload)) {
resolve(payload);
} else {
reject(new Error('Dispatcher callback unsuccessful'));
}
}));
};
var Dispatcher = function() {};
Dispatcher.prototype = merge(Dispatcher.prototype, {
/**
* Register a Store's callback so that it may be invoked by an action.
* @param {function} callback The callback to be registered.
* @return {number} The index of the callback within the _callbacks array.
*/
register: function(callback) {
_callbacks.push(callback);
return _callbacks.length - 1; // index
},
/**
* dispatch
* @param {object} payload The data from the action.
*/
dispatch: function(payload) {
// First create array of promises for callbacks to reference.
var resolves = [];
var rejects = [];
_promises = _callbacks.map(function(_, i) {
return new Promise(function(resolve, reject) {
resolves[i] = resolve;
rejects[i] = reject;
});
});
// Dispatch to callbacks and resolve/reject promises.
_callbacks.forEach(function(callback, i) {
// Callback can return an obj, to resolve, or a promise, to chain.
// See waitFor() for why this might be useful.
Promise.resolve(callback(payload)).then(function() {
resolves[i](payload);
}, function() {
rejects[i](new Error('Dispatcher callback unsuccessful'));
});
});
_promises = [];
}
});
module.exports = Dispatcher;
```
The public API of this basic Dispatcher consists of only two methods: register() and dispatch(). We'll use register() within our stores to register each store's callback. We'll use dispatch() within our actions to trigger the invocation of the callbacks.
Now we are all set to create a dispatcher that is more specific to our app, which we'll call AppDispatcher.
```javascript
var Dispatcher = require('./Dispatcher');
var merge = require('react/lib/merge');
var AppDispatcher = merge(Dispatcher.prototype, {
/**
* A bridge function between the views and the dispatcher, marking the action
* as a view action. Another variant here could be handleServerAction.
* @param {object} action The data coming from the view.
*/
handleViewAction: function(action) {
this.dispatch({
source: 'VIEW_ACTION',
action: action
});
}
});
module.exports = AppDispatcher;
```
Now we've created an implementation that is a bit more specific to our needs, with a helper function we can use in the actions coming from our views' event handlers. We might expand on this later to provide a separate helper for server updates, but for now this is all we need.
Creating Stores
----------------
We can use Node's EventEmitter to get started with a store. We need EventEmitter to broadcast the 'change' event to our controller-views. So let's take a look at what that looks like. I've omitted some of the code for the sake of brevity, but for the full version see [TodoStore.js](https://github.com/Facebook/react/blob/master/examples/todomvc-flux/js/stores/TodoStore.js) in the TodoMVC example code.
```javascript
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var TodoConstants = require('../constants/TodoConstants');
var merge = require('react/lib/merge');
var CHANGE_EVENT = 'change';
var _todos = {}; // collection of todo items
/**
* Create a TODO item.
* @param {string} text The content of the TODO
*/
function create(text) {
// Using the current timestamp in place of a real id.
var id = Date.now();
_todos[id] = {
id: id,
complete: false,
text: text
};
}
/**
* Delete a TODO item.
* @param {string} id
*/
function destroy(id) {
delete _todos[id];
}
var TodoStore = merge(EventEmitter.prototype, {
/**
* Get the entire collection of TODOs.
* @return {object}
*/
getAll: function() {
return _todos;
},
emitChange: function() {
this.emit(CHANGE_EVENT);
},
/**
* @param {function} callback
*/
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
/**
* @param {function} callback
*/
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
dispatcherIndex: AppDispatcher.register(function(payload) {
var action = payload.action;
var text;
switch(action.actionType) {
case TodoConstants.TODO_CREATE:
text = action.text.trim();
if (text !== '') {
create(text);
TodoStore.emitChange();
}
break;
case TodoConstants.TODO_DESTROY:
destroy(action.id);
TodoStore.emitChange();
break;
// add more cases for other actionTypes, like TODO_UPDATE, etc.
}
return true; // No errors. Needed by promise in Dispatcher.
})
});
module.exports = TodoStore;
```
There are a few important things to note in the above code. To start, we are maintaining a private data structure called _todos. This object contains all the individual to-do items. Because this variable lives outside the class, but within the closure of the module, it remains private — it cannot be directly changed from the outside. This helps us preserve a distinct input/output interface for the flow of data by making it impossible to update the store without using an action.
Another important part is the registration of the store's callback with the dispatcher. We pass in our payload handling callback to the dispatcher and preserve the index that this store has in the dispatcher's registry. The callback function currently only handles two actionTypes, but later we can add as many as we need.
Listening to Changes with a Controller-View
-------------------------------------------
We need a React component near the top of our component hierarchy to listen for changes in the store. In a larger app, we would have more of these listening components, perhaps one for every section of the page. In Facebook's Ads Creation Tool, we have many of these controller-like views, each governing a specific section of the UI. In the Lookback Video Editor, we only had two: one for the animated preview and one for the image selection interface. Here's one for our TodoMVC example. Again, this is slightly abbreviated, but for the full code you can take a look at the TodoMVC example's [TodoApp.react.js](https://github.com/facebook/react/blob/master/examples/todomvc-flux/js/components/TodoApp.react.js)
```javascript
/** @jsx React.DOM */
var Footer = require('./Footer.react');
var Header = require('./Header.react');
var MainSection = require('./MainSection.react');
var React = require('react');
var TodoStore = require('../stores/TodoStore');
function getTodoState() {
return {
allTodos: TodoStore.getAll()
};
}
var TodoApp = React.createClass({
getInitialState: function() {
return getTodoState();
},
componentDidMount: function() {
TodoStore.addChangeListener(this._onChange);
},
componentWillUnmount: function() {
TodoStore.removeChangeListener(this._onChange);
},
/**
* @return {object}
*/
render: function() {
return (
<div>
<Header />
<MainSection
allTodos={this.state.allTodos}
areAllComplete={this.state.areAllComplete}
/>
<Footer allTodos={this.state.allTodos} />
</div>
);
},
_onChange: function() {
this.setState(getTodoState());
}
});
module.exports = TodoApp;
```
Now we're in our familiar React territory, utilizing React's lifecycle methods. We set up the initial state of this controller-view in getInitialState(), register an event listener in componentDidMount(), and then clean up after ourselves within componentWillUnmount(). We render a containing div and pass down the collection of states we got from the TodoStore.
The Header component contains the primary text input for the application, but it does not need to know the state of the store. The MainSection and Footer do need this data, so we pass it down to them.
More Views
----------
At a high level, the React component hierarchy of the app looks like this:
```javascript
<TodoApp>
<Header>
<TodoTextInput />
<MainSection>
<ul>
<TodoItem />
</ul>
</MainSection>
</TodoApp>
```
If a TodoItem is in edit mode, it will also render a TodoTextInput as a child. Let's take a look at how some of these components display the data they receive as props, and how they communicate through actions with the dispatcher.
The MainSection needs to iterate over the collection of to-do items it received from TodoApp to create the list of TodoItems. In the component's render() method, we can do that iteration like so:
```javascript
var allTodos = this.props.allTodos;
for (var key in allTodos) {
todos.push(<TodoItem key={key} todo={allTodos[key]} />);
}
return (
<section id="main">
<ul id="todo-list">{todos}</ul>
);
```
Now each TodoItem can display it's own text, and perform actions utilizing it's own ID. Explaining all the different actions that a TodoItem can invoke in the TodoMVC example goes beyond the scope of this article, but let's just take a look at the action that deletes one of the to-do items. Here is an abbreviated version of the TodoItem:
```javascript
/** @jsx React.DOM */
var React = require('react');
var TodoActions = require('../actions/TodoActions');
var TodoTextInput = require('./TodoTextInput.react');
var TodoItem = React.createClass({
propTypes: {
todo: React.PropTypes.object.isRequired
},
render: function() {
var todo = this.props.todo;
return (
<li
key={todo.id}>
<label>
{todo.text}
</label>
<button className="destroy" onClick={this._onDestroyClick} />
</li>
);
},
_onDestroyClick: function() {
TodoActions.destroy(this.props.todo.id);
}
});
module.exports = TodoItem;
```
With a destroy action available in our library of TodoActions, and a store ready to handle it, connecting the user's interaction with application state changes could not be simpler. We just wrap our onClick handler around the destroy action, provide it with the id, and we're done. Now the user can click the destroy button and kick off the Flux cycle to update the rest of the application.
Text input, on the other hand, is just a bit more complicated because we need to hang on to the state of the text input within the React component itself. Let's take a look at how TodoTextInput works.
As you'll see below, with every change to the input, React expects us to update the state of the component. So when we are finally ready to save the text inside the input, we will put the value held in the component's state in the action's payload. This is UI state, rather than application state, and keeping that distinction in mind is a good guide for where state should live. All application state should live in the store, while components occasionally hold on to UI state. Ideally, React components preserve as little state as possible.
Because TodoTextInput is being used in multiple places within our application, with different behaviors, we'll need to pass the onSave method in as a prop from the component's parent. This allows onSave to invoke different actions depending on where it is used.
```javascript
/** @jsx React.DOM */
var React = require('react');
var ReactPropTypes = React.PropTypes;
var ENTER_KEY_CODE = 13;
var TodoTextInput = React.createClass({
propTypes: {
className: ReactPropTypes.string,
id: ReactPropTypes.string,
placeholder: ReactPropTypes.string,
onSave: ReactPropTypes.func.isRequired,
value: ReactPropTypes.string
},
getInitialState: function() {
return {
value: this.props.value || ''
};
},
/**
* @return {object}
*/
render: function() /*object*/ {
return (
<input
className={this.props.className}
id={this.props.id}
placeholder={this.props.placeholder}
onBlur={this._save}
onChange={this._onChange}
onKeyDown={this._onKeyDown}
value={this.state.value}
autoFocus={true}
/>
);
},
/**
* Invokes the callback passed in as onSave, allowing this component to be
* used in different ways.
*/
_save: function() {
this.props.onSave(this.state.value);
this.setState({
value: ''
});
},
/**
* @param {object} event
*/
_onChange: function(/*object*/ event) {
this.setState({
value: event.target.value
});
},
/**
* @param {object} event
*/
_onKeyDown: function(event) {
if (event.keyCode === ENTER_KEY_CODE) {
this._save();
}
}
});
module.exports = TodoTextInput;
```
The Header passes in the onSave method as a prop to allow the TodoTextInput to create new
to-do items:
```javascript
/** @jsx React.DOM */
var React = require('react');
var TodoActions = require('../actions/TodoActions');
var TodoTextInput = require('./TodoTextInput.react');
var Header = React.createClass({
/**
* @return {object}
*/
render: function() {
return (
<header id="header">
<h1>todos</h1>
<TodoTextInput
id="new-todo"
placeholder="What needs to be done?"
onSave={this._onSave}
/>
</header>
);
},
/**
* Event handler called within TodoTextInput.
* Defining this here allows TodoTextInput to be used in multiple places
* in different ways.
* @param {string} text
*/
_onSave: function(text) {
TodoActions.create(text);
}
});
module.exports = Header;
```
In a different context, such as in editing mode for an existing to-do item, we might pass an onSave callback that invokes `TodoActions.update(text)` instead.
Creating Semantic Actions
-------------------------
Here is the basic code for the two actions we used above in our views:
```javascript
/**
* TodoActions
*/
var AppDispatcher = require('../dispatcher/AppDispatcher');
var TodoConstants = require('../constants/TodoConstants');
var TodoActions = {
/**
* @param {string} text
*/
create: function(text) {
AppDispatcher.handleViewAction({
actionType: TodoConstants.TODO_CREATE,
text: text
});
},
/**
* @param {string} id
*/
destroy: function(id) {
AppDispatcher.handleViewAction({
actionType: TodoConstants.TODO_DESTROY,
id: id
});
},
};
module.exports = TodoActions;
```
As you can see, we really would not need to have the helpers AppDispatcher.handleViewAction() or TodoActions.create(). We could, in theory, call AppDispatcher.dispatch() directly and provide a payload. But as our application grows, having these helpers keeps the code clean and semantic. It's just a lot cleaner to write TodoActions.destroy(id) instead of writing a whole lot of things that our TodoItem shouldn't have to know about.
The payload produced by the TodoActions.create() will look like:
```javascript
{
source: 'VIEW_ACTION',
action: {
type: 'TODO_CREATE',
text: 'Write blog post about Flux'
}
}
```
This payload is provided to the TodoStore through its registered callback. The TodoStore then broadcasts the 'change' event, and the MainSection responds by fetching the new collection of to-do items from the TodoStore and changing its state. This change in state causes the TodoApp component to call its own render() method, and the render() method of all of its descendents.
Start Me Up
-----------
The bootstrap file of our application is app.js. It simply takes the TodoApp component and renders it in the root element of the application.
```javascript
/** @jsx React.DOM */
var React = require('react');
var TodoApp = require('./components/TodoApp.react');
React.renderComponent(
<TodoApp />,
document.getElementById('todoapp')
);
```
Adding Dependency Management to the Dispatcher
----------------------------------------------
As I said previously, our Dispatcher implementation is a bit naive. It's pretty good, but it will not suffice for most applications. We need a way to be able to manage dependencies between Stores. Let's add that functionality with a waitFor() method within the main body of the Dispatcher class.
We'll need another public method, waitFor(). Note that it returns a Promise that can in turn be returned from the Store callback.
```javascript
/**
* @param {array} promisesIndexes
* @param {function} callback
*/
waitFor: function(promiseIndexes, callback) {
var selectedPromises = promiseIndexes.map(function(index) {
return _promises[index];
});
return Promise.all(selectedPromises).then(callback);
}
```
Now within the TodoStore callback we can explicitly wait for any dependencies to first update before moving forward. However, if Store A waits for Store B, and B waits for A, then a circular dependency will occur. A more robust dispatcher is required to flag this scenario with warnings in the console.
The Future of Flux
------------------
A lot of people ask if Facebook will release Flux as an open source framework. Really, Flux is just an architecture, not a framework. But perhaps a Flux boilerplate project might make sense, if there is enough interest. Please let us know if you'd like to see us do this.
Thanks for taking the time to read about how we build client-side applications at Facebook. We hope Flux proves as useful to you as it has to us.

View File

@@ -7,7 +7,7 @@ next: tutorial.html
## JSFiddle
The easiest way to start hacking on React is using the following JSFiddle Hello Worlds
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/)
@@ -48,7 +48,7 @@ The XML syntax inside of JavaScript is called JSX; check out the [JSX syntax](/r
### Separate File
Your React JSX file can live in a separate file. Create the following `src/helloworld.js`.
Your React JSX code can live in a separate file. Create the following `src/helloworld.js`.
```javascript
/** @jsx React.DOM */
@@ -111,8 +111,8 @@ Update your HTML file as below:
## Want CommonJS?
If you want to use React within a module system, [fork our repo](http://github.com/facebook/react), `npm install` and run `grunt`. A nice set of CommonJS modules will be generated. Our `jsx` build tool can be integrated into most packaging systems (not just CommonJS) quite easily.
If you want to use React with [browserify](http://browserify.org/), [webpack](http://webpack.github.io/), or another CommonJS-compatible module system, just use the [`react` npm package](https://www.npmjs.org/package/react). In addition, the `jsx` build tool can be integrated into most packaging systems (not just CommonJS) quite easily.
## Next Steps
Check out [the tutorial](/react/docs/tutorial.html) and the other examples in the `/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. Good luck, and welcome!

View File

@@ -0,0 +1,120 @@
---
id: getting-started-zh-CN
title: 入门教程
layout: docs
next: tutorial.html
---
## JSFiddle
开始 Hack React 的最简单的方法是用下面 JSFiddle 的Hello Worlds
* **[React JSFiddle](http://jsfiddle.net/vjeux/kb3gN/)**
* [React JSFiddle without JSX](http://jsfiddle.net/vjeux/VkebS/)
## 入门教程包 (Starter Kit)
开始先下载入门教程包
<div class="buttons-unit downloads">
<a href="/react/downloads/react-{{site.react_version}}.zip" class="button">
下载入门教程 {{site.react_version}}
</a>
</div>
在入门教程包的根目录,创建一个含有下面代码的 `helloworld.html`
```html
<!DOCTYPE html>
<html>
<head>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/jsx">
/** @jsx React.DOM */
React.renderComponent(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
```
在 JavaScript 代码里写着 XML 格式的代码称为 JSX可以去 [JSX 语法](/react/docs/jsx-in-depth.html) 里学习更多 JSX 相关的知识。为了把 JSX 转成标准的 JavaScript我们用 `<script type="text/jsx">` 标签包裹着含有 JSX 的代码,然后引入 `JSXTransformer.js` 库来实现在浏览器里的代码转换。
### 分离文件
你的 React JSX 代码文件可以写在另外的文件里。新建下面的 `src/helloworld.js`
```javascript
/** @jsx React.DOM */
React.renderComponent(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
```
然后在 `helloworld.html` 引用该文件:
```html{10}
<script type="text/jsx" src="src/helloworld.js"></script>
```
### 离线转换
先安装命令行工具(依赖 [npm](http://npmjs.org/)
```
npm install -g react-tools
```
然后把你的 `src/helloworld.js` 文件转成标准的 JavaScript:
```
jsx --watch src/ build/
```
只要你修改了, `build/helloworld.js` 文件会自动生成。
```javascript{3}
/** @jsx React.DOM */
React.renderComponent(
React.DOM.h1(null, 'Hello, world!'),
document.getElementById('example')
);
```
> 注意:
>
> 目前注释解析器还是非常严格;为了让它能够找出 `@jsx` 修饰符,有两个限制是必须的。`@jsx` 注释块必须是代码文件第一个注释。注释必须以 `/**` (`/*` 和 `//` 不起作用) 开头。如果解析器找不到 `@jsx` 注释,它就不会转换代码,直接原样输出到文件。
对照下面更新你的 HTML 代码
```html{6,10}
<!DOCTYPE html>
<html>
<head>
<title>Hello React!</title>
<script src="build/react.js"></script>
<!-- No need for JSXTransformer! -->
</head>
<body>
<div id="example"></div>
<script src="build/helloworld.js"></script>
</body>
</html>
```
## 想用 CommonJS
如果你想在一个模块系统里使用 React[fork 我们的代码](http://github.com/facebook/react) `npm install` 然后运行 `grunt`。一个漂亮的 CommonJS 模块集将会被生成。我们的 `jsx` 转换工具可以很轻松的集成到大部分打包系统里(不仅仅是 CommonJS
## 下一步
去看看[入门教程](/react/docs/tutorial.html),然后学习其他在 `/examples` 目录里的示例代码。祝你好运,欢迎来到 React 的世界。

View File

@@ -11,49 +11,6 @@ next: component-api.html
`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.Children
`React.Children` provides utilities for dealing with the `this.props.children` opaque data structure.
#### React.Children.map
```javascript
object React.Children.map(object children, function fn [, object context])
```
Invoke `fn` on every immediate child contained within `children` with `this` set to `context`. If `children` is a nested object or array it will be traversed: `fn` will never be passed the container objects. If children is `null` or `undefined` returns `null` or `undefined` rather than an empty object.
#### React.Children.forEach
```javascript
React.Children.forEach(object children, function fn [, object context])
```
Like `React.Children.map()` but does not return an object.
#### React.Children.only
```javascript
object React.Children.only(object children)
```
Return the only child in `children`. Throws otherwise.
### React.DOM
`React.DOM` provides all of the standard HTML tags needed to build a React app. You generally don't use it directly; instead, just include it as part of the `/** @jsx React.DOM */` docblock.
### React.initializeTouchEvents
```javascript
initializeTouchEvents(boolean shouldUseTouch)
```
Configure React's event system to handle touch events on mobile devices.
### React.createClass
```javascript
@@ -81,6 +38,12 @@ If the React component was previously rendered into `container`, this will perfo
If the optional callback is provided, it will be executed after the component is rendered or updated.
> Note:
>
> `React.renderComponent()` replaces the contents of the container node you
> pass in. In the future, it may be possible to insert a component to an
> existing DOM node without overwriting the existing children.
### React.unmountComponentAtNode
@@ -90,10 +53,6 @@ boolean unmountComponentAtNode(DOMElement container)
Remove a mounted React component from the DOM and clean up its event handlers and state. If no component was mounted in the container, calling this function does nothing. Returns `true` if a component was unmounted and `false` if there was no component to unmount.
> Note:
>
> This method was called `React.unmountAndReleaseReactRootNode` until v0.5. It still works in v0.5 but will be removed in future versions.
### React.renderComponentToString
@@ -104,3 +63,68 @@ string renderComponentToString(ReactComponent component)
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.
If you call `React.renderComponent()` 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.
### React.renderComponentToStaticMarkup
```javascript
string renderComponentToStaticMarkup(ReactComponent component)
```
Similar to `renderComponentToString`, 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.
### React.DOM
`React.DOM` provides all of the standard HTML tags needed to build a React app. You generally don't use it directly; instead, just include it as part of the `/** @jsx React.DOM */` docblock.
### React.PropTypes
`React.PropTypes` includes types that can be used with a component's `propTypes` object to validate props being passed to your components. For more information about `propTypes`, see [Reusable Components](/react/docs/reusable-components.html).
### React.initializeTouchEvents
```javascript
initializeTouchEvents(boolean shouldUseTouch)
```
Configure React's event system to handle touch events on mobile devices.
### React.Children
`React.Children` provides utilities for dealing with the `this.props.children` opaque data structure.
#### React.Children.map
```javascript
object React.Children.map(object children, function fn [, object context])
```
Invoke `fn` on every immediate child contained within `children` with `this` set to `context`. If `children` is a nested object or array it will be traversed: `fn` will never be passed the container objects. If children is `null` or `undefined` returns `null` or `undefined` rather than an empty object.
#### React.Children.forEach
```javascript
React.Children.forEach(object children, function fn [, object context])
```
Like `React.Children.map()` but does not return an object.
#### React.Children.count
```javascript
number React.Children.count(object children)
```
Return the total number of components in `children`, equal to the number of times that a callback passed to `map` or `forEach` would be invoked.
#### React.Children.only
```javascript
object React.Children.only(object children)
```
Return the only child in `children`. Throws otherwise.

View File

@@ -9,65 +9,7 @@ next: component-specs.html
## ReactComponent
Component classes created by `createClass()` return instances of `ReactComponent` when called. Most of the time when you're using React you're either creating or consuming these component objects.
### getDOMNode
```javascript
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.
### setProps
```javascript
setProps(object nextProps)
```
When you're integrating with an external JavaScript application you may want to signal a change to a React component rendered with `renderComponent()`. Simply call `setProps()` to change its properties and trigger a re-render.
> Note:
>
> This method can only be called on a root-level component. That is, it's only available on the component passed directly to `renderComponent()` 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()`.
### replaceProps
```javascript
replaceProps(object nextProps)
```
Like `setProps()` but deletes any pre-existing props instead of merging the two objects.
### transferPropsTo
```javascript
ReactComponent transferPropsTo(ReactComponent targetComponent)
```
Transfer properties from this component to a target component that have not already been set on the target component. After the props are updated, `targetComponent` is returned as a convenience. This function is useful when creating simple HTML-like components:
```javascript
var Avatar = React.createClass({
render: function() {
return this.transferPropsTo(
<img src={"/avatars/" + this.props.userId + ".png"} userId={null} />
);
}
});
// <Avatar userId={17} width={200} height={200} />
```
Properties that are specified directly on the target component instance (such as `src` and `userId` in the above example) will not be overwritten by `transferPropsTo`.
> Note:
>
> Use `transferPropsTo` with caution; it encourages tight coupling and makes it easy to accidentally introduce implicit dependencies between components. When in doubt, it's safer to explicitly copy the properties that you need onto the child component.
Component classes created by `React.createClass()` return instances of `ReactComponent` when called. Most of the time when you're using React you're either creating or consuming these component objects.
### setState
@@ -76,7 +18,7 @@ Properties that are specified directly on the target component instance (such as
setState(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. In addition, you can supply an optional callback function that is executed once `setState` is completed.
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.
> Notes:
>
@@ -109,6 +51,15 @@ Calling `forceUpdate()` will cause `render()` to be called on the component and
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.
### getDOMNode
```javascript
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`.
### isMounted()
```javascript
@@ -116,3 +67,56 @@ 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()`.
### transferPropsTo
```javascript
ReactComponent transferPropsTo(ReactComponent targetComponent)
```
Transfer properties from this component to a target component that have not already been set on the target component. After the props are updated, `targetComponent` is returned as a convenience. This function is useful when creating simple HTML-like components:
```javascript
var Avatar = React.createClass({
render: function() {
return this.transferPropsTo(
<img src={"/avatars/" + this.props.userId + ".png"} userId={null} />
);
}
});
// <Avatar userId={17} width={200} height={200} />
```
Properties that are specified directly on the target component instance (such as `src` and `userId` in the above example) will not be overwritten by `transferPropsTo`.
> Note:
>
> Use `transferPropsTo` with caution; it encourages tight coupling and makes it easy to accidentally introduce implicit dependencies between components. When in doubt, it's safer to explicitly copy the properties that you need onto the child component.
### setProps
```javascript
setProps(object nextProps[, function callback])
```
When you're integrating with an external JavaScript application you may want to signal a change to a React component rendered with `React.renderComponent()`.
Though calling `React.renderComponent()` again on the same node is the preferred way to update a root-level component, you can also call `setProps()` to change its properties and trigger a re-render. In addition, you can supply an optional callback function that is executed once `setProps` is completed and the component is re-rendered.
> Note:
>
> When possible, the declarative approach of calling `React.renderComponent()` 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.renderComponent()` 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()`.
### replaceProps
```javascript
replaceProps(object nextProps[, function callback])
```
Like `setProps()` but deletes any pre-existing props instead of merging the two objects.

View File

@@ -22,6 +22,8 @@ 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`.
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.
@@ -40,9 +42,9 @@ Invoked once before the component is mounted. The return value will be used as t
object getDefaultProps()
```
Invoked once when the component is mounted. Values in the mapping will be set on `this.props` if that prop is not specified by the parent component (i.e. using an `in` check).
Invoked once and cached when the class is created. Values in the mapping will be set on `this.props` if that prop is not specified by the parent component (i.e. using an `in` check).
This method is invoked before `getInitialState` and therefore cannot rely on `this.state` or use `this.setState`.
This method is invoked before any instances are created and thus cannot rely on `this.props`. In addition, be aware that any complex objects returned by `getDefaultProps()` will be shared across instances, not copied.
### propTypes
@@ -53,8 +55,6 @@ object propTypes
The `propTypes` object allows you to validate props being passed to your components. For more information about `propTypes`, see [Reusable Components](/react/docs/reusable-components.html).
<!-- TODO: Document propTypes here directly. -->
### mixins
@@ -64,8 +64,6 @@ array mixins
The `mixins` array allows you to use mixins to share behavior among multiple components. For more information about mixins, see [Reusable Components](/react/docs/reusable-components.html).
<!-- TODO: Document mixins here directly. -->
### statics
@@ -98,7 +96,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#react-composite-components).
## Lifecycle Methods
@@ -112,7 +110,7 @@ Various methods are executed at specific points in a component's lifecycle.
componentWillMount()
```
Invoked once, immediately before the initial rendering occurs. If you call `setState` within this method, `render()` will see the updated state and will be executed only once despite the state change.
Invoked once, both on the client and server, immediately before the initial rendering occurs. If you call `setState` within this method, `render()` will see the updated state and will be executed only once despite the state change.
### Mounting: componentDidMount
@@ -121,7 +119,7 @@ Invoked once, immediately before the initial rendering occurs. If you call `setS
componentDidMount()
```
Invoked immediately after rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via `this.getDOMNode()`.
Invoked immediately after rendering occurs, only on the client (not on the server). At this point in the lifecycle, the component has a DOM representation which you can access via `this.getDOMNode()`.
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.
@@ -166,7 +164,7 @@ transition to the new props and state will not require a component update.
```javascript
shouldComponentUpdate: function(nextProps, nextState) {
return !equal(nextProps, this.props) || !equal(nextState, this.state);
return nextProps.id !== this.props.id;
}
```

View File

@@ -31,8 +31,8 @@ thead time title tr track u ul var video wbr
The following SVG elements are supported:
```
circle defs g line linearGradient path polygon polyline radialGradient rect
stop svg text
circle defs ellipse g line linearGradient mask path pattern polygon polyline
radialGradient rect stop svg text tspan
```
You may also be interested in [react-art](https://github.com/facebook/react-art), a drawing library for React that can render to Canvas, SVG, or VML (for IE8).
@@ -55,23 +55,30 @@ These standard attributes are supported:
```
accept accessKey action allowFullScreen allowTransparency alt async
autoComplete autoFocus autoPlay cellPadding cellSpacing charSet checked
className colSpan cols content contentEditable contextMenu controls data
dateTime defer dir disabled draggable encType form formNoValidate frameBorder
height hidden href htmlFor httpEquiv icon id label lang list loop max
maxLength method min multiple name noValidate pattern placeholder poster
preload radioGroup readOnly rel required role rowSpan rows sandbox scope
scrollLeft scrollTop seamless selected size span spellCheck src srcDoc step
style tabIndex target title type value width wmode
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 max maxLength mediaGroup method min multiple muted
name noValidate pattern placeholder poster preload radioGroup readOnly rel
required role rows rowSpan sandbox scope scrollLeft scrolling scrollTop
seamless selected shape size span spellCheck src srcDoc srcSet start step
style tabIndex target title type useMap value width wmode
```
In addition, the non-standard `autoCapitalize` and `autoCorrect` attributes are supported for Mobile Safari, and the `property` attribute is supported for Open Graph `<meta>` tags.
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).
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.
### SVG Attributes
```
cx cy d fill fx fy gradientTransform gradientUnits offset points r rx ry
spreadMethod stopColor stopOpacity stroke strokeLinecap strokeWidth transform
version viewBox x1 x2 x y1 y2 y
cx cy d dx dy fill fillOpacity fontFamily fontSize fx fy gradientTransform
gradientUnits markerEnd markerMid markerStart offset opacity
patternContentUnits patternUnits points preserveAspectRatio r rx ry
spreadMethod stopColor stopOpacity stroke strokeDasharray strokeLinecap
strokeOpacity strokeWidth textAnchor transform version viewBox x1 x2 x y1 y2 y
```

View File

@@ -62,8 +62,9 @@ Properties:
```javascript
boolean altKey
boolean ctrlKey
Number charCode
boolean ctrlKey
function getModifierState(key)
String key
Number keyCode
String locale
@@ -120,6 +121,7 @@ Number buttons
Number clientX
Number clientY
boolean ctrlKey
function getModifierState(key)
boolean metaKey
Number pageX
Number pageY
@@ -147,6 +149,7 @@ Properties:
boolean altKey
DOMTouchList changedTouches
boolean ctrlKey
function getModifierState(key)
boolean metaKey
boolean shiftKey
DOMTouchList targetTouches
@@ -181,8 +184,8 @@ onWheel
Properties:
```javascript
Number deltaX
Number deltaMode
Number deltaX
Number deltaY
Number deltaZ
```

View File

@@ -6,7 +6,7 @@ permalink: reconciliation.html
prev: special-non-dom-attributes.html
---
React key design decision is to make the API seem like it re-renders the whole app on every update. This makes writing applications a lot easier but is also an incredible challenge to make it tractable. This article explains how with powerful heuristics we managed to turn a O(n<sup>3</sup>) problem into a O(n) one.
React's key design decision is to make the API seem like it re-renders the whole app on every update. This makes writing applications a lot easier but is also an incredible challenge to make it tractable. This article explains how with powerful heuristics we managed to turn a O(n<sup>3</sup>) problem into a O(n) one.
## Motivation
@@ -76,7 +76,7 @@ After the attributes have been updated, we recurse on all the children.
### Custom Components
We decided that the two custom components are the same. Since components are stateful, we cannot just use the new component and call it a day. React takes all the attributes from the new component and call `component[Will/Did]ReceiveProps()` on the previous one.
We decided that the two custom components are the same. Since components are stateful, we cannot just use the new component and call it a day. React takes all the attributes from the new component and calls `component[Will/Did]ReceiveProps()` on the previous one.
The previous component is now operational. Its `render()` method is called and the diff algorithm restarts with the new result and the previous result.

View File

@@ -61,7 +61,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="http://jsfiddle.net/n25pd/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.
@@ -105,7 +105,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="http://jsfiddle.net/t53sx/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.
@@ -130,7 +130,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="http://jsfiddle.net/F8H7p/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

@@ -22,7 +22,7 @@ It'll also have a few neat features:
### Want to skip all this and just see the source?
[It's all on GitHub.](https://github.com/petehunt/react-tutorial)
[It's all on GitHub.](https://github.com/reactjs/react-tutorial)
### Getting started
@@ -40,9 +40,7 @@ For this tutorial we'll use prebuilt JavaScript files on a CDN. Open up your fav
<body>
<div id="content"></div>
<script type="text/jsx">
/**
* @jsx React.DOM
*/
/** @jsx React.DOM */
// The above declaration must remain intact at the top of the script.
// Your code here
</script>
@@ -88,18 +86,17 @@ The first thing you'll notice is the XML-ish syntax in your JavaScript. We have
```javascript
// tutorial1-raw.js
var CommentBox = React.createClass({
var CommentBox = React.createClass({displayName: 'CommentBox',
render: function() {
return (
React.DOM.div({
className: 'commentBox',
children: 'Hello, world! I am a CommentBox.'
})
React.DOM.div({className: "commentBox"},
"Hello, world! I am a CommentBox."
)
);
}
});
React.renderComponent(
CommentBox({}),
CommentBox(null),
document.getElementById('content')
);
```
@@ -304,12 +301,16 @@ React.renderComponent(
Now that the data is available in the `CommentList`, let's render the comments dynamically:
```javascript{4-6,9}
```javascript{4-10,13}
// tutorial10.js
var CommentList = React.createClass({
render: function() {
var commentNodes = this.props.data.map(function (comment) {
return <Comment author={comment.author}>{comment.text}</Comment>;
return (
<Comment author={comment.author}>
{comment.text}
</Comment>
);
});
return (
<div className="commentList">
@@ -385,7 +386,7 @@ var CommentBox = React.createClass({
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
componentDidMount: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
@@ -409,9 +410,9 @@ var CommentBox = React.createClass({
});
```
Here, `componentWillMount` is a method called automatically by React before 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.
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,16-17,31}
```javascript{3,19-20,34}
// tutorial14.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
@@ -420,13 +421,16 @@ var CommentBox = React.createClass({
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
@@ -471,7 +475,7 @@ 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-13,16-17,21}
```javascript{3-13,16-18}
// tutorial16.js
var CommentForm = React.createClass({
handleSubmit: function() {
@@ -489,11 +493,7 @@ var CommentForm = React.createClass({
return (
<form className="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input
type="text"
placeholder="Say something..."
ref="text"
/>
<input type="text" placeholder="Say something..." ref="text" />
<input type="submit" value="Post" />
</form>
);
@@ -517,7 +517,7 @@ When a user submits a comment, we will need to refresh the list of comments to i
We need to pass data from the child component to its parent. We do this by passing a `callback` in props from parent to child:
```javascript{12-14,28}
```javascript{15-17,30}
// tutorial17.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
@@ -526,6 +526,9 @@ var CommentBox = React.createClass({
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
@@ -535,7 +538,7 @@ var CommentBox = React.createClass({
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
@@ -544,9 +547,7 @@ var CommentBox = React.createClass({
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
<CommentForm onCommentSubmit={this.handleCommentSubmit} />
</div>
);
}
@@ -570,11 +571,7 @@ var CommentForm = React.createClass({
return (
<form className="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input
type="text"
placeholder="Say something..."
ref="text"
/>
<input type="text" placeholder="Say something..." ref="text" />
<input type="submit" value="Post" />
</form>
);
@@ -584,7 +581,7 @@ var CommentForm = React.createClass({
Now that the callbacks are in place, all we have to do is submit to the server and refresh the list:
```javascript{13-21}
```javascript{16-27}
// tutorial19.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
@@ -593,6 +590,9 @@ var CommentBox = React.createClass({
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
@@ -604,13 +604,16 @@ var CommentBox = React.createClass({
data: comment,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
@@ -619,9 +622,7 @@ var CommentBox = React.createClass({
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
<CommentForm onCommentSubmit={this.handleCommentSubmit} />
</div>
);
}
@@ -632,7 +633,7 @@ var CommentBox = React.createClass({
Our application is now feature complete but it feels slow to have to wait for the request to complete before your comment appears in the list. We can optimistically add this comment to the list to make the app feel faster.
```javascript{13-15}
```javascript{16-18}
// tutorial20.js
var CommentBox = React.createClass({
loadCommentsFromServer: function() {
@@ -641,6 +642,9 @@ var CommentBox = React.createClass({
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
@@ -655,13 +659,16 @@ var CommentBox = React.createClass({
data: comment,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
@@ -670,9 +677,7 @@ var CommentBox = React.createClass({
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm
onCommentSubmit={this.handleCommentSubmit}
/>
<CommentForm onCommentSubmit={this.handleCommentSubmit} />
</div>
);
}

View File

@@ -13,6 +13,51 @@ next: complementary-tools.html
"At Facebook and Instagram, were trying to push the limits of whats possible on the web with React. My talk will start with a brief introduction to the framework, and then dive into three controversial topics: Throwing out the notion of templates and building views with JavaScript, “re-rendering” your entire application when your data changes, and a lightweight implementation of the DOM and events." -- [Pete Hunt](http://www.petehunt.net/)
### Thinking in react - tagtree.tv
A [tagtree.tv](http://tagtree.tv/) video conveying the principles of [Thinking in React](/react/docs/thinking-in-react.html) while building a simple app
<figure>[![](/react/img/docs/thinking-in-react-tagtree.png)](http://tagtree.tv/thinking-in-react)</figure>
### Secrets of the Virtual DOM - MtnWest JS
<iframe width="560" height="315" src="//www.youtube.com/embed/h3KksH8gfcQ" frameborder="0" allowfullscreen></iframe>
"In this talk Ill be discussing why we built a virtual DOM, how it compares to other systems, and its relevance to the future of browser technologies." -- [Pete Hunt](http://www.petehunt.net/)
### CodeWinds
[Pete Hunt](http://www.petehunt.net/) talked with [Jeff Barczewski](http://jeff.barczewski.com/) about React in CodeWinds Episode 4.
<figure>[![](/react/img/docs/codewinds-004.png)](http://codewinds.com/4)</figure>
<table width="100%"><tr><td>
02:08 - What is React and why use it?<br />
03:08 - The symbiotic relationship of ClojureScript and React<br />
04:54 - The history of React and why it was created<br />
09:43 - Updating web page with React without using data binding<br />
13:11 - Using the virtual DOM to change the browser DOM<br />
13:57 - Programming with React, render targets HTML, canvas, other<br />
16:45 - Working with designers. Contrasted with Ember and AngularJS<br />
21:45 - JSX Compiler bridging HTML and React javascript<br />
23:50 - Autobuilding JSX and in browser tools for React<br />
24:50 - Tips and tricks to working with React, getting started<br />
</td><td>
27:17 - Rendering HTML on the server with Node.js. Rendering backends<br />
29:20 - React evolved through survival of the fittest at Facebook<br />
30:15 - Ideas for having state on server and client, using web sockets.<br />
32:05 - React-multiuser - distributed shared mutable state using Firebase<br />
33:03 - Better debugging with React using the state transitions, replaying events<br />
34:08 - Differences from Web Components<br />
34:25 - Notable companies using React<br />
35:16 - Could a React backend plugin be created to target PDF?<br />
36:30 - Future of React, what's next?<br />
39:38 - Contributing and getting help<br />
</td></tr></table>
[Read the episode notes](http://codewinds.com/4)
### JavaScript Jabber
[Pete Hunt](http://www.petehunt.net/) and [Jordan Walke](https://github.com/jordwalke) talked about React in JavaScript Jabber 73.
@@ -57,12 +102,16 @@ By [Steven Luscher](https://github.com/steveluscher)
by [Stoyan Stefanov](http://www.phpied.com/)
### "fun + React + ClojureScript" - Small Talk KyivJS Meetup
### React, or how to make life simpler - FrontEnd Dev Conf '14
<iframe width="650" height="315" src="//www.youtube.com/embed/R2CGKiNnPFo" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="//www.youtube.com/embed/YJNUK0EA_Jo" frameborder="0" allowfullscreen></iframe>
**In Russian** by [Alexander Solovyov](http://solovyov.net/)
### "Functional DOM programming" - Meteor DevShop 11
<iframe width="650" height="315" src="//www.youtube.com/embed/qqVbr_LaCIo" frameborder="0" allowfullscreen></iframe>
### "Rethinking Web App Development at Facebook" - Facebook F8 Conference 2014
<iframe width="650" height="315" src="//www.youtube.com/embed/nYkdrAPrdcw" frameborder="0" allowfullscreen></iframe>

View File

@@ -76,6 +76,8 @@ React.renderComponent(...);
If you'd like to use any [add-ons](/react/docs/addons.html), use `var React = require('react/addons');` instead.
**Note:** by default, React will be in development mode. To use React in production mode, set the environment variable `NODE_ENV` to `production`. A minifier that performs dead-code elimination such as [UglifyJS](https://github.com/mishoo/UglifyJS2) is recommended to completely remove the extra code present in development mode.
## Bower
```sh

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
docs/img/docs/perf-dom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -20,5 +20,5 @@ React.renderComponent(<input value="hi" />, mountNode);
setTimeout(function() {
React.renderComponent(<input value={null} />, mountNode);
}, 2000);
}, 1000);
```

View File

@@ -9,6 +9,8 @@ next: false-in-jsx.html
Fetch data in `componentDidMount`. When the response arrives, store the data in state, triggering a render to update your UI.
When processing the response of an asynchronous request, be sure to check that the component is still mounted before updating its state by using `this.isMounted()`.
This example fetches the desired Github user's latest gist:
```js
@@ -25,10 +27,12 @@ var UserGist = React.createClass({
componentDidMount: function() {
$.get(this.props.source, function(result) {
var lastGist = result[0];
this.setState({
username: lastGist.user.login,
lastGistUrl: lastGist.html_url
});
if (this.isMounted()) {
this.setState({
username: lastGist.owner.login,
lastGistUrl: lastGist.html_url
});
}
}.bind(this));
},

View File

@@ -4,6 +4,7 @@ title: Expose Component Functions
layout: tips
permalink: expose-component-functions.html
prev: communicate-between-components.html
next: references-to-components.html
---
There's another (uncommon) way of [communicating between components](/react/tips/communicate-between-components.html): simply expose a method on the child component for the parent to call.

View File

@@ -4,6 +4,7 @@ title: References to Components
layout: tips
permalink: references-to-components.html
prev: expose-component-functions.html
next: children-undefined.html
---
If you're using React components in a larger non-React application or transitioning your code to React, you may need to keep references to components. `React.renderComponent` returns a reference to the mounted component:
@@ -14,12 +15,12 @@ If you're using React components in a larger non-React application or transition
var myComponent = React.renderComponent(<MyComponent />, myContainer);
```
If you pass a variable to 'React.renderComponent`, it's not guaranteed that the component passed in will be the one that's mounted. In cases where you construct a component before mounting it, be sure to reassign your variable:
Keep in mind, however, that the "constructor" of a component doesn't return a component instance! It's just a **descriptor**: a lightweight representation that tells React what the mounted component should look like.
```js
/** @jsx React.DOM */
var myComponent = <MyComponent />;
var myComponent = <MyComponent />; // This is just a descriptor.
// Some code here...
@@ -28,4 +29,4 @@ myComponent = React.renderComponent(myComponent, myContainer);
> Note:
>
> This should only ever be used at the top level. Inside components, let your `props` and `state` handle communication with child components, and only reference components via `ref`s.
> This should only ever be used at the top level. Inside components, let your `props` and `state` handle communication with child components, and only reference components via [refs](http://facebook.github.io/react/docs/more-about-refs.html).

View File

@@ -0,0 +1,29 @@
---
id: children-undefined
title: this.props.children undefined
layout: tips
permalink: children-undefined.html
prev: references-to-components.html
---
You can't access the children of your component through `this.props.children`. `this.props.children` designates the children being **passed onto you** by the owner:
```js
/** @jsx React.DOM */
var App = React.createClass({
componentDidMount: function() {
// This doesn't refer to the `span`s! It refers to the children between
// last line's `<App></App>`, which are undefined.
console.log(this.props.children);
},
render: function() {
return <div><span/><span/></div>;
}
});
React.renderComponent(<App></App>, mountNode);
```
To access your own subcomponents (the `span`s), place [refs](http://facebook.github.io/react/docs/more-about-refs.html) on them.

5
examples/README.md Normal file
View File

@@ -0,0 +1,5 @@
# React Examples
Here are some small React demos. Some use [JSX](http://facebook.github.io/react/docs/jsx-in-depth.html) and some include third-party library integration.
For more fully-featured examples, check out [React TodoMVC](http://todomvc.com/architecture-examples/react/) and [React + Backbone TodoMVC](http://todomvc.com/labs/architecture-examples/react-backbone/).

View File

@@ -18,9 +18,7 @@ var BallmerPeakCalculator = React.createClass({
this.setState({bac: event.target.value});
},
render: function() {
var bac;
var pct;
pct = computeBallmerPeak(this.state.bac);
var pct = computeBallmerPeak(this.state.bac);
if (isNaN(pct)) {
pct = 'N/A';
} else {
@@ -34,7 +32,7 @@ var BallmerPeakCalculator = React.createClass({
<p>
If your BAC is{' '}
<input type="text" onChange={this.handleChange} value={this.state.bac} />
{', '}then <b>{pct}</b> of your lines of code will have bugs.
{', '}then <b>{pct}</b> of your lines of code will be bug free.
</p>
</div>
);

View File

@@ -23,6 +23,9 @@
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script src="../../build/JSXTransformer.js"></script>
<script type="text/jsx" src="example.js"></script>

View File

@@ -0,0 +1,7 @@
# Basic example of using React with Browserify
Run `npm install` in the directory to install React from npm. Then run:
./node_modules/.bin/browserify --debug --transform reactify ./index.js > ./bundle.js
to produce `bundle.js` with example code and React.

View File

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
<title>Basic CommonJS Example with Browserify</title>
<link rel="stylesheet" href="../shared/css/base.css" />
</head>
<body>
<h1>Basic CommonJS Example with Browserify</h1>
<div id="container">
<p>
To install React, follow the instructions on
<a href="http://www.github.com/facebook/react/">GitHub</a>.
</p>
<p>
If you can see this, React is not working right.
If you checked out the source from GitHub make sure to run <code>grunt</code>.
</p>
</div>
<h4>Example Details</h4>
<p>This is written with JSX in a CommonJS module and precompiled to vanilla JS by running:</p>
<pre>browserify --debug --transform reactify index.js &gt; bundle.js</pre>
<p>
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="bundle.js"></script>
</body>
</html>

View File

@@ -0,0 +1,25 @@
/**
* @jsx React.DOM
*/
var React = require('react');
var ExampleApplication = React.createClass({
render: function() {
var elapsed = Math.round(this.props.elapsed / 100);
var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
var message =
'React has been successfully running for ' + seconds + ' seconds.';
return <p>{message}</p>;
}
});
var start = new Date().getTime();
setInterval(function() {
React.renderComponent(
<ExampleApplication elapsed={new Date().getTime() - start} />,
document.getElementById('container')
);
}, 50);

View File

@@ -0,0 +1,14 @@
{
"name": "react-basic-commonjs-example",
"description": "Basic example of using React with CommonJS",
"main": "index.js",
"devDependencies": {
"envify": "~1.2.1",
"react": "~0.10.0",
"reactify": "~0.13.1",
"browserify": "~3.44.2"
},
"scripts": {
"build": "browserify --debug --transform reactify index.js > bundle.js"
}
}

View File

@@ -24,6 +24,9 @@
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script src="../../build/JSXTransformer.js"></script>
<script type="text/jsx" src="example.js"></script>

View File

@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
<title>Basic Example with JSX with Harmony</title>
<link rel="stylesheet" href="../shared/css/base.css" />
</head>
<body>
<h1>Basic Example with JSX with Harmony</h1>
<div id="container">
<p>
To install React, follow the instructions on
<a href="http://www.github.com/facebook/react/">GitHub</a>.
</p>
<p>
If you can see this, React is not working right.
If you checked out the source from GitHub make sure to run <code>grunt</code>.
</p>
</div>
<h4>Example Details</h4>
<p>This is written with JSX with Harmony (ES6) syntax and transformed in the browser.<p>
<p>
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../../build/react.js"></script>
<script src="../../build/JSXTransformer.js"></script>
<script type="text/jsx;harmony=true">
/**
* @jsx React.DOM
*/
var ExampleApplication = React.createClass({
render() {
var elapsed = Math.round(this.props.elapsed / 100);
var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
var message =
`React has been successfully running for ${seconds} seconds.`;
return <p>{message}</p>;
}
});
var start = new Date().getTime();
setInterval(() => {
React.renderComponent(
<ExampleApplication elapsed={new Date().getTime() - start} />,
document.getElementById('container')
);
}, 50);
</script>
</body>
</html>

View File

@@ -24,6 +24,9 @@ jsx . build/</pre>
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script src="build/example.js"></script>
</body>

View File

@@ -23,6 +23,9 @@
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script src="../../build/JSXTransformer.js"></script>
<script type="text/jsx">

View File

@@ -23,6 +23,9 @@
Learn more about React at
<a href="http://facebook.github.io/react" target="_blank">facebook.github.io/react</a>.
</p>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script>
var ExampleApplication = React.createClass({

View File

@@ -9,6 +9,9 @@
</head>
<body>
<div id="jqueryexample"></div>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="../../build/react.js"></script>
<script src="../../build/JSXTransformer.js"></script>
<script type="text/javascript" src="../shared/thirdparty/jquery.min.js" charset="utf-8"></script>

View File

@@ -10,6 +10,9 @@
</head>
<body class="ui-mobile-viewport ui-overlay-a">
<div id="content"></div>
<script src="../shared/thirdparty/es5-shim.min.js"></script>
<script src="../shared/thirdparty/es5-sham.min.js"></script>
<script src="../shared/thirdparty/console-polyfill.js"></script>
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="//code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.js"></script>
<script src="../../build/react.js"></script>

View File

@@ -0,0 +1,44 @@
# React server rendering example
This example demonstrates how React's server rendering works. Rather than demonstrate a pure-Node solution, this example shows how an app not written in JavaScript (in this case, PHP) can utilize React's server rendering capabilities.
## Overview
You generally start a React app by doing something like this:
```javascript
React.renderComponent(MyComponent({someData: ...}), document.getElementById('someContainer'));
```
The problem is that `someContainer` will be an empty HTML element until the JavaScript downloads and executes. This is bad for page load performance (since the user can't see anything until the JS downloads and executes) and is bad for SEO (since the Googlebot can't see any content). React's server rendering solves this problem -- it lets you fill `someContainer` with *static HTML* on the server and "bring it to life" on the client *without* throwing out and re-creating the HTML.
In order to do this, you need to do a few things. You need to be able to run JavaScript on the server, and you need to be able to bundle that JavaScript code and send it down to the browser. This example provides one architecture, but there are many ways to do it.
## Architecture overview
Let's augment an existing PHP app to support server rendering. This architecture runs an Express-based Node web service to run the JavaScript server side. PHP simply uses `file_get_contents()` to send an HTTP request to this service to get the static HTML string.
Browserify is used to run the same code that Node.js is running inside of the browser (aka "isomorphic" JavaScript).
```
+-------------+ +------------------+ +----------------------+
| | | | ---- HTTP request (module, props JSON) ---> | |
| The browser | <---> | Existing PHP App | | Node.js react server |
| | | | <--- HTTP response (static HTML string) --- | |
+------+------+ +------------------+ +----------------------+
^ ^
| |
| +------------------+ +-----------+----------+
| | | | |
+--------------+ Browserify | <--------------------------------------------+ App code (CommonJS) |
| | | |
+------------------+ +----------------------+
```
## How to run the demo
* `npm install` from `jsapp/` and `reactserver/`.
* Run `browserify` by doing `npm run build` inside `jsapp/`. This will generate a `webapp/static/bundle.js` file.
* Run the node server by doing `npm start` inside `reactserver/`.
* Finally, open `index.php` in your browser (on a webserver running PHP, of course). View-source to see the rendered markup.
* Kill the `reactserver` and reload `index.php`. You'll notice that the app still works! View-source and you'll see no rendered markup. React is smart enough to recover if server rendering doesn't work.

View File

@@ -0,0 +1,18 @@
{
"name": "example-js-app",
"version": "0.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "browserify -t reactify -r react -r ./src/App > ../webapp/static/bundle.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Pete Hunt",
"license": "Apache 2",
"dependencies": {
"envify": "^1.2.1",
"react": "^0.10.0",
"browserify": "^3.38.0",
"reactify": "^0.10.0"
}
}

View File

@@ -0,0 +1,10 @@
/** @jsx React.DOM */
var React = require('react');
var App = React.createClass({
render: function() {
return <h1>Hello {this.props.name}!</h1>;
}
});
module.exports = App;

View File

@@ -0,0 +1,18 @@
{
"name": "react-server",
"version": "0.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "cd ../jsapp && node ../reactserver/server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Pete Hunt",
"license": "Apache 2",
"dependencies": {
"envify": "^1.2.1",
"react": "^0.10.0",
"express": "^3.5.1",
"node-jsx": "^0.10.0"
}
}

View File

@@ -0,0 +1,21 @@
var React = require('react');
var express = require('express');
var path = require('path');
// Transparently support JSX
require('node-jsx').install();
var app = express();
// All the render server does is take a CommonJS module ID and some JSON props
// in the querystring and return a static HTML representation of the component.
// Note that this is a backend service hit by your actual web app. Even so,
// you would probably put Varnish in front of this in production.
app.get('/', function(req, res){
var component = require(path.resolve(req.query['module']));
var props = JSON.parse(req.query['props'] || '{}');
res.send(React.renderComponentToString(component(props)));
});
app.listen(3000);

View File

@@ -0,0 +1,51 @@
<?php
// URL to the box running `node server.js`
define('RENDER_SERVER', 'http://localhost:3000/');
function react_component($module, $props) {
$props_json = json_encode($props);
// Try to server-render the component if the service is available.
// If it isn't, no big deal: the client will transparently render
// the markup!
$server_markup = @file_get_contents(
RENDER_SERVER .
'?module=' .
urlencode($module) .
'&props=' .
urlencode($props_json)
);
$container_id = uniqid();
// Generate the code required to run the component on the client.
// We assume that the Browserify bundle is loaded in the page already
// and that you used -r to get a global require() function that provides
// every $module you may request as well as React.
// Note that this solution is simple but I don't think it scales to
// multiple large pages very well. For that you'd be better off using
// webpack.
$startup_code =
'<script>require(\'react\').renderComponent(require(' .
json_encode($module) .
')(' . $props_json . '), ' .
'document.getElementById(' . json_encode($container_id) . '))' .
'</script>';
$container_markup = '<div id="' . $container_id . '">' . $server_markup . '</div>';
return $container_markup . $startup_code;
}
?>
<html>
<head>
<title>React server rendering example</title>
<script src="static/bundle.js"></script>
</head>
<body>
Welcome to the React server rendering example. Here is a server-rendered React component:
<?php echo react_component('./src/App', array('name' => 'Pete')); ?>
</body>
</html>

View File

@@ -0,0 +1 @@
Nothing to see here... yet!

View File

@@ -0,0 +1,15 @@
// Console-polyfill. MIT license.
// https://github.com/paulmillr/console-polyfill
// Make it safe to do console.log() always.
(function(con) {
'use strict';
var prop, method;
var empty = {};
var dummy = function() {};
var properties = 'memory'.split(',');
var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' +
'groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,' +
'table,time,timeEnd,timeStamp,trace,warn').split(',');
while (prop = properties.pop()) con[prop] = con[prop] || empty;
while (method = methods.pop()) con[method] = con[method] || dummy;
})(this.console = this.console || {}); // Using `this` for web workers.

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