React (web framework): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Botcrux (discussione | contributi)
m Bot: codifica, sostituzione o rimozione di caratteri unicode per spazi tipografici particolari
m Eliminato il parametro "È software libero?" nel template "Software"
 
(36 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{Software
|Sviluppatore = [[FacebookMeta Platforms|Meta]] e community
|SistemaOperativo = multipiattaforma
|Genere = weblibreria frameworkjavascript
|SoftwareLibero = sì
|SitoWeb =
}}
'''React''' (noto anche come '''React.js''' o '''ReactJS''') è una libreria [[Open source|open-source]], [[Front-end e back-end|front-end]], [[JavaScript]]<ref name="react">{{Cita web|url=https://it.reactjs.org|titolo=React - Una libreria JavaScript per creare interfacce utente|accesso=22 marzo 2020}}</ref> per la creazione di [[Interfaccia utente|interfacce utente]]. È mantenuto da [[FacebookMeta Platforms|Meta]] (già Facebook) e da una comunità di singoli sviluppatori e aziende.<ref>{{Cita news|lingua=en|nome=Paul|cognome=Krill|url=https://www.infoworld.com/article/2608181/react--making-faster--smoother-uis-for-data-driven-web-apps.html|titolo=React: Making faster, smoother UIs for data-driven Web apps|pubblicazione=[[InfoWorld]]|data=15 maggio 2014|accesso=22 marzo 2020}}</ref><ref>{{Cita news|lingua=en|nome=Zef|cognome=Hemel|url=https://www.infoq.com/news/2013/06/facebook-react/|titolo=Facebook's React JavaScript User Interfaces Library Receives Mixed Reviews|pubblicazione=InfoQ|data=3 giugno 2013|accesso=22 marzo 2020}}</ref><ref>{{Cita news|lingua=en|nome=Chris|cognome=Dawson|url=https://thenewstack.io/javascripts-history-and-how-it-led-to-reactjs/|titolo=JavaScript’s History and How it Led To ReactJS|pubblicazione=The New Stack|data=25 luglio 2014|accesso=22 marzo 2020}}</ref>
 
React può essere utilizzato come base nello sviluppo di applicazioni a [[Single-page application|pagina singola]] oma è utilizzabile anche su mobile tramite [[React Native]], una libreria sempre sviluppata da Meta che tramuta i componenti React in componenti nativi ([[iOS]] e [[Android]])<ref>{{Cita web|url=https://mobidev.biz/blog/how-react-native-app-development-works|titolo=How React Native App Development Works Under the Hood|autore=Stanislav|sito=MobiDev|lingua=en|accesso=3 aprile 2021}}</ref>. Tuttavia, React si occupa solo del rendering dei dati sul [[Document Object Model|DOM]], pertanto la creazione di applicazioni React richiede generalmente l'uso di librerie aggiuntive per lo state management e il routing.<ref>{{Cita web|url=https://medium.com/codecademy-engineering/react-router-to-redux-first-router-2fea05c4c2b7|titolo=React Router to Redux First Router|cognome=Samp|nome=Jon|sito=[[Medium (sito web)|Medium]]|data=13 gennaio 2018|lingua=en|accesso=22 marzo 2020}}</ref> Redux<ref>{{Cita web|url=https://redux.js.org|titolo=Redux - A predictable state container for JavaScript apps.|lingua=en|accesso=22 marzo 2020}}</ref> e React Router<ref>{{Cita web|url=https://reacttraining.com/react-router/|titolo=React Router: Declarative Routing for React.js|lingua=en|accesso=22 marzo 2020}}</ref> sono i rispettivi esempi<ref name="React">{{cita news|titolo=10+ calcolatrici di reazione gratuite e utili|url=https://gscode.in/react-calculators/|accesso=23 ottobre 2022|}}</ref> di tali librerie. A questo fine è possibile utilizzare anche dei framework terzi, come ad esempio [[Next.js]].<ref>{{Cita web|url=https://react.dev/learn/start-a-new-react-project|titolo=Start a New React Project – React|sito=react.dev|lingua=en|accesso=2023-12-06}}</ref>
 
== Utilizzo di base ==
Di seguito è riportato un esempio rudimentale di utilizzo di React in HTML con [[ReactJS|JSX]] e JavaScript. <syntaxhighlight lang="htmlreact" line="1">
import React from 'react';
<div id="myReactApp"></div>
import ReactDOM from 'react-dom/client';
 
const Saluto = () => {
<script type="text/babel">
return (
function Greeter(props) {
<div className="hello-world">
return <h1>{props.greeting}</h1>
<h1>Ciao, mondo!</h1>
}
</div>
var App = <Greeter greeting="Hello World!" />;
);
ReactDOM.render(App, document.getElementById('myReactApp'));
};
</script>
 
const App = () => {
return <Saluto />;
};
 
const root = ReactDOM.rendercreateRoot(App, document.getElementById('myReactApproot'));
 
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
</syntaxhighlight>
in base al documento HTML di seguito.
La funzione <code>Greeter</code> è un componente React che accetta una proprietà <code>greeting</code>. La variabile <code>App</code> è un'istanza del componente <code>Greeter</code> cui la proprietà <code>greeting</code> è impostata a <code>'Hello World!'</code>. Il metodo <code>ReactDOM.render</code> esegue quindi il rendering del nostro componente Greeter all'interno dell'elemento [[Document Object Model|DOM]] con id <code>myReactApp</code>.
 
<syntaxhighlight lang="html" line="1">
Visualizzato in un browser Web, il risultato sarà:
<syntaxhighlight!DOCTYPE lang="html">
<divhtml idlang="myReactAppen">
<head>
<h1>Hello World!</h1>
<meta charset="utf-8" />
</div>
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
</body>
</html>
</syntaxhighlight>
 
La funzione Saluto è un componente React che mostra il famoso "Hello, world" introduttivo.
== Caratteristiche degne di nota ==
=== Componenti ===
Riga 47 ⟶ 66:
=== Componenti basati su classi ===
I componenti basati su classi vengono dichiarati utilizzando le classi [[ECMAScript|ES6]]. Sono anche noti come componenti "stateful", perché il loro stato può contenere valori in tutto il componente e può essere passato ai componenti figlio tramite props:
<syntaxhighlight lang="js" line="1">
class ParentComponent extends React.Component {
state = { color: 'green' };
Riga 65 ⟶ 84:
 
* <code>shouldComponentUpdate</code> consente allo sviluppatore di impedire il rendering non necessario di un componente restituendo false se non è richiesto un rendering.
* <code>componentDidMount</code> viene chiamato una volta che il componente è "montato" (il componente è stato creato nell'interfaccia utente, spesso associandolo a un nodo [[Document Object Model|DOM]] ). Questo è comunemente usato per attivare il caricamento dei dati da una fonte remota tramite un'[[Application programming interface|API]].
* <code>componentWillUnmount</code> viene chiamato immediatamente prima che il componente venga demolito o "smontato". Questo è comunemente usato per cancellare dipendenze che richiedono risorse al componente che non saranno semplicemente rimosse con lo smontaggio del componente (ad esempio, la rimozione di qualsiasi istanza <code>setInterval()</code> che è correlata al componente o un "eventListener" impostato sul "documento" a causa della presenza del componente).
* <code>render</code> è il metodo di ciclo di vita più importante e l'unico richiesto in qualsiasi componente. Di solito viene chiamato ogni volta che viene aggiornato lo stato del componente, che dovrebbe riflettersi nell'interfaccia utente.
Riga 95 ⟶ 114:
==== Espressioni JavaScript ====
Le [[Espressione (informatica)|espressioni]] JavaScript (ma non le istruzioni) possono essere utilizzate all'interno di JSX con parentesi graffe <code>{}</code>:
<syntaxhighlight lang="jsreact">
<h1>{10+1}</h1>
</syntaxhighlight> L'esempio sopra verrà così visualizzato: <syntaxhighlight lang="html">
<h1>11</h1>
</syntaxhighlight>
 
==== Dichiarazioni condizionali ====
Le istruzioni if-else non possono essere utilizzate all'interno di JSX ma è possibile utilizzare espressioni condizionali. L'esempio seguente mostrerà <code>{{Codice|codice={ i === 1 ? 'true' : 'false' }</code>|linguaggio=JavaScript}} come stringa <code>{{Codice|codice='true'</code>|linguaggio=JavaScript}} perché <code>i</code> è uguale a 1.
<syntaxhighlight lang="jsreact" line="1">
class App extends React.Component {
render() {
Riga 116 ⟶ 135:
</syntaxhighlight>
Quanto sopra renderà:
<syntaxhighlight lang="html" line="1">
<div>
<h1>true</h1>
Riga 139 ⟶ 158:
</syntaxhighlight>
Quanto sopra renderà:
<syntaxhighlight lang="html" line="1">
<div>
<div>Section 1</div>
Riga 146 ⟶ 165:
</div>
</syntaxhighlight>
Il codice scritto in JSX richiede la conversione con uno strumento come <nowiki><i>Babel</i></nowiki> prima di poter essere compreso dai browser web.<ref>{{Cita libro|autore=Fischer|nome=Ludovico|titolo=React for Real: Front-End Code, Untangled|url=https://books.google.it/books?id=Tg9QDwAAQBAJ|data=6 settembre 2017|editore=Pragmatic Bookshelf|lingua=en|ISBN=9781680504484}}</ref> Questa elaborazione viene generalmente effettuata nel corso didel unaprocesso di [[Build (informatica)|costruzione del software]] processo, prima che l'applicazione vienevenga [[Deployment|distribuita]].
 
=== Architettura oltre HTML ===
L'architettura di base di React si applica oltre al rendering HTML nel browser. Ad esempio, Facebook ha grafici dinamici che eseguono il rendering in tag <code><nowiki>{{Codice|codice=<canvas></nowiki></code>|linguaggio=HTML}}<ref>{{Cita web|url=https://reactjs.org/blog/2013/06/05/why-react.html|titolo=Why did we build React?|cognome=Hunt|nome=Pete|sito=React Blog|data=5 giugno 2013|lingua=en|accesso=23 marzo 2020}}</ref> e Netflix e [[PayPal]] utilizzano il caricamento universale per eseguire il rendering di HTML identico sia sul server che sul client.<ref name="paypal-isomorphic-reactjs">{{Cita web|url=https://medium.com/paypal-engineering/isomorphic-react-apps-with-react-engine-17dae662379c|titolo=Isomorphic React Apps with React-Engine|autore=[[PayPal|PayPal Engineering]]|sito=[[Medium (sito web)|Medium]]|data=27 aprile 2015|lingua=en|accesso=23 marzo 2020}}</ref><ref name="netflix-isomorphic-reactjs">{{Cita web|url=https://netflixtechblog.com/netflix-likes-react-509675426db|titolo=Netflix Likes React|autore=[[Netflix]] Technology Blog|sito=[[Medium (sito web)|Medium]]|data=28 gennaio 2015|lingua=en|accesso=23 marzo 2020}}</ref>
 
=== Hooks di React ===
Gli hooks, introdotti dalla versione 16.8 (Febbraio 2019), sono funzioni che consentono agli sviluppatori di "agganciarsi" allo stato di React e alle caratteristiche del ciclo di vita dei componenti delle funzioni.<ref>{{Cita web|url=https://it.reactjs.org/docs/hooks-overview.html|titolo=Panoramica sugli Hooks|accesso=23 marzo 2020}}</ref> Rendono i codici leggibili e facilmente comprensibili. Gli hooks non funzionano all'interno delle classi: permettono infatti di utilizzare React senza classi.<ref>{{Cita web|url=https://blog.soshace.com/what-the-heck-is-react-hooks/|titolo=What the Heck is React Hooks?|cognome=Megida|nome=Dillion|sito=Soshace|data=16 gennaio 2020|lingua=en|accesso=23 marzo 2020}}</ref>
 
React fornisce alcuni hook incorporati come <code>useState</code>,<ref>{{Cita web|url=https://it.reactjs.org/docs/hooks-state.html|titolo=Usare l'Hook State|accesso=23 marzo 2020}}</ref> <code>useContext</code>, <code>useReducer</code> e <code>useEffect</code><ref>{{Cita web|url=https://it.reactjs.org/docs/hooks-effect.html|titolo=Usare l'Hook Effect|lingua=en|accesso=23 marzo 2020}}</ref> per citarne alcuni. Sono tutti indicati nella guida alle API di riferimento degli Hooks.<ref>{{Cita web|url=https://it.reactjs.org/docs/hooks-reference.html|titolo=API di Riferimento degli Hooks|lingua=en|accesso=23 marzo 2020}}</ref> <code>useState</code> e <code>useEffect</code>, che sono i più utilizzati, sono utili al controllo rispettivamente degli stati e degli effetti collaterali nei componenti React.
 
Esempio di utilizzo di <code>useState</code> in un componente funzionale.<syntaxhighlight lang="react" line="1">
const BirthdayComponent = () => {
const [myAge, setMyAge] = useState(16);
const handleClick = () => setMyAge(myAge + 1);
 
return (
<>
<p>My actual age is {myAge}.</p>
{myAge >= 18 && <p>... and now i'm adult</p>}
<button onClick={handleClick}>Add one year</button>
</>
);
};
</syntaxhighlight>
 
==== Regole degli Hooks ====
Riga 169 ⟶ 203:
 
=== Uso dell'architettura Flux ===
Per supportare il concetto di flusso di dati unidirezionale di React (che va in contrasto con il flusso bidirezionale di [[AngularJS]]), l'architettura Flux rappresenta un'alternativa alla popolare architettura [[Model-view-controller|modello-view-controller]]. Flux include le ''azioni'' che vengono inviate tramite un ''dispatcher'' centrale a uno ''store'' e le modifiche a quest'ultimo vengono propagate alla vista.<ref name="flux">{{Cita web|url=https://facebook.github.io/flux/docs/in-depth-overview|titolo=In-Depth Overview|sito=facebook.github.io/flux|lingua=en|accesso=23 marzo 2020|dataarchivio=7 agosto 2022|urlarchivio=https://web.archive.org/web/20220807201252/https://facebook.github.io/flux/docs/in-depth-overview/|urlmorto=sì}}</ref> Se utilizzata con React, questa propagazione viene eseguita attraverso le proprietà del componente.
 
Flux può essere considerato una variante dell'[[Observer pattern]].<ref>{{Cita web|url=http://nicholasjohnson.com/react/course/exercises/flux/|titolo=Introduction to Flux - React Exercise|lingua=en|accesso=23 marzo 2020}}</ref>
Riga 192 ⟶ 226:
{| class="wikitable"
|+Versioni
!Versione
!Version
!Data di pubblicazione
!Release Date
!Cambiamenti
!Changes
|-
|0.3.0
Riga 202 ⟶ 236:
|0.4.0
|20 luglio 2013
|Supporto ai nodi di commento <nowiki>{{Codice|codice=<div>{/* */}</div></nowiki>|linguaggio=React}}, API di rendering lato server migliorate, rimosso React.autoBind, supporto per il prop key, miglioramenti ai moduli, bug corretti.
|-
|0.5.0
Riga 210 ⟶ 244:
|0.8.0
|20 dicembre 2013
|Aggiunto supporto a righe e colonne, defer e async, loop per {{Codice|codice=<audio>|linguaggio=HTML}} e {{Codice|codice=<video>|linguaggio=HTML}}, attributi di autoCorrect. Aggiunti eventi onContextMenu, aggiornati jstransform, esprima-fb e browserify.
|-
|0.9.0
Riga 238 ⟶ 272:
|15.0.0
|7 aprile 2016
|Il rendering iniziale ora utilizza document.createElement invece di generare HTML, Niente più <nowiki>{{Codice|codice=<span>|linguaggio=HTML}} extra, supporto SVG migliorato, ReactPerf.getLastMeasurements () è opaco, nuove deprecazioni introdotte con un avviso, risolte diversi piccoli leak di memoria, React DOM ora supporta gli attributi HTML cite e profile e le proprietà CSS cssFloat, gridRow e gridColumn.</nowiki>
|-
|15.1.0
Riga 246 ⟶ 280:
|15.2.0
|1[[1º maggio|º]] luglio 2016
|Inclusione informazioni sullo stack dei componenti, rimossa la convalida dei props al momento del montaggio, aggiunti React.PropTypes.symbol, gestione onLoad a <nowiki><link></nowiki>, gestione onError all'elemento {{Codice|codice=<nowiki><source></nowiki>|linguaggio=HTML}}, API isRunning(), corretta regressione sulle prestazioni.</nowiki>
|-
|15.3.0
Riga 352 ⟶ 386:
|26 febbraio 2020
|Funzionalità aggiunte in modalità React Concurrent. Corrette regressioni nella libreria principale di React e React Dom.
|-
|16.14.0
|14 ottobre 2020
|Aggiunto nuovo supporto per le trasformazioni JSX
|-
|17.0.0
|20 ottobre 2020
|Rimozione del pool di eventi, aggiornamenti all'algoritmo di riconciliazione dell'albero, migliore gestione degli errori e aumentato supporto per i portali.
|-
|17.0.1
|22 ottobre 2020
|Fixato crash su IE11
|-
|17.0.22
|22 marzo 2021
|Rimossa una dipendenza inutilizzata su SharedArrayBuffer (cross-origin-isolation warning)
|-
|18.0.0
|29 marzo 2022
|Introdotti 5 nuovi hook useId, useInsertionAffect, useTransition, useDeferredValue e useSyncExternalStore.
Nuove API quali createRoot che sostituisce ReactDOM.render, hydrateRoot che sostituisce ReactDOM.hydrate
Batch automatico (evita re-render indesiderati unendo tutti i setState)
|-
|18.1.0
|26 aprile 2022
|Risolti vari problemi su react-dom/client, componentWillUnmount e alcuni messaggi di warning
|}
 
Riga 374 ⟶ 434:
* [[Angular]]
* [[Vue.js]]
 
== Altri progetti ==
{{interprogetto}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
 
{{Framework per applicazioni web}}