Content deleted Content added
Adding/improving reference(s) Tags: Visual edit Mobile edit Mobile web edit Advanced mobile edit |
Renamed references using RefRenamer | Cleaned up using AutoEd, expanded contractions using script |
||
Line 8:
{{Infobox software
| name = React
| logo =
| author = Jordan Walke
| developer = [[Meta Platforms|Meta]] and community
| released = {{Start date and age|2013|5|29}}<ref name="
| ver layout = stacked
| latest release version = {{wikidata|property|reference|edit|P348}}
Line 25:
}}
'''React''' (also known as '''React.js''' or '''ReactJS''') is a [[free and open-source software|free and open-source]] [[frontend and backend|front-end]] [[JavaScript library]]<ref name="
React can be used to develop [[single-page application|single-page]], mobile, or [[server-side rendering|server-rendered]] applications with frameworks like [[Next.js]]. Because React is only concerned with the user interface and rendering components to the [[Document Object Model|DOM]], React applications often rely on [[JavaScript libraries|libraries]] for routing and other client-side functionality.{{sfn|Dere|2017}}{{sfn|Panchal|2022}} A key advantage of React is that it only rerenders those parts of the page that have changed, avoiding unnecessary re-rendering of unchanged DOM elements. It was first launched on 29 May 2013.<ref>{{Cite web |date=2021-04-12 |title=Is React a Library or a Framework? Here's Why it Matters |url=https://www.freecodecamp.org/news/is-react-a-library-or-a-framework/ |access-date=2024-10-12 |website=freeCodeCamp.org |language=en}}</ref>
== Notable features ==
=== Declarative ===
<ref>{{Cite web |date=2017-09-27 |title=React Introduction |url=https://www.geeksforgeeks.org/reactjs-introduction/ |access-date=2024-10-12 |website=GeeksforGeeks |language=en-US}}</ref>React adheres to the [[declarative programming]] [[Programming paradigm|paradigm]].{{sfn|Wieruch|2020}}{{rp|76}} Developers design views for each state of an application, and React updates and renders components when data changes. This is in contrast with [[imperative programming]].{{sfn|Schwarzmüller|2018}}
=== Components ===
React code is made of entities called [[Component-based software engineering|components]].{{sfn|Wieruch|2020}}{{rp|10-12}} These components are modular and reusable.{{sfn|Wieruch|2020}}{{rp|70}} React applications typically consist of many layers of components. The components are rendered to a root element in the [[Document Object Model|DOM]] using the React DOM library. When rendering a component, values are passed between components through ''props'' (short for "properties")''.'' Values internal to a component are called its ''state.''<ref>{{cite web |title=Components and Props |url=https://reactjs.org/docs/components-and-props.html#props-are-read-only |url-status=live |access-date=7 April 2018 |website=React |publisher=Facebook |archive-date=7 April 2018 |archive-url=https://web.archive.org/web/20180407120115/https://reactjs.org/docs/components-and-props.html}}</ref>
Line 52:
}}</ref> Hooks are functions that let developers "hook into" React state and lifecycle features from function components.<ref>{{Cite web|url=https://reactjs.org/docs/hooks-overview.html|title=Hooks at a Glance – React|website=reactjs.org|language=en|access-date=2019-08-08|archive-date=2023-03-15|archive-url=https://web.archive.org/web/20230315054047/https://reactjs.org/docs/hooks-overview.html|url-status=live}}</ref> Notably, Hooks do not work inside classes — they let developers use more features of React without classes.<ref>{{Cite web|url=https://blog.soshace.com/what-the-heck-is-react-hooks/|title=What the Heck is React Hooks?|date=2020-01-16|website=Soshace|language=en|access-date=2020-01-24|archive-date=2022-05-31|archive-url=https://web.archive.org/web/20220531133601/https://blog.soshace.com/what-the-heck-is-react-hooks/|url-status=live}}</ref>
React provides several built-in hooks such as <code>useState</code>,<ref>{{Cite web|url=https://reactjs.org/docs/hooks-state.html|title=Using the State Hook – React|website=reactjs.org|language=en|access-date=2020-01-24|archive-date=2022-07-30|archive-url=https://web.archive.org/web/20220730180312/https://reactjs.org/docs/hooks-state.html|url-status=live}}</ref>{{sfn|Larsen|2021}}{{rp|37}} <code>useContext</code>,{{sfn|Wieruch|2020}}{{rp|11}}<ref name=
==== Rules of hooks ====
There are two rules of hooks<ref>{{Cite web|url=https://reactjs.org/docs/hooks-rules.html|title=Rules of Hooks – React|website=reactjs.org|language=en|access-date=2020-01-24|archive-date=2021-06-06|archive-url=https://web.archive.org/web/20210606174151/https://reactjs.org/docs/hooks-rules.html|url-status=live}}</ref> which describe the characteristic code patterns that hooks rely on:
# "Only call hooks at the top level" —
# "Only call hooks from React functions" —
Although these rules
=== Server components ===
Line 75:
</syntaxhighlight>
Currently, server components are most readily usable with [[Next.js]].
=== Class components ===
Line 90:
</syntaxhighlight>The introduction of React Hooks with React 16.8 in February 2019 allowed developers to manage state and lifecycle behaviors within functional components, reducing the reliance on class components.
This trend aligns with the broader industry movement towards functional programming and modular design. As React continues to evolve, it
=== Routing ===
React itself does not come with built-in support for [[routing]]. React is primarily a library for building user interfaces, and it
[[File:VirtualDOM with respect to realDOM.png|thumb|There is a Virtual DOM that is used to implement the real DOM]]
=== Virtual DOM ===
Another notable feature is the use of a virtual [[Document Object Model]], or [[Virtual DOM]]. React creates an [[In-memory processing|in-memory]] data-structure cache, computes the resulting differences, and then updates the browser's displayed DOM efficiently.<ref name="
== Updates ==
Line 107:
=== Lifecycle methods ===
Lifecycle methods for class-based components use a form of [[hooking]] that allows the execution of code at set points during a component's lifetime.
* <code>ShouldComponentUpdate</code> allows the developer to prevent unnecessary re-rendering of a component by returning false if a render is not required.
* <code>componentDidMount</code> is called once the component has "mounted" (the component has been created in the user interface, often by associating it with a [[Document Object Model|DOM]] node). This is commonly used to trigger data loading from a remote source via an [[API]].
* <code>componentDidUpdate</code> is invoked immediately after updating occurs.<ref>{{Cite web |title=React.Component – React |url=https://legacy.reactjs.org/docs/react-component.html |access-date=2024-04-09 |website=legacy.reactjs.org |language=en |archive-date=2024-04-09 |archive-url=https://web.archive.org/web/20240409075058/https://legacy.reactjs.org/docs/react-component.html |url-status=live }}</ref>
* <code>componentWillUnmount</code> is called immediately before the component is torn down or "unmounted". This is commonly used to clear resource-demanding dependencies to the component that will not simply be removed with the unmounting of the component (e.g., removing any <code>setInterval()</code> instances that are related to the component, or an "[[Event (computing)|eventListener]]" set on the "document" because of the presence of the component)
* <code>render</code> is the most important lifecycle method and the only required one in any component. It is usually called every time the component's state is updated, which should be reflected in the user interface.
=== JSX ===
{{Main|JSX (JavaScript)|l1=JSX}}
[[JSX (JavaScript)|JSX]], or JavaScript XML, is an extension to the JavaScript language syntax.<ref>{{cite web |date=2022-03-08 |title=Draft: JSX Specification |url=https://facebook.github.io/jsx/ |access-date=7 April 2018 |website=JSX |publisher=Facebook |language=en-US |archive-date=2022-04-02 |archive-url=https://web.archive.org/web/20220402072504/https://facebook.github.io/jsx/ |url-status=live }}</ref> Similar in appearance to HTML,{{sfn|Wieruch|2020}}{{rp|11}} JSX provides a way to structure component rendering using syntax familiar{{sfn|Wieruch|2020}}{{rp|15}} to many developers. React components are typically written using JSX, although they do not have to be (components may also be written in pure JavaScript). JSX is similar to another extension syntax created by Facebook for [[PHP]] called [[XHP]].
Line 133 ⟶ 132:
</syntaxhighlight>
=== Architecture beyond HTML ===
The basic [[Software architecture|architecture]] of React applies beyond rendering HTML in the browser. For example, Facebook has dynamic charts that render to <code><nowiki><canvas></nowiki></code> tags,<ref>{{cite web |last=Hunt |first=Pete |date=2013-06-05 |title=Why did we build React? – React Blog |url=https://facebook.github.io/react/blog/2013/06/05/why-react.html |access-date=2022-02-17 |website=reactjs.org |language=en-US |archive-date=2015-04-06 |archive-url=https://web.archive.org/web/20150406072833/http://facebook.github.io/react/blog/2013/06/05/why-react.html |url-status=dead }}</ref> and Netflix and [[PayPal]] use universal loading to render identical HTML on both the server and client.<ref name="
=== Server-side rendering ===
Line 144 ⟶ 143:
React supports SSR, which allows developers to render React components on the server and send the resulting HTML to the client. This can be useful for improving the performance of the application, as well as for [[search engine optimization]] purposes.
== Common idioms ==
React does not attempt to provide a complete application library. It is designed specifically for building user interfaces<ref name="
=== Unidirectional data flow ===
To support React's concept of unidirectional data flow (which might be contrasted with [[AngularJS]]'s bidirectional flow), the Flux architecture was developed as an alternative to the popular [[model–view–controller]] architecture. Flux features ''actions'' which are sent through a central ''dispatcher'' to a ''store'', and changes to the store are propagated back to the view.<ref name="
Flux can be considered a variant of the [[observer pattern]].<ref>{{cite web|last1=Johnson|first1=Nicholas|title=Introduction to Flux
A React component under the Flux architecture should not directly modify any props passed to it, but should be passed [[callback function]]s that create ''actions'' which are sent by the dispatcher to modify the store. The action is an object whose responsibility is to describe what has taken place: for example, an action describing one user "following" another might contain a user id, a target user id, and the type <code>USER_FOLLOWED_ANOTHER_USER</code>.<ref>{{cite web|last1=Abramov|first1=Dan|title=The History of React and Flux with Dan Abramov|url=http://threedevsandamaybe.com/the-history-of-react-and-flux-with-dan-abramov/|website=Three Devs and a Maybe|access-date=7 April 2018|archive-date=19 April 2018|archive-url=https://web.archive.org/web/20180419075905/http://threedevsandamaybe.com/the-history-of-react-and-flux-with-dan-abramov/|url-status=live}}</ref> The stores, which can be thought of as models, can alter themselves in response to actions received from the dispatcher.
This pattern is sometimes expressed as "properties flow down, actions flow up". Many implementations of Flux have been created since its inception, perhaps the most well-known being [[Redux (JavaScript library)|Redux]], which features a single store, often called a [[single source of truth]].<ref>{{cite web|title=State Management Tools
In February 2019, <code>useReducer</code> was introduced as a [[React (web framework)#React Hooks|React hook]] in the 16.8 release. It provides an API that is consistent with Redux, enabling developers to create Redux-like stores that are local to component states.<ref>{{Cite web |url=https://reactjs.org/blog/2019/02/06/react-v16.8.0.html#react-1 |title=React v16.8: The One with Hooks |access-date=2023-01-08 |archive-date=2023-01-08 |archive-url=https://web.archive.org/web/20230108090021/https://reactjs.org/blog/2019/02/06/react-v16.8.0.html#react-1 |url-status=live }}</ref>
== Future development ==
Project status can be tracked via the core team discussion forum.<ref>{{Cite web|title = Meeting Notes|url = https://discuss.reactjs.org/c/meeting-notes|website = React Discuss|access-date = 2015-12-13|archive-date = 2015-12-22|archive-url = https://web.archive.org/web/20151222141426/https://discuss.reactjs.org/c/meeting-notes|url-status = dead}}</ref> However, major changes to React go through the Future of React repository issues and [[pull request]]s.<ref>{{Cite web|title = reactjs/react-future
== History ==
React was created by Jordan Walke, a software engineer at [[Meta Platforms|Meta]], who initially developed a prototype called "F-Bolt"<ref name="
React was first deployed on Facebook's [[News Feed]] in 2011 and subsequently integrated into [[Instagram]] in 2012 {{Citation needed|date=February 2024}}. In May 2013, at JSConf US, the project was officially open-sourced, marking a significant turning point in its adoption and growth.{{ref|Hámori, Emergent. "React
[[React Native]], which enables native [[Android (operating system)|Android]], [[iOS]], and [[Universal Windows Platform|UWP]] development with React, was announced at Facebook's React Conf in February 2015 and open-sourced in March 2015.
On April 18, 2017, Facebook announced React Fiber, a new set of internal algorithms for rendering, as opposed to React's old rendering algorithm, Stack.{{sfn|Lardinois|2017}} React Fiber was to become the foundation of any future improvements and feature development of the React library.<ref>{{cite web|title = React Fiber Architecture|url = https://github.com/acdlite/react-fiber-architecture|website = Github|access-date = 19 April 2017|archive-date = 10 May 2018|archive-url = https://web.archive.org/web/20180510140634/https://github.com/acdlite/react-fiber-architecture|url-status = live}}</ref>{{Update inline|reason=Last commit was in 2016. Is this statement still true?|date=June 2018}} The actual syntax for programming with React does not change; only the way that the syntax is executed has changed.<ref name="
On September 26, 2017, React 16.0 was released to the public.<ref>{{cite web
Line 183 ⟶ 182:
On August 10, 2020, the React team announced the first release candidate for React v17.0, notable as the first major release without major changes to the React developer-facing API.<ref>url=https://reactjs.org/blog/2020/08/10/react-v17-rc.html {{Webarchive|url=https://web.archive.org/web/20200810215037/https://reactjs.org/blog/2020/08/10/react-v17-rc.html |date=2020-08-10 }}</ref>
On March 29, 2022, React 18 was released which introduced a new concurrent renderer, automatic batching and support for server side rendering with Suspense.<ref name="
{| class="wikitable mw-collapsible mw-collapsed"
Line 214 ⟶ 213:
|0.10.0
|21 March 2014
|Added support for srcSet and textAnchor attributes, add update function for immutable data, Ensure all void elements
|-
|0.11.0
Line 326 ⟶ 325:
|16.10.0
|27 September 2019
|Fix edge case where a hook update
|-
|16.10.1
Line 342 ⟶ 341:
|16.12.0
|14 November 2019
|React DOM
|-
|16.13.0
Line 362 ⟶ 361:
|17.0.1
|22 October 2020
|React DOM
|-
|17.0.2
|22 March 2021
|React DOM
|-
|18.0.0
|29 March 2022
|Concurrent React, Automatic batching, New Suspense Features, Transitions, Client and Server Rendering APIs, New Strict Mode Behaviors, New Hooks <ref name="
|-
|18.1.0
Line 393 ⟶ 392:
|}
== Licensing ==
The initial public release of React in May 2013 used the [[Apache License 2.0]]. In October 2014, React 0.12.00 replaced this with the [[BSD licenses#3-clause|3-clause BSD license]] and added a separate PATENTS text file that permits usage of any Facebook patents related to the software:<ref>{{cite web|title=React CHANGELOG.md|url=https://github.com/facebook/react/blob/master/CHANGELOG.md#0120-october-28-2014|website=GitHub|access-date=2015-12-09|archive-date=2020-04-28|archive-url=https://web.archive.org/web/20200428042800/https://github.com/facebook/react/blob/master/CHANGELOG.md#0120-october-28-2014|url-status=live}}</ref><blockquote>The license granted hereunder will terminate, automatically and without notice, for anyone that makes any claim (including by filing any lawsuit, assertion or other action) alleging (a) direct, indirect, or contributory infringement or inducement to infringe any patent: (i) by Facebook or any of its subsidiaries or affiliates, whether or not such claim is related to the Software, (ii) by any party if such claim arises in whole or in part from any software, product or service of Facebook or any of its subsidiaries or affiliates, whether or not such claim is related to the Software, or (iii) by any party relating to the Software; or (b) that any right in any patent claim of Facebook is invalid or unenforceable.</blockquote>This unconventional clause caused some controversy and debate in the React user community, because it could be interpreted to empower Facebook to revoke the license in many scenarios, for example, if Facebook sues the licensee prompting them to take "other action" by publishing the action on a blog or elsewhere. Many expressed concerns that Facebook could unfairly exploit the termination clause or that integrating React into a product might complicate a startup company's future acquisition.<ref>{{cite web|title=A compelling reason not to use ReactJS|first=Austin|last=Liu|url=https://medium.com/bits-and-pixels/a-compelling-reason-not-to-use-reactjs-beac24402f7b|website=Medium|access-date=2015-12-09|archive-date=2022-05-31|archive-url=https://web.archive.org/web/20220531133320/https://medium.com/bits-and-pixels/a-compelling-reason-not-to-use-reactjs-beac24402f7b|url-status=live}}</ref>
Line 406 ⟶ 405:
On September 26, 2017, React 16.0.0 was released with the MIT license.<ref>{{cite web |url=https://reactjs.org/blog/2017/09/26/react-v16.0.html#mit-licensed |title=React v16.0§MIT licensed |last=Clark |first=Andrew |date=September 26, 2017 |website=React Blog |access-date=October 18, 2017 |archive-date=October 3, 2017 |archive-url=https://web.archive.org/web/20171003031315/https://reactjs.org/blog/2017/09/26/react-v16.0.html#mit-licensed |url-status=live }}</ref> The MIT license change has also been backported to the 15.x release line with React 15.6.2.<ref>{{cite web |url=https://reactjs.org/blog/2017/09/25/react-v15.6.2.html |title=React v15.6.2 |last=Hunzaker |first=Nathan |date=September 25, 2017 |website=React Blog |access-date=October 18, 2017 |archive-date=May 31, 2022 |archive-url=https://web.archive.org/web/20220531133328/https://reactjs.org/blog/2017/09/25/react-v15.6.2.html |url-status=live }}</ref>
== See also ==
{{Portal|Free and open-source software}}
* [[Angular (web framework)]]
* [[Backbone.js]]
* [[Ember.js]]
* [[Gatsby (JavaScript framework)]]
* [[Next.js]]
* [[TypeScript]]
* [[Svelte]]
* [[Vue.js]]
* [[Comparison of JavaScript-based web frameworks]]
* [[Web Components]]
== References ==
{{Reflist|2}}
== Bibliography ==
{{Refbegin}}
* {{cite book |last=Larsen |first=John |title=React Hooks in Action With Suspense and Concurrent Mode |year=2021 |publisher=Manning |isbn=978-
* {{cite book |last1=Schwarzmüller |first1=Max |date=2018-05-01 |title=React
* {{cite book |last=Wieruch |first=Robin |title=The Road to React |publisher=Leanpub |isbn=978-
* {{cite news |last=Dere |first=Mohan |date=2017-12-21 |title=How to integrate create-react-app with all the libraries you need to make a great app |language=en-US |work=freeCodeCamp |url=https://medium.freecodecamp.org/integrating-create-react-app-redux-react-router-redux-observable-bootstrap-altogether-216db97e89a3 |access-date=2018-06-14 }}
* {{cite news |last=Panchal |first=Krunal |date=2022-04-26 |title=Angular vs React Detailed Comparison |language=en-US |work=SitePoint |url=https://www.sitepoint.com/angular-vs-react/ |access-date=2023-06-05 |archive-date=2023-03-30 |archive-url=https://web.archive.org/web/20230330160838/https://www.sitepoint.com/angular-vs-react/ |url-status=live }}
* {{cite news |last1=Hámori |first1=Fenerec |title=The History of React.js on a Timeline |url=https://blog.risingstack.com/the-history-of-react-js-on-a-timeline/ |access-date=2023-06-05 |work=RisingStack |date=2022-05-31 |archive-date=2022-05-31 |archive-url=https://web.archive.org/web/20220531133616/https://blog.risingstack.com/the-history-of-react-js-on-a-timeline/ |url-status=live }}
* {{cite news |last=Lardinois |first=Frederic |title=Facebook announces React Fiber, a rewrite of its React library |url=https://www.infoworld.com/article/2608181/javascript/react--making-faster--smoother-uis-for-data-driven-web-apps.html |access-date=2023-06-05 |website=[[InfoWorld]] |archive-date=2018-06-12 |archive-url=https://web.archive.org/web/20180612141516/https://www.infoworld.com/article/2608181/javascript/react--making-faster--smoother-uis-for-data-driven-web-apps.html |url-status=live }}
{{Refend}}
== External links ==
* {{Official website}}
* [https://github.com/facebook/react Github]
|