<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matteo Spreafico</title>
    <description>The latest articles on DEV Community by Matteo Spreafico (@matsprea).</description>
    <link>https://dev.to/matsprea</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F305183%2F846e65d8-f8af-44e0-a305-834526514cc6.png</url>
      <title>DEV Community: Matteo Spreafico</title>
      <link>https://dev.to/matsprea</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matsprea"/>
    <language>en</language>
    <item>
      <title>Realizzare UI con Reat - 7. Composizione di Componenti</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Sun, 20 Sep 2020 07:57:00 +0000</pubDate>
      <link>https://dev.to/matsprea/realizzare-ui-con-reat-7-composizione-di-componenti-4ga7</link>
      <guid>https://dev.to/matsprea/realizzare-ui-con-reat-7-composizione-di-componenti-4ga7</guid>
      <description>&lt;p&gt;I componenti sono molto comodi, perché ci aiutano a suddividere la UI in pezzi più piccoli con chiare responsabilità ed interfacce ben definite. Questo è molto importante quando si lavora su un'applicazione di grandi dimensioni, perché ci permette di lavorare su piccoli pezzi dell'applicazione senza modificare inavvertitamente tutto il resto. Un altro grande vantaggio dei componenti è che ci incoraggiano ad usare la composizione invece dell'ereditarietà. Vediamo meglio cosa intendo per composizione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composizione con la Lista di Contatti
&lt;/h2&gt;

&lt;p&gt;Ora prendiamo una nuova applicazione React creata con &lt;code&gt;create-react-app&lt;/code&gt; come abbiamo &lt;a href="https://matteo-spreafico-ghost.herokuapp.com/realizzare-ui-con-react-6-creare-una-nuova-react-app/"&gt;appena visto&lt;/a&gt; ed inseriamoci l'esempio con la lista di contatti di cui abbiamo &lt;a href="https://matteo-spreafico-ghost.herokuapp.com/realizzare-ui-con-react-5-creare-elementi-e-jsx/#componenti"&gt;parlato in precedenza&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import './App.css';

const Contatti = () =&amp;gt; {
  const persone = ['Matteo', 'Silvia', 'Daniele', 'Marco'];

  return (
    &amp;lt;ul&amp;gt;
      {persone.map((persona) =&amp;gt; (
        &amp;lt;li key={persona}&amp;gt;{persona}&amp;lt;/li&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  );
};

function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Contatti /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
App.js modificato con la lista di contatti





&lt;p&gt;Come potete vedere è veramente semplice prendere il componente &lt;code&gt;Contatti&lt;/code&gt; che abbiamo creato in precedenza ed usarlo all'interno di &lt;code&gt;App&lt;/code&gt;. Incapsulare elementi all'interno di un componente ci offre diversi vantaggi. Per iniziare rende estremamente semplice il riuso di tutti questi elementi. Se ad esempio io volessi avere più copie della lista dei contatti, dovrei incollare più volte il componente &lt;code&gt;Contatti&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Contatti /&amp;gt;
      &amp;lt;Contatti /&amp;gt;
      &amp;lt;Contatti /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Copie multiple di &lt;code&gt;Contatti&lt;/code&gt;





&lt;h2&gt;
  
  
  Semplice Interfaccia dei Componenti
&lt;/h2&gt;

&lt;p&gt;Un'altra caratteristica interessate è che i componenti ci offrono un'interfaccia chiara in modo da poter semplicemente configurare differenti componenti passandogli delle differenti proprietà.&lt;/p&gt;

&lt;p&gt;Prendiamo la nostra lista di contatti e supponiamo di voler avere delle liste di contatti con delle persone diverse. In questo caso quindi vorrei poter configurare i componenti &lt;code&gt;Contatti&lt;/code&gt; in modo indipendente uno dall'altro. Sarebbe comodo se &lt;code&gt;Contatti&lt;/code&gt; avesse una proprietà in modo da passargli la lista di persone invece di averla inchiodata all'interno del componente.&lt;/p&gt;

&lt;p&gt;Prendiamo quindi il nostro componente &lt;code&gt;Contatti&lt;/code&gt; ed aggiungiamogli un parametro &lt;code&gt;props&lt;/code&gt; che conterrà tutte le proprietà che passeremo al componente e prendiamo la lista di &lt;code&gt;persone&lt;/code&gt; da questo oggetto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Contatti = (props) =&amp;gt; {
  const { persone } = props;

  return (
    &amp;lt;ul&amp;gt;
      {persone.map((persona) =&amp;gt; (
        &amp;lt;li key={persona}&amp;gt;{persona}&amp;lt;/li&amp;gt;
      ))}
    &amp;lt;/ul&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Componente &lt;code&gt;Contatti&lt;/code&gt; modificato per usare &lt;code&gt;persone&lt;/code&gt; estratto da &lt;code&gt;props&lt;/code&gt;





&lt;p&gt;Ogni componente riceve un oggetto &lt;code&gt;props&lt;/code&gt; che contiene tutte le proprietà che passeremo al componente.&lt;/p&gt;

&lt;p&gt;Quindi ora possiamo passare una diversa lista di persone ed averemo una diversa lista di contatti! Modifichiamo ora la nostra applicazione per avere nella prima lista di contatti solo Matteo e Silvia, mentre nella seconda passiamo Daniele e Marco ed infine eliminiamo la terza.&lt;/p&gt;

&lt;p&gt;Come vedete è estremamente semplice riusare questi componenti passandogli la configurazione attraverso &lt;code&gt;props&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Questi sono i due aspetti chiave per comprendere come funziona la composizione di componenti in React:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La capacità di incapsulare elementi in una componente in modo da poterli riutilizzare&lt;/li&gt;
&lt;li&gt;La capacità di configurare questi componenti in modo differente ed indipendente attraverso &lt;code&gt;props&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/matsprea/create-react-app-contatti/tree/11ab8f37e444a676aaef7c10337b9e41b74ca21e"&gt;Qui potete trovare i sorgenti dell'applicazione&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Realizzare UI con React - 6. Creare una Nuova React App</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Wed, 16 Sep 2020 07:48:00 +0000</pubDate>
      <link>https://dev.to/matsprea/realizzare-ui-con-react-6-creare-una-nuova-react-app-21pg</link>
      <guid>https://dev.to/matsprea/realizzare-ui-con-react-6-creare-una-nuova-react-app-21pg</guid>
      <description>&lt;p&gt;JSX è bellissimo, ma deve essere convertito in normale JavaScript prima di arrivare al browser e si può usare &lt;a href="https://github.com/babel/babel"&gt;Babel&lt;/a&gt; per questa operazione. Possiamo chiamare Babel dal tool, come &lt;a href="https://github.com/webpack/webpack"&gt;Webpack&lt;/a&gt;, che usiamo per impacchettare tutti i nostri file (JavaScript, CSS, immagini, etc.) per i progetti web.&lt;/p&gt;

&lt;p&gt;Per semplificare la configurazione iniziale possiamo usare il pacchetto Create React App di Facebook che gestisce tutto questo per noi! È uno strumento molto comodo per iniziare a creare una applicazione React dato che configura tutto quello che serve senza chiedere nulla! Per installare Create React App si può usare npm da linea di comando come indicato di seguito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g create-react-app

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Installare globalmente Create React App





&lt;p&gt;Se avete problemi ad installare il pacchetto globalmente, potete consultare la &lt;a href="https://docs.npmjs.com/"&gt;documentazione di npm&lt;/a&gt;, vi consiglio di verificare di avere i permessi corretti. Per sapere dove i pacchetti globali sono installati potete usare il seguente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm list -g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Verificare dove sono installati i pacchetti globali





&lt;p&gt;Ora creiamo la nostra prima applicazione React chiamata &lt;code&gt;contatti&lt;/code&gt; per usare il codice JSX che abbiamo creato in precedenza&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create-react-app contatti
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Creiamo l'applicazione React &lt;code&gt;contatti&lt;/code&gt;





&lt;p&gt;Come potete vedere eseguendo il comando, &lt;code&gt;create-react-app&lt;/code&gt; installerà &lt;code&gt;react&lt;/code&gt; e &lt;code&gt;react-dom&lt;/code&gt; che abbiamo già visto ed anche il pacchetto &lt;code&gt;react-scripts&lt;/code&gt;. Questo pacchetto contiene molte librerie utili. Installa Babel in modo da poter usare le ultime funzionalità di JavaScript oltre che JSX. Inoltre installa anche Webpack in modo da poter impacchettare le risorse per rilasciare la nostra applicazione ed il server di sviluppo Webpack che ci aiuta durante lo sviluppo e fornisce la funzionalità di aggiornamento automatico quando modifichiamo i sorgenti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/matsprea/create-react-app-contatti/commit/4d46fa336695506bbaf9d3efd44b38693b8984f8"&gt;Qui potete trovare i sorgenti dell'applicazione React appena creata&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yarn
&lt;/h3&gt;

&lt;p&gt;Guardando il risultato di &lt;code&gt;create-react-app&lt;/code&gt; vedrete che ci viene consigliato di usare &lt;code&gt;yarn&lt;/code&gt; per gestire la nostra applicazione. Nel caso non lo conosciate, &lt;code&gt;yarn&lt;/code&gt; è un gestore di pacchetti simile a &lt;code&gt;npm&lt;/code&gt;, è stato creato da Facebook per migliorarne alcune funzionalità ed aggiungerne di nuove. Se non volete installare &lt;code&gt;yarn&lt;/code&gt;, non è un problema, uno dei suoi punti di forza è che quasi tutti i suoi comandi possono essere eseguiti anche da &lt;code&gt;npm&lt;/code&gt;. Quindi se il comando consigliato per eseguire il server di sviluppo è &lt;code&gt;yarn start&lt;/code&gt;, possiamo usare &lt;code&gt;npm start&lt;/code&gt; per ottenere lo stesso risultato!&lt;/p&gt;

&lt;h3&gt;
  
  
  Esploriamo l'applicazione React
&lt;/h3&gt;

&lt;p&gt;Alla fine dell'esecuzione di &lt;code&gt;create-react-app&lt;/code&gt; otteniamo una lista di comandi che ci permettono di eseguire la nostra applicazione, testarla e rilasciarla. Se diamo un'occhiata al codice creato, troveremo molti commenti nei vari files per spiegarci come funzionano e sono stati usati, provate a darci un'occhiata.&lt;/p&gt;

&lt;p&gt;Ora spostiamoci nella cartella che contiene l'applicazione e facciamo partire il server di sviluppo col comando &lt;code&gt;yarn start&lt;/code&gt;. Noterete che in automatico viene aperta una nuova finestra del browser con la nostra applicazione al suo interno. Decisamente comodo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--reV7r5OI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-2.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--reV7r5OI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-2.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/image.png" alt="Applicazione React create con create-react-app"&gt;&lt;/a&gt;Applicazione React create con &lt;code&gt;create-react-app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Provvediamo quindi ad aprire il file &lt;code&gt;src/App.js&lt;/code&gt; nel nostro editor e vedremo il codice che è in esecuzione nel browser. Il codice che vedrete dovrebbe esservi abbastanza familiare a questo punto. Si tratta di un componente che disegna un &lt;code&gt;div&lt;/code&gt; che a sua volta contiene un &lt;code&gt;header&lt;/code&gt; con un immagine &lt;code&gt;img&lt;/code&gt;, un paragrafo &lt;code&gt;p&lt;/code&gt; ed un link &lt;code&gt;a&lt;/code&gt;. Ricordatevi che nessuno di questi sono testo, ma ciascuno di questi elementi è creato tramite la chiamata alla funzione &lt;code&gt;createElement()&lt;/code&gt; ed usiamo JSX per rendere la sintassi più concisa.&lt;/p&gt;

&lt;p&gt;Una delle comodità di &lt;code&gt;create-react-app&lt;/code&gt; è che configura automaticamente il reload dell'applicazione quando eseguiamo delle modifiche al sorgente. Quindi se ora modificate il &lt;a href="https://github.com/matsprea/create-react-app-contatti/blob/4d46fa336695506bbaf9d3efd44b38693b8984f8/src/App.js#L11"&gt;testo del paragrafo&lt;/a&gt; in "Ciao Mondo!" e salvate la modifica, il browser si aggiornerà automaticamente mostrando i cambiamenti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--reV7r5OI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-2.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--reV7r5OI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-2.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/image.png" alt="Ciao Mondo!"&gt;&lt;/a&gt;Aggiornamento automatico&lt;/p&gt;

&lt;p&gt;Una cosa che non è presente nel file &lt;code&gt;src/App.js&lt;/code&gt; è il riferimento a &lt;code&gt;ReactDOM&lt;/code&gt; od a come questo elemento è inserito nel DOM della pagina. Se esploriamo la cartella che contiene questo file ne troviamo un altro interessate &lt;code&gt;src/index.js&lt;/code&gt;, proviamo a darci un'occhiata. &lt;code&gt;index.js&lt;/code&gt; importa &lt;code&gt;App&lt;/code&gt; dal file &lt;code&gt;./App&lt;/code&gt; e disegna l'applicazione nell'elemento &lt;code&gt;root&lt;/code&gt; che è già presente nel documento. Ora vi starete chiedendo allo stesso modo da dove viene l'elemento &lt;code&gt;root&lt;/code&gt;. Per rispondere a questa domanda, date un'occhiata al file &lt;code&gt;public/index.html&lt;/code&gt;. Qui potete vedere il codice HTML dove viene eseguito il JavaScript e troverete il &lt;a href="https://github.com/matsprea/create-react-app-contatti/blob/4d46fa336695506bbaf9d3efd44b38693b8984f8/public/index.html#L31"&gt;&lt;code&gt;div&lt;/code&gt; con id &lt;code&gt;root&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quando eseguiamo la build, Webpack genererà un pacchetto con tutto il nostro JavaScript ed inserirà uno script tag nella pagine proprio dopo questo div, in questo modo l'applicazione prende vita.&lt;/p&gt;

&lt;p&gt;Per avere più informazione su come funziona &lt;code&gt;create-react-app&lt;/code&gt;, vi consiglio di leggere il file &lt;code&gt;README.md&lt;/code&gt; che contiene delle istruzioni e delle guide dettagliate su come usarlo al meglio e modificarlo a seconda delle proprie esigenze.&lt;/p&gt;

&lt;p&gt;La documentazione completa di &lt;code&gt;create-react-app&lt;/code&gt; è disponibile sul sito &lt;a href="https://create-react-app.dev/"&gt;https://create-react-app.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Realizzare UI con React - 5. Creare Elementi e JSX</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Sat, 05 Sep 2020 08:09:00 +0000</pubDate>
      <link>https://dev.to/matsprea/realizzare-ui-con-react-5-creare-elementi-e-jsx-2ome</link>
      <guid>https://dev.to/matsprea/realizzare-ui-con-react-5-creare-elementi-e-jsx-2ome</guid>
      <description>&lt;p&gt;In React usiamo degli oggetti JavaScript chiamati Elementi per descrivere come vogliamo che sia la pagina e poi React si occupa di applicare le modifiche al DOM per ottenere il risultato.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disegnare Elementi React nel DOM
&lt;/h2&gt;

&lt;p&gt;Invece di usare template per descrivere l'interfaccia utente, React usa gli elementi. Vediamo cos'è un elemento in React con il seguente esempio dove a sinistra potete vedere il codice ed a destra il risultato nel browser.&lt;/p&gt;

&lt;p&gt;Esempio di elemento in React&lt;/p&gt;

&lt;p&gt;Nell'editor ho creato un nuovo elemento in React usando &lt;code&gt;React.CreateElement&lt;/code&gt;. Questa è un API di primo livello di React per creare elementi, assomiglia al metodo per creare elementi dell'oggetto &lt;code&gt;document&lt;/code&gt; ma è leggermento diverso. Il primo argomento è il nome del tag dell'elemento che vogliamo usare, nel nostro caso &lt;code&gt;"div"&lt;/code&gt;. Il secondo argomento lo vedremo in seguito ed il terzo è il testo che vogliamo inserire all'interno del div.&lt;/p&gt;

&lt;p&gt;Ma come inseriamo questo elemento nella pagina? Per fare questo dobbiamo usare &lt;code&gt;ReactDOM&lt;/code&gt;. In React, il processo per decidere cosa disegnare è completamente separato da quello che effettivamente si occupa di disegnarlo. Questa separazione rende possibile generare le pagine sul server oppure nativamente sui dispositivi mobile ed anche nella realtà virtuale. In questo esempio usiamo &lt;code&gt;ReactDOM&lt;/code&gt; perché siamo lavorando nel browser. Nel esempio, uso il metodo &lt;code&gt;ReactDOM.render&lt;/code&gt; posso disegnare il mio elemento nella pagina, nell'elemento del DOM chiamato &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Per vedere cosa è effettivamente l'elemento React che ho creato, potete usare &lt;code&gt;console.log(elemento)&lt;/code&gt;. Come potete notare, si tratta semplicemente do un oggetto JavaScript, con una serie di diverse proprietà.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    type: "div",
    key: null,
    ref: nul,
    props: Object,
    children: "Ciao Mondo!",
    _owner: null,
    _store: Object
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Risultato di &lt;code&gt;console.log(elemento)&lt;/code&gt;





&lt;p&gt;Quando abbiamo deciso di inserire nella pagina il nostro elemento React, abbiamo usato l'elemento del DOM chiamato &lt;code&gt;root&lt;/code&gt;, ma da dove arriva questo elemento?&lt;br&gt;&lt;br&gt;
Solitamente le applicazioni React hanno un elemento DOM nella pagina chiamato &lt;code&gt;root&lt;/code&gt;, un HTML di esempio è il seguente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="root"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di HTML che ospita un'applicazione React





&lt;p&gt;Passando a &lt;code&gt;ReactDOM&lt;/code&gt; questo elemento del DOM usando il metodo &lt;code&gt;getElementById()&lt;/code&gt;, React è in grado di prendere il controllo del suo contenuto.&lt;/p&gt;

&lt;p&gt;Ora vediamo come aggiungere una classe CSS al nostro elemento. Usiamo il secondo argomento di &lt;code&gt;React.createElement&lt;/code&gt; che prima abbiamo saltato, come potete vedere nel seguente esempio&lt;/p&gt;

&lt;p&gt;Esempio di elemento in React con classe CSS&lt;/p&gt;

&lt;p&gt;Come potete vedere, non ho usato la parola &lt;code&gt;class&lt;/code&gt; per descrivere la classe CSS, ma invece la proprietà si chiama &lt;code&gt;className&lt;/code&gt;. Questo potrebbe generare della confusione, ma dobbiamo tenere a mente che stiamo descrivendo nodi del DOM e non HTML. Se ora esploriamo il codice HTML generato, vedremo che questo contiene un div con un attributo &lt;code&gt;class&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="messaggio-di-benvenuto"&amp;gt;Ciao Mondo!&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
HTML generato dal elemento React con classe CSS





&lt;p&gt;Probabilmente avrete già sentito il termine &lt;em&gt;DOM Virtuale&lt;/em&gt; ( &lt;em&gt;Virtual DOM&lt;/em&gt; ) mentre stavate cercando informazioni su React. Quello che questo termine significa è che questi elementi React che stiamo creando, non sono veri elementi del DOM, sono invece oggetti che descrivono elementi del DOM. Quando quindi chiamiamo &lt;code&gt;React.createElement&lt;/code&gt; non abbiamo ancora creato niente nel DOM. Solo quando chiamiamo &lt;code&gt;ReactDom.render&lt;/code&gt; il browser create gli elementi DOM necessari.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;React.createElement()&lt;/code&gt; restituisce un Elemento React
&lt;/h2&gt;

&lt;p&gt;Abbiamo usato il metodo &lt;code&gt;React.createElement()&lt;/code&gt; per creare e restituire un nuovo elemento React, vediamo qual è la sua dichiarazione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React.createElement(
  type,
  [props],
  [...children]
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Dichiarazione di &lt;code&gt;React.createElement()&lt;/code&gt;





&lt;p&gt;Accetta tre argomenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type&lt;/code&gt;: può essere il nome di un tag (ad esempio 'div' o 'span') o un componente React,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;props&lt;/code&gt;: può essere null oppure un oggetto con degli attributi HTML o dati per l'elemento,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;...children&lt;/code&gt;: qualunque cosa venga passata qui, sarà usata come contenuto dell'elemento. Possiamo usare stringhe, JavaScript od anche altri elementi React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vediamo quindi come annidare un elemento React dentro l'altro in questo esempio:&lt;/p&gt;

&lt;p&gt;Esempio di elementi React annidati&lt;/p&gt;

&lt;p&gt;Abbiamo cambiamo il tag da 'div' ad 'ul' per creare una lista e sostituito la stringa "Ciao Mondo!" con un array che contiene degli elementi React creati con &lt;code&gt;React.createElement()&lt;/code&gt; che usano il tag 'li' per gli elementi della lista.&lt;/p&gt;

&lt;p&gt;Se notate, c'è un avviso nella Console, React si sta lamentando che gli elementi nell'array non hanno una proprietà &lt;code&gt;key&lt;/code&gt; univoca. Cosa vuol dire?&lt;br&gt;&lt;br&gt;
Come quando abbiamo aggiunto la classe CSS all'elemento, possiamo aggiungere ad ogni elemento React nel secondo argomento di &lt;code&gt;React.createElement()&lt;/code&gt;. Qualcosa di unico per ognuno di questi elementi, in questo caso potremmo usare il nome.&lt;/p&gt;

&lt;p&gt;Stiamo anche duplicando il codice al momento, per ogni elemento annidato usiamo la stessa chiamata a &lt;code&gt;React.createElement()&lt;/code&gt; con una persona diversa. Potremmo usare JavaScript per generare questi elementi usando il metodo &lt;code&gt;.map()&lt;/code&gt; su una array che contiene le persone. Non ci serve un sistema di template o una sintassi speciale, possiamo usare direttamente JavaScript senza dover imparare nulla di nuovo. Vediamo il risultato:&lt;/p&gt;

&lt;p&gt;Esempio di elementi React annidati con &lt;code&gt;Array.map()&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Anche JSX restituisce un Elemento
&lt;/h2&gt;

&lt;p&gt;Abbiamo visto come creare elementi e come annidarli, ma se dovessimo usare queste chiamate per creare un'applicazione non banale, sarebbe alquanto problematico. Servirebbe una sintassi diversa, pensata per descrivere relazione tra elementi in modo più naturale... come ad esempio HTML! Fa esattamente questo!&lt;/p&gt;

&lt;p&gt;Come possiamo far sembrare il nostro metodo &lt;code&gt;React.createElement()&lt;/code&gt; più simile ad HTML? JSX è un'estensione di JavaScript che fa esattamente questo. Ci permette di scrivere del codice JavaScript che sembra HTML  lo rende più stringato e facile da leggere.&lt;/p&gt;

&lt;p&gt;Modifichiamo il nostro esempio per usare JSX&lt;/p&gt;

&lt;p&gt;Esempio di elementi React con JSX&lt;/p&gt;

&lt;p&gt;Al posto del primo &lt;code&gt;React.createElement()&lt;/code&gt; abbiamo usato &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; ed al suo interno abbiamo usato le parentesi graffe per indicare che un blocco di JavaScript puro, senza JSX, dove abbiamo la chiamata a &lt;code&gt;.map()&lt;/code&gt;. Per ogni persona poi usiamo ancora JSX con un &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; per gli elementi della lista e di nuovo usiamo le parentesi graffe per indicare dei valori JavaScript, sia per la proprietà &lt;code&gt;key&lt;/code&gt; che prima passavamo come secondo parametro che per il contenuto dell'elemento stesso.&lt;/p&gt;

&lt;p&gt;Molte persone restano disorientate la prima volta che vedono questa sintassi, ma non dovete preoccuparvi, è una reazione molto comune, notate piuttosto come il codice è molto più snello.&lt;/p&gt;

&lt;p&gt;Quando scriviamo JSX dobbiamo però ricordarci che deve restituire un singolo elemento. Possiamo avere un qualunque numero di elementi annidati, ma alla radice deve esserci un singolo elemento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const message = (
 &amp;lt;div&amp;gt;
 &amp;lt;h1&amp;gt;JSX in sintesi:&amp;lt;/h1&amp;gt;
 &amp;lt;ul&amp;gt;
 &amp;lt;li&amp;gt;JSX&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;è&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;stupendo!&amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;/div&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di JSX





&lt;p&gt;L'esempio di JSX precedente è valido perché c'è singolo nodo &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; che contiene tutti gli altri, mentre il seguente esempio NON è valido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const message = (
 &amp;lt;h1&amp;gt;JSX in sintesi:&amp;lt;/h1&amp;gt;
 &amp;lt;ul&amp;gt;
 &amp;lt;li&amp;gt;JSX&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;è&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;stupendo!&amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di JSX NON valido





&lt;p&gt;In questo esempio potete notare che sia l'elemento &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; che l'elemento &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; sono al livello radice. Questo codice non funzionerà e avrete un messaggio di questo tipo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Syntax error: Adjacent JSX elements must be wrapped in an enclosing tag&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dato che sappia che JSX non è che un'estensione di &lt;code&gt;React.createElement()&lt;/code&gt; questo errore ha senso, perché questo metodo accetta come primo parametro un singolo nome per il tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componenti
&lt;/h2&gt;

&lt;p&gt;Per ora abbiamo visto come usare &lt;code&gt;React.createElement()&lt;/code&gt; e JSX per creare HTML, ma in React solitamente si usano i Componenti per costruire l'interfaccia utente. I Componenti sono dei blocchi di codice riutilizzabili che sono responsabili di restituire del HTML usato per disegnare la pagina. Molto spesso i Componenti React sono scritti usando JSX.&lt;/p&gt;

&lt;p&gt;Dato che l'obiettivo principale di React è realizzare l'interfaccia utente, c'è solo un metodo che è assolutamente necessario in ogni Classe Componente React: &lt;code&gt;render()&lt;/code&gt;. Si possono usare anche i Componenti Funzioni in React, in modo del tutto equivalente alle Classi Componente; in questo caso la funzione deve ovviamente restituire l'HTML da usare per disegnare la pagina.&lt;/p&gt;

&lt;p&gt;Disegnare Elementi React nel DOM con Classe Componente&lt;/p&gt;

&lt;p&gt;Disegnare Elementi React nel DOM con Componente Funzione&lt;/p&gt;

&lt;p&gt;Ricordiamoci che React si occupa solo della livello di presentazione della nostra applicazione, quello che l'utente vede e con cui interagisce. I Componenti rappresentano la modularità e riusabilità di React e dovrebbero seguire il &lt;a href="https://it.wikipedia.org/wiki/Principio_di_singola_responsabilit%C3%A0"&gt;principio di singola responsabilità&lt;/a&gt; e fare solo una cosa.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Perché React? - 4. React è "solo JavaScript"</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Wed, 02 Sep 2020 08:00:00 +0000</pubDate>
      <link>https://dev.to/matsprea/perche-react-4-react-e-solo-javascript-28k2</link>
      <guid>https://dev.to/matsprea/perche-react-4-react-e-solo-javascript-28k2</guid>
      <description>&lt;p&gt;Se già conoscete JavaScript sarà molto facile imparare React, se al contrario siete alle prime armi con JavaScript, React vi aiuterà a diventare degli sviluppatori JavaScript migliori.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ѐ solo JavaScript
&lt;/h2&gt;

&lt;p&gt;Uno degli aspetti positivi di React è che gran parte di quello che userete, sarà normale JavaScript. Prendiamo ad esempio To make sure you're ready to move forward, please take a look at the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const appuntamentiPersonali = [
  { appuntamento: 'Tintoria', ore: '19:00', giorno: 'martedi' },
  { appuntamento: 'Palestra', ore: '19:00', giorno: 'lunedi' },
];
const appuntamentiLavoro = [
  { appuntamento: 'Banca', ore: '11:00', giorno: 'lunedi' },
  { appuntamento: 'Cliente XYZ', ore: '9:00', giorno: 'martedi' },
];
const listaAppuntamenti = [...appuntamentiPersonali, ...appuntamentiLavoro];

const filtro = (appuntamenti) =&amp;gt; (giorno) =&amp;gt;
  appuntamenti.filter((a) =&amp;gt; {
    return a.giorno === giorno;
  });

const filtraPer = filtro(listaAppuntamenti);
const appuntamentiMartedi = filtraPer('martedi');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di codice JavaScript





&lt;p&gt;Se questo codice non vi risulta chiaro, vi consiglio di fare un ripasso di ES6 prima di proseguire con React.&lt;/p&gt;

&lt;p&gt;Nel corso degli ultimi anni la programmazione funzionale ha avuto un grande impatto sulla comunità e l'ecosistema JavaScript. La programmazione funzionale in JavaScript è un argomento complesso, sono stati scritti centinaia di libri in merito e siamo qui per parlare di React, quindi limitiamoci a dire che React è costruito usando molte delle tecniche di programmazione funzionale, che vedremo di volta in volta mentre approfinderemo i vari aspetti di React. Vediamo solo un paio di importanti funzioni JavaScript che sono fondamentali per quello che andremo ad approfondire: i metodi &lt;code&gt;.map()&lt;/code&gt; e &lt;code&gt;.filter()&lt;/code&gt; di Array.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il Metodo &lt;code&gt;.map()&lt;/code&gt; di Array
&lt;/h2&gt;

&lt;p&gt;Se non conosci il metodo JavaScript &lt;a href="https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/map"&gt;&lt;code&gt;.map()&lt;/code&gt; di Array&lt;/a&gt;, viene chiamato su un array esistente e restituisce un nuovo array creato a partire da cosa restituisce la funzione che gli viene passata come argomento. Vediamo un esempio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomi = ['Matteo', 'Silvia', 'Daniele'];

const saluti = nomi.map((nome) =&amp;gt; `Ciao ${nome}!`);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio del metodo .map() di Array





&lt;p&gt;Vediamo cosa sta succedendo. Il metodo &lt;code&gt;.map()&lt;/code&gt; lavora sugli array, quindi abbiamo un array da cui partire:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomi = ['Matteo', 'Silvia', 'Daniele'];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Array di partenza





&lt;p&gt;Quindi chiamiamo &lt;code&gt;.map()&lt;/code&gt; sul array &lt;code&gt;nami&lt;/code&gt; e gli passiamo una funzione come argomento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nomi.map((nome) =&amp;gt; `Ciao ${nome}!`);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Chiamata alla funzione .map() di Array





&lt;p&gt;La funzione a freccia (arrow function) che è passata a &lt;code&gt;.map()&lt;/code&gt; viene chiamata per ogni elemento nell'array &lt;code&gt;nomi&lt;/code&gt;! La funzione a freccia riceve il primo nome nel array, lo salva nella variabile &lt;code&gt;nome&lt;/code&gt; e la usa per costruire e restituisce una nuova stringa &lt;code&gt;Ciao ${nome}!&lt;/code&gt;. Poi fa lo stesso con i restanti due nomi.&lt;/p&gt;

&lt;p&gt;Infine &lt;code&gt;.map()&lt;/code&gt; restituisce un nuovo array con i valori restituiti dalla funzione a freccia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const saluti = nomi.map((nome) =&amp;gt; `Ciao ${nome}`);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
.map() restituisce un nuovo Array





&lt;p&gt;&lt;code&gt;saluti&lt;/code&gt; sarà un &lt;em&gt;nuovo&lt;/em&gt; array &lt;code&gt;["Ciao Matteo!", "Ciao Silvia!", "Ciao Daniele!"]&lt;/code&gt;. Questo è un passaggio fondamentale da comprendere: &lt;strong&gt;il metodo&lt;code&gt;.map()&lt;/code&gt; restituisce un nuovo array, non viene modificato l'array originale.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Per fare pratica con il metodo &lt;code&gt;.map()&lt;/code&gt;, potete provare a sostituire dei cicli &lt;code&gt;for&lt;/code&gt; presenti in del vostro codice preesistente con la chiamata a &lt;code&gt;.map()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il Metodo &lt;code&gt;.filter()&lt;/code&gt; di Array
&lt;/h2&gt;

&lt;p&gt;Il metodo JavaScript &lt;a href="https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter"&gt;&lt;code&gt;.filter()&lt;/code&gt; di Array&lt;/a&gt; è simile al metodo &lt;code&gt;.map()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;viene chiamato su un array&lt;/li&gt;
&lt;li&gt;accetta una funzione come argomento&lt;/li&gt;
&lt;li&gt;restituisce un nuovo array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La differenza è che la funzione passata a &lt;code&gt;.filter()&lt;/code&gt; è usata come un test, solo gli elementi che passano il test sono inclusi nel nuovo array. Vediamo un esempio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomi = ['Matteo', 'Silvia', 'Daniele'];

const nomiCorti = nomi.filter((nome) =&amp;gt; nome.length &amp;lt;= 6);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio del Metodo .filter() di Array





&lt;p&gt;Come prima, abbiamo un array iniziale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomi = ['Matteo', 'Silvia', 'Daniele'];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Array di partenza





&lt;p&gt;Chiamiamo &lt;code&gt;.filter()&lt;/code&gt; sull'array &lt;code&gt;nomi&lt;/code&gt; e passiamo una funzione come argomento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nomi.filter((nome) =&amp;gt; nome.length &amp;lt;= 6);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Chiamata alla funzione .filter() di Array





&lt;p&gt;Allo stesso modo di &lt;code&gt;.map()&lt;/code&gt; la funzione a freccia passata a &lt;code&gt;.filter()&lt;/code&gt; viene chiamata per ogni elemento nell'array &lt;code&gt;nomi&lt;/code&gt;. Il primo elemento (&lt;code&gt;'Matteo'&lt;/code&gt;) è salvato nella variabile &lt;code&gt;nome&lt;/code&gt;. Poi viene eseguito il test, ovvero eseguiamo il filtro. Viene controllata la lunghezza del nome. Se è più di &lt;code&gt;6&lt;/code&gt; viene escluso e non incluso nel nuovo array, se invece la lunghezza del nome è 6 o meno, ovvero &lt;code&gt;name.length &amp;lt;= 6&lt;/code&gt; restituisce &lt;code&gt;true&lt;/code&gt; allora il nome è incluso nel nuovo array.&lt;/p&gt;

&lt;p&gt;Alla fine, proprio come &lt;code&gt;.map()&lt;/code&gt; il metodo &lt;code&gt;.filter()&lt;/code&gt; restituisce un nuovo array invece di modificare quello originale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomiCorti = nomi.filter((nome) =&amp;gt; nome.length &amp;lt;= 6);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
.filter() restituisce un nuovo Array





&lt;p&gt;Quindi &lt;code&gt;nomiCorti&lt;/code&gt; sarà il nuovo array &lt;code&gt;['Matteo', 'Silvia']&lt;/code&gt;. Da notare che contiene solo due nomi, perché &lt;code&gt;'Daniele'&lt;/code&gt; ha 7 caratteri ed è stato filtrato.&lt;/p&gt;

&lt;p&gt;Per prendere confidenza con questo metodo, potete provare a modificare del vostro codice preesistente sostituendo gli &lt;code&gt;if&lt;/code&gt; con chiamate a &lt;code&gt;.filter()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usiamo &lt;code&gt;.map()&lt;/code&gt; e &lt;code&gt;.filter()&lt;/code&gt; insieme
&lt;/h2&gt;

&lt;p&gt;Quello che rende &lt;code&gt;.map()&lt;/code&gt; e &lt;code&gt;.filter()&lt;/code&gt; molto potenti è che possono essere usati insieme perché entrambi restituiscono array quindi possiamo usarli a catena in modo che il nuovo array restituito da un metodo sia usato per la chiamata seguente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nomi = ['Matteo', 'Silvia', 'Daniele'];

const salutiCorti = nomi
  .filter((nome) =&amp;gt; nome.length &amp;lt;= 6)
  .map((nome) =&amp;gt; `Ciao ${nome}`);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di .map() e .filter() insieme





&lt;p&gt;Vediamo cosa succede, l'array &lt;code&gt;nomi&lt;/code&gt; è filtrato dal metodo &lt;code&gt;.filter()&lt;/code&gt;, quindi un nuovo array viene restituito, ma poi &lt;code&gt;.map()&lt;/code&gt; è chiamato sul nuovo array e restituisce a sua volta un nuovo array. Questo nuovo array restituito da &lt;code&gt;.map()&lt;/code&gt; è quello che viene salvato in &lt;code&gt;salutiCorti&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;.filter()&lt;/code&gt; per primo!
&lt;/h3&gt;

&lt;p&gt;Solitamente vorrete eseguire i metodi in questo ordine: &lt;code&gt;.filter()&lt;/code&gt; prima e dopo &lt;code&gt;.map()&lt;/code&gt;. Questo perché &lt;code&gt;.map()&lt;/code&gt; esegue la funzione per ogni elemento dell'array, e quindi questo è più veloce se l'array su cui viene eseguito è già filtrato.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Perché React? - 3. Flusso Dati Unidirezionale</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Sun, 30 Aug 2020 08:00:00 +0000</pubDate>
      <link>https://dev.to/matsprea/perche-react-3-flusso-dati-unidirezionale-4m2k</link>
      <guid>https://dev.to/matsprea/perche-react-3-flusso-dati-unidirezionale-4m2k</guid>
      <description>&lt;p&gt;Prima di React, una tecnica molto popolare per gestire i cambiamenti di stato nel tempo nelle applicazioni era l'uso dei data-bindings in modo quando i dati fossero cambiati, quelle modifiche sarebbero state applicate automaticamente nelle altre parti dell'applicazione ed ogni parte dell'applicazione che avesse avuto quei dati, li avrebbe anche potuti cambiare. Tuttavia col crescere dell'applicazione questa tecnica rende difficile individuare come un cambiamento in un posto, automaticamente ed implicitamente impatta il resto dell'applicazione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data-Binding in altri Frameworks
&lt;/h2&gt;

&lt;p&gt;Altri front-end frameworks come &lt;a href="https://angular.io/"&gt;Angular&lt;/a&gt; e &lt;a href="https://emberjs.com/"&gt;Ember&lt;/a&gt; fanno uso di data-bindings bidirezionale. Col il data-bindings bidirezionale, i dati sono tenuti in sincrono in tutta l'applicazione a prescindere da dove sono aggiornati. Se il modello cambia i suoi valori, i dati sia aggiornano nella presentazione. Allo stesso modo, se i dati sono aggiornati nella presentazione, il modello viene aggiornato. Il data-binding è molto potente, ma rende più difficile capire dove e perché i dati sono aggiornati.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flusso Dati in React
&lt;/h2&gt;

&lt;p&gt;I dati si spostano in modo diverso in React grazie al suo Flusso Dati Unidirezionale. In React i dati si muovono componente padre al componente figlio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--halutKpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-4.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/Flusso-Dati-Unidirezionale.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--halutKpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res-4.cloudinary.com/hdlxbiakh/image/upload/q_auto/v1/ghost-blog-images/Flusso-Dati-Unidirezionale.svg" alt=""&gt;&lt;/a&gt;Flusso Dati Unidirezionale dall'elemento padre all'elemento figlio. Gli aggiornamenti sono mandati all'elemento padre che si occupa di eseguirli.&lt;/p&gt;

&lt;p&gt;Nell'immagine precedente, ci sono due componenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un componente padre&lt;/li&gt;
&lt;li&gt;un componente figlio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I dati vivono nel componente padre e sono passati al componente figlio. Anche se i dati vivono nel componente padre, sia il componente padre che il figlio possono usare i dati. Se però i dati devono essere aggiornati, solo il componente padre dovrebbe eseguire l'aggiornamento. Se il componente figlio vuole fare dei cambiamenti, dovrà mandare l'aggiornamento al componente padre che si occuperà di eseguire effettivamente l'aggiornamento dei dati. Una volta che il cambiamento è eseguito, il componente figlio riceverà i dati (che sono appena stati aggiornati).&lt;/p&gt;

&lt;p&gt;Questa sembra un inutile lavoro in più, ma avere i dati che scorrono in una direzione ed avere un solo posto dove i dati sono modificati, rende molto più semplice capire come l'applicazione funziona.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TabellaProdotti&amp;gt;
  &amp;lt;RigaCategoriaProdotto /&amp;gt;
  &amp;lt;RigaProdotto /&amp;gt;
&amp;lt;/TabellaProdotti&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di componente padre con più componenti figli





&lt;p&gt;In React, i dati passano solo in una direzione, dal padre al figlio. Se i dati sono condivisi tra più componenti figli, allora i dati devono essere saltati nel componente padre e passati a tutti i componenti figli che ne hanno bisogno.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Perché React? - 2. Codice Dichiarativo</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Tue, 25 Aug 2020 08:54:51 +0000</pubDate>
      <link>https://dev.to/matsprea/perche-react-2-codice-dichiarativo-3k06</link>
      <guid>https://dev.to/matsprea/perche-react-2-codice-dichiarativo-3k06</guid>
      <description>&lt;p&gt;Proviamo a spiegare chiaramente la differenza che probabilmente avete già sperimentato. Pensiamo di essere in auto e voler viaggiare ad una velocità costante di 50km/h. In auto ci son due pedali, un acceleratore ed un freno. Io devo fare un lavoro imperativo, devo premere sui pedali per regolare la velocità e mantenerla costante a 50km/h. Ora supponiamo di avere un'auto nuova, che ha il controllo di velocità che mi permette semplicemente di dichiarare a che velocità voglio viaggiare al posto di dovere usare i pedali per regolare la velocità. Devo semplicemente selezionare lo stato in cui voglio essere, viaggiare a 50 km/h e la macchina si occupa del lavoro imperativo per me.&lt;/p&gt;

&lt;p&gt;React ti permette di fare la stessa cosa col tuo codice. Tu dichiari lo stato ed il markup e React esegue il lavoro imperativo per mantenere il DOM aggiornato con la tua applicazione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codice Imperativo
&lt;/h2&gt;

&lt;p&gt;Una gran parte di JavaScript è &lt;strong&gt;codice imperativo&lt;/strong&gt;. Se non sai cosa significa "imperativo", potresti avere qualche problema, quindi proviamo a capirlo. Secondo il dizionario "imperativo" significa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Che contiene o esprime comando.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando il codice JavaScript è scritto in modo &lt;em&gt;imperativo&lt;/em&gt;, noi diciamo in JavaScript esattamente &lt;strong&gt;cosa&lt;/strong&gt; fare e &lt;strong&gt;come&lt;/strong&gt; farlo. Prova a pensare come se dassimo a JavaScript dei &lt;em&gt;comandi&lt;/em&gt; su come eseguire esattamente ogni passaggio. Ad esempio in questo semplice ciclo &lt;code&gt;for&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const colori = ['Verde', 'Bianco', 'Rosso', 'Giallo', 'Azzurro', 'Viola']
const coloriChiari = []

for (let i = 0; i &amp;lt; colori.length; i++) {
 coloriChiari[i] = colori[i] + ' chiaro'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Codice Imperativo





&lt;p&gt;Se avete già provato a scrivere JavaScript, questo codice dovrebbe essere abbastanza chiaro. Stiamo ciclando su ogni elemento dell'array &lt;code&gt;colori&lt;/code&gt;, aggiungendo ' chiaro' alla fine e salvando la nuova stringa risultante in una nuovo array &lt;code&gt;coloriChiari&lt;/code&gt;. Abbastanza semplice, giusto?&lt;/p&gt;

&lt;p&gt;Questo è codice &lt;em&gt;imperativo&lt;/em&gt;! Stiamo dicendo a JavaScript cosa fare in ogni singolo passaggio. Questi sono i comandi che stiamo dando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imposta il valore iniziale per l'iteratore - (&lt;code&gt;let i = 0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Diciamo al ciclo &lt;code&gt;for&lt;/code&gt; quando deve fermarsi - (&lt;code&gt;i &amp;lt; colori.length&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Prendiamo il colore alla posizione corrente e ci aggiungiamo ' chiaro' - (&lt;code&gt;colori[i] + ' chiaro'&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Salviamo il risultato nella posizione &lt;code&gt;i&lt;/code&gt;-esima del nuovo array - (&lt;code&gt;coloriChiari[i]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Aumentiamo di uno il valore di &lt;code&gt;i&lt;/code&gt; - (&lt;code&gt;i++&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tornando all'esempio iniziale di viaggiare a 50km/h con la mia vecchia automobile, usavo il pedale dell'acceleratore e del freno per regolare la velocità. Quando la velocità era troppo alta, dovevo premere sul pedale del freno per rallentare, ma se rallentava troppo, dovevo di nuovo premere il pedale dell'acceleratore per aumentare la velocità. Inevitabilmente la velocità aumentava troppo e dovevo di nuovo premere il pedale del freno per rallentare. Dovevo gestire la velocità per gestire ogni variazione. Non vi sembra una situazione imperativa? Vediamo se possiamo migliorare le cose!&lt;/p&gt;

&lt;h2&gt;
  
  
  Codice Dichiarativo
&lt;/h2&gt;

&lt;p&gt;In contrasto al codice imperativo, esiste il &lt;strong&gt;codice dichiarativo&lt;/strong&gt;. Col codice dichiarativo, non dobbiamo specificare ogni singolo passaggio per ottenere il risultato finale. Invece, &lt;em&gt;dichiariamo&lt;/em&gt; quello che vogliamo fare, e JavaScript si occuperà di farlo. Mi rendo conto che la spiegazione è un po' astratta, quindi vediamo un esempio. Prendiamo il ciclo &lt;code&gt;for&lt;/code&gt; imperativo che abbiamo appena visto e riscriviamolo per renderlo più dichiarativo.&lt;/p&gt;

&lt;p&gt;Con il codice imperativo eseguiamo tutti i passaggi per ottenere il risultato finale, ma qual è il risultato finale che veramente vogliamo? Il punto d'inizio era solo un array di colori:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const colori = ['Verde', 'Bianco', 'Rosso', 'Giallo', 'Azzurro', 'Viola']
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Array iniziale di colori





&lt;p&gt;L'obiettivo finale che vogliamo ottenere è un array con gli stessi colori, ma con la scritta ' chiaro' alla fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['Verde chiaro', 'Bianco chiaro', 'Rosso chiaro', 'Giallo chiaro', 'Azzurro chiaro', 'Viola chiaro']
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Obiettivo finale di colori





&lt;p&gt;Per ottenere questo risultato, possiamo prendere l'array iniziale ed usare la funzione JavaScript &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map?v=example"&gt;&lt;code&gt;.map()&lt;/code&gt;&lt;/a&gt; per dichiarare quello che vogliamo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const coloriChiari = colori.map(name =&amp;gt; name + ' chiaro')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di codice dichiarativo





&lt;p&gt;Fatto! Con questo codice, non dobbiamo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creare un iteratore&lt;/li&gt;
&lt;li&gt;Dire al ciclo quando deve fermarsi&lt;/li&gt;
&lt;li&gt;Usare un iteratore per selezionare un elemento dell'array &lt;code&gt;colori&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Salvare ogni nuovo valore nell'array &lt;code&gt;coloriChiari&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tutte queste operazioni sono eseguite dal metodo &lt;code&gt;.map()&lt;/code&gt; degli Array JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  React è Dichiarativo
&lt;/h2&gt;

&lt;p&gt;Scriveremo codice React presto, ma vediamo meglio cosa significa che è dichiarativo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;button onClick={attivareVentilatore}&amp;gt;Attivare Ventilatore&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Esempio di codice React Dichiarativo





&lt;p&gt;Sembrerà strano, ma questo è un frammento valido di codice React e dovrebbe essere semplice da capire. C'è solo un attributo &lt;code&gt;onClick&lt;/code&gt; sul bottone e non stiamo usando &lt;code&gt;.addEventListener()&lt;/code&gt; per gestire l'evento con tutti i passaggi necessari. Invece, stiamo solo dichiarando che vogliamo che la funzione &lt;code&gt;attivareVentilatore&lt;/code&gt; sia eseguita quando si clicca sul buttone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Riepilogo
&lt;/h2&gt;

&lt;p&gt;Il codice &lt;em&gt;imperativo&lt;/em&gt; dice a JavaScript &lt;em&gt;come&lt;/em&gt; eseguire ogni singolo passaggio. Con il codice &lt;em&gt;dichiarativo&lt;/em&gt;, noi diciamo a JavaScript &lt;em&gt;cosa&lt;/em&gt; vogliamo sia fatto e lasciamo che JavaScript si occupi di eseguire i passaggi.&lt;/p&gt;

&lt;p&gt;React è dichiarativo perché scriviamo il codice che vogliamo, e Reach si occupa di prendere il nostro codice dichiarativo ed eseguire tutti i passaggi necessari per ottenere il risultato desiderato in JavaScript/DOM.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Perché React? - 1. La Composizione</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Sun, 23 Aug 2020 08:00:00 +0000</pubDate>
      <link>https://dev.to/matsprea/perche-react-1-la-composizione-53kh</link>
      <guid>https://dev.to/matsprea/perche-react-1-la-composizione-53kh</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Prima di vedere la sintassi di React, facciamo un passo indietro e vediamo cosa rende React speciale.&lt;/p&gt;

&lt;p&gt;Il suo modello compositivo, la sua natura dichiarativa, il modo in cui i dati scorrono attraverso un componente.&lt;/p&gt;

&lt;p&gt;E React è veramente solo JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cos'è la Composizione?
&lt;/h2&gt;

&lt;p&gt;Partiamo dalla definizione:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;combinare funzioni semplici per costruirne di più complesse&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quindi ora vediamo come realizzare funzioni complesse soltanto combinando insieme semplici funzioni.&lt;/p&gt;

&lt;p&gt;Sei probabilmente familiare con l'idea di funzioni, quando usare una funzione e quando non usarne una probabilmente è abbastanza naturale per te. Una degli aspetti più interessi di React è che puoi usare la stessa intuizione che usi con le funzioni per decidere quando creare componenti React. Mentre una funzione prendere degli argomenti e restituisce un valore, la tua funzione prenderà alcuni argomenti e restituirà UI.&lt;/p&gt;

&lt;p&gt;Ora, vediamo del codice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getBookCover(isbn) {
  return `http://covers.openlibrary.org/b/${isbn}-M.jpg`;
}

function getBookInfo(isbn) {
  return `http://openlibrary.org/isbn/${isbn}`;
}

function getBookData(isbn) {
  return {
    cover: getBookCover(isbn),
    info: getBookInfo(isbn),
  };
}

getBookData('9780385533225');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Composizione di funzioni che restituisce dei dati





&lt;p&gt;Ci sono tre funzioni ed una invocazione di funzione. Il codice è organizzato e chiaro perché ogni funzione ha il suo specifico scopo. Stiamo componendo le nostre funzioni insieme per creare una funzione &lt;code&gt;getBookData&lt;/code&gt; usando le altre due funzioni &lt;code&gt;getBookCover&lt;/code&gt; e &lt;code&gt;getBookInfo&lt;/code&gt;. Quando ora chiamiamo &lt;code&gt;getBookData&lt;/code&gt; otteniamo un oggetto che rappresenta il nostro libro.&lt;/p&gt;

&lt;p&gt;Ora invece di avere queste funzioni che ci restituiscono un oggetto con dei dati, proviamo a modificarle per ottenere UI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function BookCover(isbn) {
  return (
    &amp;lt;img
      alt={`${isbn} cover`}
      src={`http://covers.openlibrary.org/b/${isbn}-M.jpg`}
    /&amp;gt;
  );
}

function BookInfo(isbn) {
  return (&amp;lt;a href={`http://openlibrary.org/isbn/${isbn}`}&amp;gt;{isbn} info&amp;lt;/a&amp;gt;);
}

function BookData(isbn) {
  return (
    &amp;lt;div className="book"&amp;gt;
      &amp;lt;BookCover isbn={isbn} /&amp;gt;
      &amp;lt;BookInfo isbn={isbn} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

&amp;lt;BookData isbn="9780385533225" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Composizione di funzioni che restituisce UI





&lt;p&gt;Niente panico, vedremo la sintassi più avanti, ma per ora notiamo che in React invece di comporre funzioni per ottenere valori, abbiamo ottenuto UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Vantaggi della Composizione
&lt;/h2&gt;

&lt;p&gt;Il concetto di composizione è uno degli aspetti principali di React ed oltre a renderlo incredibilmente potente è anche fantastico lavorarci. Ricorda che la composizione è solo unire insieme semplici funzioni per crearne di complesse.&lt;br&gt;&lt;br&gt;
Ci sono un paio di concetti che non vogliamo scordare, ovvero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;funzioni semplici&lt;/li&gt;
&lt;li&gt;unite per creare un'altra funzione&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La composizione è fondata su funzioni &lt;em&gt;semplici&lt;/em&gt;. Vediamo un esempio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getBookCover(isbn) {
  return `http://covers.openlibrary.org/b/${isbn}-M.jpg`;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Funzione semplice





&lt;p&gt;Questa funzione è &lt;em&gt;incredibilmente&lt;/em&gt; semplice! È solo una riga! Allo &lt;em&gt;stesso&lt;/em&gt; modo &lt;code&gt;getBookInfo&lt;/code&gt; è solo una riga:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getBookInfo(isbn) {
  return `http://openlibrary.org/isbn/${isbn}`;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Un'altra funzione semplice





&lt;p&gt;Queste sono sicuramente funzioni &lt;em&gt;semplici&lt;/em&gt;, quindi per comporle, dobbiamo solo &lt;em&gt;unirle&lt;/em&gt; all'interno di un'altra funzione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
function getBookData(isbn) {
  return {
    cover: getBookCover(isbn),
    info: getBookInfo(isbn),
  };
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Unione di funzioni





&lt;p&gt;Avremmo anche potuto scrivere &lt;code&gt;getBookData&lt;/code&gt; &lt;em&gt;senza&lt;/em&gt; usare la composizione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getBookData(isbn) {
  return {
    cover: `http://covers.openlibrary.org/b/${isbn}-M.jpg`,
    info: `http://openlibrary.org/isbn/${isbn}`,
  };
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Funzione &lt;em&gt;senza&lt;/em&gt; composizione





&lt;p&gt;Non c'è niente di sbagliato nel farlo, il codice Javascript è perfettamente corretto; ma &lt;em&gt;non&lt;/em&gt; si tratta di composizione. Ci sono anche dei potenziali problemi nella versione che &lt;em&gt;non&lt;/em&gt; usa la composizione. Se il link al libro è richiesto altrove, il codice dovrà essere duplicato. Una buona funzione dovrebbe seguire la regola "DOT":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do One Thing (Fai una cosa)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Questa funzione fa un paio di cose sempli: crea due differenti URLs, li salva come proprietà di un oggetto e ritorna l'oggetto. Nella versione con la composizione, ogni funzione fa solo una cosa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;getBookCover&lt;/code&gt; – costruisce una stringa con l'URL della copertina del libro&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getBookInfo&lt;/code&gt; – costruisce una stringa con l'URL della pagina del libro&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getBookData&lt;/code&gt; – restituisce il nuovo oggetto&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  React e Composizione
&lt;/h2&gt;

&lt;p&gt;React fa largo uso delle composizione! React costruisce pezzi di UI usando &lt;strong&gt;componenti&lt;/strong&gt;. Vediamo un esempio con tre componenti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Pagina /&amp;gt;
&amp;lt;Articolo /&amp;gt;
&amp;lt;BarraLaterale /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Tre componenti





&lt;p&gt;Ora prendiamo questi &lt;em&gt;semplici&lt;/em&gt; componenti ed uniamoli insieme per creare un nuovo componente più complicato, ovvero usiamo la composizione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Pagina&amp;gt;
 &amp;lt;Articolo /&amp;gt;
 &amp;lt;BarraLaterale /&amp;gt;
&amp;lt;/Pagina&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Composizione di componenti





&lt;p&gt;Ora il componente &lt;code&gt;Pagina&lt;/code&gt; ha al suo &lt;em&gt;interno&lt;/em&gt; i componenti &lt;code&gt;Articolo&lt;/code&gt; e &lt;code&gt;BarraLaterale&lt;/code&gt;. Esattamente con nell'esempio precedente dove &lt;code&gt;getBookData&lt;/code&gt; aveva &lt;code&gt;getBookPic&lt;/code&gt; e &lt;code&gt;getBookInfo&lt;/code&gt; all'interno.&lt;/p&gt;

&lt;p&gt;Approfondiremo il concetto di componenti nei prossimi articoli, per ora ricorda che la composizione ha un ruolo enorme nel costruire componenti in React.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Annunciato TypeScript 4.0 RC</title>
      <dc:creator>Matteo Spreafico</dc:creator>
      <pubDate>Sun, 09 Aug 2020 17:06:09 +0000</pubDate>
      <link>https://dev.to/matsprea/annunciato-typescript-4-0-rc-563a</link>
      <guid>https://dev.to/matsprea/annunciato-typescript-4-0-rc-563a</guid>
      <description>&lt;p&gt;Un paio di giorni Microsoft ha annunciato la Release Candidate della nuova major version di Typescript, la 4.0.&lt;/p&gt;

&lt;p&gt;Solitamente un cambio di major version è accompagnato da sostanziali novità e modifiche non retrocompatibili, ma il team di Typescript ha fatto il possibile per minimizzare le incompatibilità, così come avevano fatto per la Typescript 3.9.&lt;/p&gt;

&lt;p&gt;Per iniziare subito ad usare la RC basta installarla tramite &lt;code&gt;npm&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install typescript@rc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ma vediamo l'elenco delle novità:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipi variadici di Tuple&lt;/li&gt;
&lt;li&gt;Elementi della Tupla etichettati&lt;/li&gt;
&lt;li&gt;Proprietà delle Classi determinate dai Costruttori&lt;/li&gt;
&lt;li&gt;Operatori di assegnazione composti con cortocircuito&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unknown&lt;/code&gt; per i parametri del blocco &lt;code&gt;catch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JSX Factories personalizzate&lt;/li&gt;
&lt;li&gt;Velocità migliorata per &lt;code&gt;build&lt;/code&gt; con &lt;code&gt;--noEmitOnError&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--incremental&lt;/code&gt; con &lt;code&gt;--noEmit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/** @deprecated */&lt;/code&gt; Supportato&lt;/li&gt;
&lt;li&gt;Modifiche non retrocompatibili&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tipi variadici di Tuple
&lt;/h2&gt;

&lt;p&gt;Consideriamo una funzione in JavaScript chiamata &lt;code&gt;concat&lt;/code&gt; che prende due array o tuple e li concatena insieme in un nuovo array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function concat(arr1, arr2) {
    return [...arr1, ...arr2];
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Inoltre consideriamo &lt;code&gt;tail&lt;/code&gt;, che accetta un array o tupla e restituisce tutti gli elementi tranne il primo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function tail(arg) {
    const [_, ...result] = arg;
    return result
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Come possiamo tipizzare queste funzioni in TypeScript?&lt;/p&gt;

&lt;p&gt;Per &lt;code&gt;concat&lt;/code&gt;, l'unica cosa possibile nelle vecchie versioni del linguaggio era provare a scrivere alcuni overloads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function concat&amp;lt;&amp;gt;(arr1: [], arr2: []): [A];
function concat&amp;lt;A&amp;gt;(arr1: [A], arr2: []): [A];
function concat&amp;lt;A, B&amp;gt;(arr1: [A, B], arr2: []): [A, B];
function concat&amp;lt;A, B, C&amp;gt;(arr1: [A, B, C], arr2: []): [A, B, C];
function concat&amp;lt;A, B, C, D&amp;gt;(arr1: [A, B, C, D], arr2: []): [A, B, C, D];
function concat&amp;lt;A, B, C, D, E&amp;gt;(arr1: [A, B, C, D, E], arr2: []): [A, B, C, D, E];
function concat&amp;lt;A, B, C, D, E, F&amp;gt;(arr1: [A, B, C, D, E, F], arr2: []): [A, B, C, D, E, F];)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;... sono sette overloads per quando il secondo array è sempre vuoto. Aggiungiamone altri per quando &lt;code&gt;arr2&lt;/code&gt; ha un argomento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function concat&amp;lt;A2&amp;gt;(arr1: [], arr2: [A2]): [A2];
function concat&amp;lt;A1, A2&amp;gt;(arr1: [A1], arr2: [A2]): [A1, A2];
function concat&amp;lt;A1, B1, A2&amp;gt;(arr1: [A1, B1], arr2: [A2]): [A1, B1, A2];
function concat&amp;lt;A1, B1, C1, A2&amp;gt;(arr1: [A1, B1, C1], arr2: [A2]): [A1, B1, C1, A2];
function concat&amp;lt;A1, B1, C1, D1, A2&amp;gt;(arr1: [A1, B1, C1, D1], arr2: [A2]): [A1, B1, C1, D1, A2];
function concat&amp;lt;A1, B1, C1, D1, E1, A2&amp;gt;(arr1: [A1, B1, C1, D1, E1], arr2: [A2]): [A1, B1, C1, D1, E1, A2];
function concat&amp;lt;A1, B1, C1, D1, E1, F1, A2&amp;gt;(arr1: [A1, B1, C1, D1, E1, F1], arr2: [A2]): [A1, B1, C1, D1, E1, F1, A2];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Mi sembra ovvio che non ha senso questa soluzione. Sfortunatamente lo stesso tipo di problema si incontra con funzioni simili a &lt;code&gt;tail&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Questo è anche chiamato “morte per mille overloads” e non risolvere il problema in maniera generica è limitato al numero di overload che vogliamo effettivamente scrivere. Se volessimo una definizione generica dovremmo scrivere qualcosa simile a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function concat&amp;lt;T, U&amp;gt;(arr1: T[], arr2, U[]): Array&amp;lt;T | U&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ma questo non ci dice nulla sulla lunghezza degli dei parametri in ingresso o sull'ordine dei sui elementi quando usiamo le tuple.&lt;/p&gt;

&lt;p&gt;TypeScript 4.0 contiene 2 modifiche sostanziali, per rendere questi tipi possibili.&lt;/p&gt;

&lt;p&gt;La prima modifica consiste nel fatto che lo spread nei tipi delle tuple può essere un generic. Questo significa che possiamo rappresentare operazione di ordine superiore nelle tuple e negli array anche quando non sappiamo l'effettivo tipo su cui stiamo operando. Quando uno generic spread è istanziato (or sostituito con un tipo concreto) in questi tipi di tuple, generano dei nuovi gruppo di tipi di array e tuple.&lt;/p&gt;

&lt;p&gt;Per esempio, questo significa che possiamo assegnare un tipo alle funzioni come &lt;code&gt;tail&lt;/code&gt;, senza il problema della “morte per mille overloads”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function tail&amp;lt;T extends any[]&amp;gt;(arr: readonly [any, ...T]) {
    const [_ignored, ...rest] = arr;
    return rest;
}

const myTuple = [1, 2, 3, 4] as const;
const myArray = ["hello", "world"];

// type [2, 3, 4]
const r1 = tail(myTuple);

// type [2, 3, ...string[]]
const r2 = tail([...myTuple, ...myArray] as const);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;La seconda modifica è che l'elemento di spread può essere in qualunque posizione all'interno di una tupla, non solo alla fine!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Strings = [string, string];
type Numbers = [number, number];

// [string, string, number, number]
type StrStrNumNum = [...Strings, ...Numbers];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In precedenza, TypeScript avrebbe dato il seguente errore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A rest element must be last in a tuple type.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ma ora il linguaggio può gestire gli spreads in ogni posizione.&lt;/p&gt;

&lt;p&gt;Quando facciamo lo spread di un tipo senza una lunghezza nota, il tipo risultante diventa illimitato a sua volta e tutti gli elementi seguenti sono raccolti nel risultante tipo dell'elemento restante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Strings = [string, string];
type Numbers = number[]

// [string, string, ...Array&amp;lt;number | boolean&amp;gt;]
type Unbounded = [...Strings, ...Numbers, boolean];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Combinando entrambi questi comportamenti, possiamo scrivere un solo tipo per &lt;code&gt;concat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Arr = readonly any[];

function concat&amp;lt;T extends Arr, U extends Arr&amp;gt;(arr1: T, arr2: U): [...T, ...U] {
    return [...arr1, ...arr2];
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nonostante la definizione sia leggermente lunga, è solo una ed è stata scritta una sola volta e fornisce un comportamento predicibile per gli array e le tuple.&lt;/p&gt;

&lt;p&gt;Questa funzionalità è molto interessante, ma ci sono anche degli scenari più complessi. Ad esempio, consideriamo una funzione che applica parzialmente gli argomenti e la chiamiamo &lt;code&gt;partialCall&lt;/code&gt;. &lt;code&gt;partialCall&lt;/code&gt; prende una funziona insieme agli argomenti che quella funzione di aspetta e poi ritorna una nuova funzione che prende tutti gli altri argomenti che quella funzione si aspetta e la chiama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function partialCall(f, ...headArgs) {
    return (...tailArgs) =&amp;gt; f(...headArgs, ...tailArgs)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;TypeScript 4.0 migliora il processo di inferenza di tipo per i restanti parametri e gli elementi della tupla restante in modo da generare un tipo che "semplicemente funziona".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Arr = readonly unknown[];

function partialCall&amp;lt;T extends Arr, U extends Arr, R&amp;gt;(f: (...args: [...T, ...U]) =&amp;gt; R, ...headArgs: T) {
    return (...b: U) =&amp;gt; f(...headArgs, ...b)
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In questo caso, &lt;code&gt;partialCall&lt;/code&gt; capisce quali parametri può o non può inizialmente ricevere e ritorna funzioni che di conseguenza accettano o rifiutano i rimanenti.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const foo = (x: string, y: number, z: boolean) =&amp;gt; {}

// Questo non funziona perchè stiamo passando il tipo sbagliato per 'x'.
const f1 = partialCall(foo, 100);
// ~~~
// error! Argument of type 'number' is not assignable to parameter of type 'string'.

// Questo non funziona perchè stiamo passando troppi argomenti
const f2 = partialCall(foo, "hello", 100, true, "oops")
// ~~~~~~
// error! Expected 4 arguments, but got 5.

// Questo funziona! Il suo tipo è '(y: number, z: boolean) =&amp;gt; void'
const f3 = partialCall(foo, "hello");

// Cosa possiamo fare con f3?

f3(123, true); // funziona!

f3();
// error! Expected 2 arguments, but got 0.

f3(123, "hello");
// ~~~~~~~
// error! Argument of type '"hello"' is not assignable to parameter of type 'boolean'.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I tipi variadici di Tuple permettono dei nuovi scenari, specialmente nella composizione di funzioni.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elementi della Tupla etichettati
&lt;/h2&gt;

&lt;p&gt;Migliorare l'utilizzo dei tipi tupla è importante perché ci permette di avere la validazione del tipo anche in comuni costrutti Javascript come quando si manipola la lista degli argomenti per passarli ad altre funzioni.&lt;/p&gt;

&lt;p&gt;Ad esempio, questa funziona usa una tupla per gli argomenti restanti&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo(...args: [string, number]): void {
    // ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;e dovrebbe essere del tutto equivalente a&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo(arg0: string, arg1: number): void {
    // ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;per chiunque chiami &lt;code&gt;foo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foo("ciao", 42); // funziona

foo("ciao", 42, true); // errore
foo("ciao"); // errore
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;C'è però una differenza evidente: la leggibilità! Nel primo esempio, non abbiamo un nome dei parametri per il primo ed il secondo elemento. Anche non c'è nessuna differenza nel controllo dei tipi, la mancanza di etichette nella tupla le può rendere più difficili da usare e comprendere.&lt;/p&gt;

&lt;p&gt;Per questo motivo, in TypeScript 4.0, i tipi tupla possono fornire le etichette.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Intervallo = [inizio: number, fine: number];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Per rendere ancora più evidente il legame tra liste di parametri e tipi tupla, abbiamo reso la sintassi per i restanti elementi e gli elementi facoltativi simile a quella delle liste di parametri.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Foo = [primo: number, secondo?: string, ...resto: any[]];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Quando si aggiunge un'etichetta ad un elemento della tupla, tutti gli altri elementi della tupla devono essere etichettati&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Bar = [primo: string, number];
// ~~~~~~
// error! Tuple members must all have names or all not have names.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Vale la pena notare che le etichette non ci obbligano a dare un nome differente alle variabili quando destrutturiamo. Servono unicamente come documentazione.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function foo(x: [primo: string, secondo: number]) {
// ...

// nota: non dobbiamo chiamare queste 'primo' e 'secondo'
let [a, b] = x;

// ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Per saperne di più potete vedere la &lt;a href="https://github.com/microsoft/TypeScript/pull/38234"&gt;pull request&lt;/a&gt; per i labeled tuple elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proprietà delle Classi determinate dai Costruttori
&lt;/h2&gt;

&lt;p&gt;Typescript 4.0 ora può usare l'analisi del flusso di controllo per determinare il tipo delle proprietà nelle classi quando &lt;code&gt;noImplicitAny&lt;/code&gt; è abilitato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Quadrato {
    // Precedentemente: any implicito
    // Ora: determinato `number`
    area;
    lunghezzaLato;

    constructor(lunghezzaLato: number) {
        this.lunghezzaLato = lunghezzaLato;
        this.area = lunghezzaLato ** 2;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Quando non tutti i percorsi del costruttore assegnano un valore, la proprietà è considerata potenzialmente &lt;code&gt;undefined&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Quadrato {
    lunghezzaLato;

    constructor(lunghezzaLato: number) {
        if (Math.random()) {
            this.lunghezzaLato = lunghezzaLato;
        }
    }

    get area() {
        return this.lunghezzaLato ** 2;
        // ~~~~~~~~~~~~~~~
        // error! Object is possibly 'undefined'.
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Operatori di assegnazione composti con cortocircuito
&lt;/h2&gt;

&lt;p&gt;JavaScript, come molti altri linguaggi, supporto un gruppo di operatori chiamati &lt;em&gt;operatori di assegnazione composti&lt;/em&gt;. Questi operatori, applicano un'operazione a due argomenti e poi assegnano il risultato a sinistra. Li avrete probabilmente già visti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Somma
// a = a + b
a += b;

// Sottrazione
// a = a - b
a -= b;

// Moltiplicazione
// a = a * b
a *= b;

// Divisione
// a = a / b
a /= b;

// Elevamento a potenza
// a = a ** b
a **= b;

// Bit Shift a sinisstra
// a = a &amp;lt;&amp;lt; b
a &amp;lt;&amp;lt;= b;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Molti operatori in JavaScript hanno il corrispondente operatore di assegnazione composto! Ma ci sono tre importanti eccezioni: &lt;em&gt;and logico&lt;/em&gt; (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;), &lt;em&gt;or logico&lt;/em&gt; (&lt;code&gt;||&lt;/code&gt;), and coalescenza nulla (&lt;code&gt;??&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Per questo motivo, TypeScript 4.0 supporta la promettente proposta di includere questi nuovi operatori: &lt;code&gt;&amp;amp;&amp;amp;=&lt;/code&gt;, &lt;code&gt;||=&lt;/code&gt;, and &lt;code&gt;??=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Questi operatori sono utili in ogni caso un utente voglia scrivere codice come il seguente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a = a &amp;amp;&amp;amp; b;
a = a || b;
a = a ?? b;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Questi sono alcuni esempi di utilizzo dove si utilizza il lazy initialization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let valori: string[];

// Prima
(valori ?? (valori = [])).push("ciao");

// Dopo
(valori ??= []).push("ciao");
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nel raro caso in cui tu usi getters o setters con effetti collaterali, ricorda che questi operatori eseguono l'assegnamento solo se necessario. In questo senso l'assegnamento è cortocircuitato, che rappresenta una differenza rispetto agli altri operatori di assegnazione composti.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a ||= b;

// equivalente a

a || (a = b);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Per altre informazioni, potete vedere &lt;a href="https://github.com/microsoft/TypeScript/pull/37727"&gt;la pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;unknown&lt;/code&gt; per i parametri del &lt;code&gt;catch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Da sempre i parametri dei blocchi &lt;code&gt;catch&lt;/code&gt; hanno sempre avuto il tipo &lt;code&gt;any&lt;/code&gt;. Questo vuol dire che TypeScript ti lascia fare qualunque cosa con loro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
    // ...
}
catch (x) {
    // x ha come tipo 'any' - buon divertimento!
    console.log(x.message);
    console.log(x.toUpperCase());
    x++;
    x.yadda.yadda.yadda();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Dato che i parametri del blocco &lt;code&gt;catch&lt;/code&gt; hanno il tipo &lt;code&gt;any&lt;/code&gt; in automatico, la mancanza del controllo di tipo non ci aiuta ad evitare di introdurre altri errori nel blocco di codice dedicato alla gestione degli errori!&lt;/p&gt;

&lt;p&gt;Per questo motivo TypeScript 4.0 ora ti lascia indicare il tipo di ogni variabile del blocco &lt;code&gt;catch&lt;/code&gt; come &lt;code&gt;unknown&lt;/code&gt;. &lt;code&gt;unknown&lt;/code&gt; è più sicuro di &lt;code&gt;any&lt;/code&gt; perché ti ricorda che devi controllare il tipo prima di eseguire ogni operazione sui nostri valori.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
    // ...
}
catch (e: unknown) {
    // errore!
    // La proprietà 'toUpperCase' non esiste nel tipo 'unknown'.
    console.log(e.toUpperCase());

    if (typeof e === "string") {
        // funziona!
        // Abbiamo verificaro che 'e' ha il tipo 'string'.
        console.log(e.toUpperCase());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Il tipo automatico dei parametri dei blocchi  &lt;code&gt;catch&lt;/code&gt; non cambia, ma potrebbe essere aggiunta una nuova opzione &lt;code&gt;--strict&lt;/code&gt; in futuro per abilitare questo comportamento. Nel frattempo, dovrebbe esser possibile scrivere una regola di validazione per richiedere che i parametri dei blocchi &lt;code&gt;catch&lt;/code&gt; abbiano il tipo annotato esplicitamente a &lt;code&gt;: any&lt;/code&gt; o &lt;code&gt;: unknown&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSX Factories personalizzate
&lt;/h2&gt;

&lt;p&gt;Quando si usa JSX, un &lt;a href="https://reactjs.org/docs/fragments.html"&gt;&lt;em&gt;fragment&lt;/em&gt;&lt;/a&gt; è un tipo di elementi JSX che ti permette restituire diversi elementi figlio. Quando fragment è stato implementato per la prima volta in TypeScript, non era chiaro come le altre librerie lo avrebbero utilizzato.&lt;/p&gt;

&lt;p&gt;In TypeScript 4.0, gli utenti possono personalizzare la fragment factory attraverso la nuova opzione &lt;code&gt;jsxFragmentFactory&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ad esempio, il seguente &lt;code&gt;tsconfig.json&lt;/code&gt; dice a TypeScript di trasformare JSX in un modo compatibile con React, ma sostituisce ogni chiamata a &lt;code&gt;React.createElement&lt;/code&gt; con &lt;code&gt;h&lt;/code&gt;, e usa &lt;code&gt;Fragment&lt;/code&gt; invece di &lt;code&gt;React.Fragment&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "jsx": "react",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment"
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nel caso in cui ti serva avere una diversa JSX factory per ogni file, puoi usare il commento &lt;code&gt;/** @jsxFrag */&lt;/code&gt;. Ad esempio…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Nota: per usare questi commenti, devono essere scritti
// usando lo stile JSDoc su più linee.
/** @jsx h */
/** @jsxFrag Fragment */

import { h, Fragment } from "preact";

let stuff = &amp;lt;&amp;gt;
    &amp;lt;div&amp;gt;Hello&amp;lt;/div&amp;gt;
&amp;lt;/&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;… e verrà trasformato in questo JavaScript…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Nota: per usare questi commenti, devono essere scritti
// usando lo stile JSDoc su più linee.
/** @jsx h */
/** @jsxFrag Fragment */
import { h, Fragment } from "preact";
let stuff = h(Fragment, null,
    h("div", null, "Hello"));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Velocità migliorata per &lt;code&gt;build&lt;/code&gt; con &lt;code&gt;--noEmitOnError&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Precedentemente, la compilazione di programma che precedentemente aveva degli errori usando &lt;code&gt;--incremental&lt;/code&gt; sarebbe risultata estremamente lenta usando il parametro &lt;code&gt;--noEmitOnError&lt;/code&gt;. Questo perché nessuna delle informazioni dell'ultima compilazione sarebbero state salvate nel &lt;code&gt;.tsbuildinfo&lt;/code&gt; file per via del parametro &lt;code&gt;--noEmitOnError&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;TypeScript 4.0 modifica questo comportamento ottenendo un grande miglioramento delle prestazioni in questi scenari, e di conseguenza migliora gli scenari con &lt;code&gt;--build&lt;/code&gt; (che implica sia &lt;code&gt;--incremental&lt;/code&gt; che &lt;code&gt;--noEmitOnError&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Per altri dettagli, &lt;a href="https://github.com/microsoft/TypeScript/pull/38853"&gt;potete far riferimento alla pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;--incremental&lt;/code&gt; con &lt;code&gt;--noEmit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;TypeScript 4.0 permette di usare il parametro &lt;code&gt;--noEmit&lt;/code&gt; quando si usa &lt;code&gt;--incremental&lt;/code&gt;. Questo non era precedentemente permesso poiché &lt;code&gt;--incremental&lt;/code&gt; richiede la creazione del &lt;code&gt;.tsbuildinfo&lt;/code&gt; file; ma avere delle build più veloci è molto importante ed è stato abilitato per tutti gli utenti.&lt;/p&gt;

&lt;p&gt;Al solito, potete vedere &lt;a href="https://github.com/microsoft/TypeScript/pull/39122"&gt;l'implementazione della nella pull request&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  /** &lt;a class="comment-mentioned-user" href="https://dev.to/deprecated"&gt;@deprecated&lt;/a&gt;
 */ Supportato
&lt;/h2&gt;

&lt;p&gt;TypeScript ora riconosce quando una dichiarazione è stata decorata con il commneto JSDoc &lt;code&gt;/** @deprecated *&lt;/code&gt;. L'informazione è passata alla lista dei suggerimenti per l'autocompletamento in modo che che l'editor possa gestirla opportunamente. In VS Code ad esempio i valori deprecati sono mostrati col testo sbarrato, &lt;del&gt;come questo&lt;/del&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modifiche non Retrocompatibili
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Modifiche a &lt;code&gt;lib.d.ts&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Le dichiarazioni in &lt;code&gt;lib.d.ts&lt;/code&gt; sono cambiate, più precisamente i tipi per il DOM sono cambiati. La modifica più rilevante è l'eliminazione di &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/origin"&gt;&lt;code&gt;document.origin&lt;/code&gt;&lt;/a&gt; che funzionava solo in vecchie versioni di IE e Safari MDN raccomanda di passare a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/origin"&gt;&lt;code&gt;self.origin&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proprietà che ridefiniscono le funzione di accesso (ed il contrario) è un Errore
&lt;/h3&gt;

&lt;p&gt;Precedentemente, era un errore solo quando una proprietà ridefiniva una funzione di accesso o il contrario, quando veniva usato &lt;code&gt;useDefineForClassFields&lt;/code&gt;; ora invece TypeScript genererà sempre un errore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Base {
    get foo() {
        return 100;
    }
    set foo() {
        // ...
    }
}

class Derived extends Base {
    foo = 10;
// ~~~
// errore!
// 'foo' è definito come una funzione di accesso nella classe 'Base',
// ma è ridefinito nella classe 'Derived' come proprietà.
}

class Base {
    prop = 10;
}

class Derived extends Base {
    get prop() {
    // ~~~~
    // errore!
    // 'prop' è definito come una proprietà nella Classe 'Base',
    // ma è ridefinito in 'Derived' come una funziona di accesso.
        return 100;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Gli operandi per &lt;code&gt;delete&lt;/code&gt; devono essere facoltativi.
&lt;/h3&gt;

&lt;p&gt;Quando si usa l'operatore &lt;code&gt;delete&lt;/code&gt; in &lt;code&gt;strictNullChecks&lt;/code&gt;, l'operando deve ora essere &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;, &lt;code&gt;never&lt;/code&gt;, o essere facoltativo (ovvero contenere il tipo &lt;code&gt;undefined&lt;/code&gt;). Altrimenti l'uso dell'operatore &lt;code&gt;delete&lt;/code&gt; è un errore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Cosa {
    prop: string;
}

function f(x: Cosa) {
    delete x.prop;
    // ~~~~~~
    // errore! L'operatando dell'operatore 'delete' deve essere facoltativo.
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  L'uso del Node Factory di TypeScript è deprecato
&lt;/h3&gt;

&lt;p&gt;Attualmente TypeScript fornisce una gruppo di funzioni “factory” per produrre AST Nodes; ma ora TypeScript 4.0 offre una nuova node factory API. Di conseguenza con TypeScript 4.0 abbiamo preso la decisione di deprecare le vecchie funzioni in favore delle nuove.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-0-rc/"&gt;La versione originale di questo annuncio è disponibile sul sito Microsoft&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
    </item>
  </channel>
</rss>
