diff --git a/src/content/learn/escape-hatches.md b/src/content/learn/escape-hatches.md index cbaef8bb3..2907d90e5 100644 --- a/src/content/learn/escape-hatches.md +++ b/src/content/learn/escape-hatches.md @@ -1,35 +1,42 @@ --- -title: Escape Hatches +title: Soluzioni alternative +translationStatus: ai-draft --- + + +Questa pagina è stata tradotta automaticamente e supervisionata da un maintainer. Un'ulteriore revisione da parte della community sarebbe comunque utile. [Migliora questa traduzione](https://github.com/reactjs/it.react.dev/edit/main/src/content/learn/escape-hatches.md). + + + -Some of your components may need to control and synchronize with systems outside of React. For example, you might need to focus an input using the browser API, play and pause a video player implemented without React, or connect and listen to messages from a remote server. In this chapter, you'll learn the escape hatches that let you "step outside" React and connect to external systems. Most of your application logic and data flow should not rely on these features. +Alcuni dei tuoi componenti potrebbero dover controllare e sincronizzarsi con sistemi esterni a React. Per esempio, potresti dover mettere a fuoco un input usando le API del browser, avviare e mettere in pausa un lettore video implementato senza React, o connetterti e ascoltare messaggi da un server remoto. In questo capitolo imparerai le soluzioni alternative (*escape hatch*) che ti permettono di "uscire" da React e connetterti a sistemi esterni. La maggior parte della logica della tua applicazione e del flusso di dati non dovrebbe basarsi su queste funzionalità. -* [How to "remember" information without re-rendering](/learn/referencing-values-with-refs) -* [How to access DOM elements managed by React](/learn/manipulating-the-dom-with-refs) -* [How to synchronize components with external systems](/learn/synchronizing-with-effects) -* [How to remove unnecessary Effects from your components](/learn/you-might-not-need-an-effect) -* [How an Effect's lifecycle is different from a component's](/learn/lifecycle-of-reactive-effects) -* [How to prevent some values from re-triggering Effects](/learn/separating-events-from-effects) -* [How to make your Effect re-run less often](/learn/removing-effect-dependencies) -* [How to share logic between components](/learn/reusing-logic-with-custom-hooks) +* [Come "ricordare" informazioni senza ri-renderizzare](/learn/referencing-values-with-refs) +* [Come accedere agli elementi DOM gestiti da React](/learn/manipulating-the-dom-with-refs) +* [Come sincronizzare i componenti con sistemi esterni](/learn/synchronizing-with-effects) +* [Come rimuovere Effetti non necessari dai tuoi componenti](/learn/you-might-not-need-an-effect) +* [In che modo il ciclo di vita di un Effetto è diverso da quello di un componente](/learn/lifecycle-of-reactive-effects) +* [Come impedire che alcuni valori riattivino gli Effetti](/learn/separating-events-from-effects) +* [Come far rieseguire un Effetto meno spesso](/learn/removing-effect-dependencies) +* [Come condividere logica tra componenti](/learn/reusing-logic-with-custom-hooks) -## Referencing values with refs {/*referencing-values-with-refs*/} +## Referenziare valori con i ref {/*referencing-values-with-refs*/} -When you want a component to "remember" some information, but you don't want that information to [trigger new renders](/learn/render-and-commit), you can use a *ref*: +Quando vuoi che un componente "ricordi" un'informazione, ma non vuoi che quell'informazione [avvii nuove renderizzazioni](/learn/render-and-commit), puoi usare un *ref*: ```js const ref = useRef(0); ``` -Like state, refs are retained by React between re-renders. However, setting state re-renders a component. Changing a ref does not! You can access the current value of that ref through the `ref.current` property. +Come lo state, i ref vengono conservati da React tra le ri-renderizzazioni. Tuttavia, impostare lo state ri-renderizza un componente. Modificare un ref no! Puoi accedere al valore corrente di quel ref tramite la proprietà `ref.current`. @@ -54,17 +61,17 @@ export default function Counter() { -A ref is like a secret pocket of your component that React doesn't track. For example, you can use refs to store [timeout IDs](https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#return_value), [DOM elements](https://developer.mozilla.org/en-US/docs/Web/API/Element), and other objects that don't impact the component's rendering output. +Un ref è come una tasca segreta del tuo componente che React non traccia. Per esempio, puoi usare i ref per memorizzare [ID di timeout](https://developer.mozilla.org/it/docs/Web/API/setTimeout#return_value), [elementi DOM](https://developer.mozilla.org/it/docs/Web/API/Element) e altri oggetti che non influenzano l'output di renderizzazione del componente. -Read **[Referencing Values with Refs](/learn/referencing-values-with-refs)** to learn how to use refs to remember information. +Leggi **[Referenziare valori con i ref](/learn/referencing-values-with-refs)** per imparare a usare i ref per ricordare informazioni. -## Manipulating the DOM with refs {/*manipulating-the-dom-with-refs*/} +## Manipolare il DOM con i ref {/*manipulating-the-dom-with-refs*/} -React automatically updates the DOM to match your render output, so your components won't often need to manipulate it. However, sometimes you might need access to the DOM elements managed by React—for example, to focus a node, scroll to it, or measure its size and position. There is no built-in way to do those things in React, so you will need a ref to the DOM node. For example, clicking the button will focus the input using a ref: +React aggiorna automaticamente il DOM per corrispondere al tuo output di renderizzazione, quindi i tuoi componenti non dovranno spesso manipolarlo. Tuttavia, a volte potresti aver bisogno di accedere agli elementi DOM gestiti da React — per esempio, per mettere a fuoco un nodo, scorrere fino ad esso o misurarne dimensioni e posizione. Non c'è un modo integrato in React per fare queste cose, quindi avrai bisogno di un ref al nodo DOM. Per esempio, cliccando il pulsante metterà a fuoco l'input usando un ref: @@ -93,15 +100,15 @@ export default function Form() { -Read **[Manipulating the DOM with Refs](/learn/manipulating-the-dom-with-refs)** to learn how to access DOM elements managed by React. +Leggi **[Manipolare il DOM con i ref](/learn/manipulating-the-dom-with-refs)** per imparare ad accedere agli elementi DOM gestiti da React. -## Synchronizing with Effects {/*synchronizing-with-effects*/} +## Sincronizzare con gli Effetti {/*synchronizing-with-effects*/} -Some components need to synchronize with external systems. For example, you might want to control a non-React component based on the React state, set up a server connection, or send an analytics log when a component appears on the screen. Unlike event handlers, which let you handle particular events, *Effects* let you run some code after rendering. Use them to synchronize your component with a system outside of React. +Alcuni componenti devono sincronizzarsi con sistemi esterni. Per esempio, potresti voler controllare un componente non-React in base allo state di React, impostare una connessione al server o inviare un log di analytics quando un componente appare sullo schermo. A differenza dei gestori di eventi, che ti permettono di gestire eventi particolari, gli *Effetti* ti permettono di eseguire del codice dopo la renderizzazione. Usali per sincronizzare il tuo componente con un sistema esterno a React. -Press Play/Pause a few times and see how the video player stays synchronized to the `isPlaying` prop value: +Premi Play/Pause qualche volta e osserva come il lettore video resta sincronizzato con il valore della prop `isPlaying`: @@ -145,7 +152,7 @@ video { width: 250px; } -Many Effects also "clean up" after themselves. For example, an Effect that sets up a connection to a chat server should return a *cleanup function* that tells React how to disconnect your component from that server: +Molti Effetti si "ripuliscono" anche da soli. Per esempio, un Effetto che imposta una connessione a un server di chat dovrebbe restituire una *funzione di cleanup* che dice a React come disconnettere il tuo componente da quel server: @@ -183,23 +190,23 @@ input { display: block; margin-bottom: 20px; } -In development, React will immediately run and clean up your Effect one extra time. This is why you see `"✅ Connecting..."` printed twice. This ensures that you don't forget to implement the cleanup function. +In sviluppo, React eseguirà e ripulirà immediatamente il tuo Effetto un'ulteriore volta. Ecco perché vedi `"✅ Connecting..."` stampato due volte. Questo garantisce che non dimentichi di implementare la funzione di cleanup. -Read **[Synchronizing with Effects](/learn/synchronizing-with-effects)** to learn how to synchronize components with external systems. +Leggi **[Sincronizzare con gli Effetti](/learn/synchronizing-with-effects)** per imparare a sincronizzare i componenti con sistemi esterni. -## You Might Not Need An Effect {/*you-might-not-need-an-effect*/} +## Potresti non avere bisogno di un Effetto {/*you-might-not-need-an-effect*/} -Effects are an escape hatch from the React paradigm. They let you "step outside" of React and synchronize your components with some external system. If there is no external system involved (for example, if you want to update a component's state when some props or state change), you shouldn't need an Effect. Removing unnecessary Effects will make your code easier to follow, faster to run, and less error-prone. +Gli Effetti sono una soluzione alternativa (*escape hatch*) dal paradigma di React. Ti permettono di "uscire" da React e sincronizzare i tuoi componenti con un sistema esterno. Se non c'è un sistema esterno coinvolto (per esempio, se vuoi aggiornare lo state di un componente quando cambiano alcune props o lo state), non dovresti aver bisogno di un Effetto. Rimuovere Effetti non necessari renderà il tuo codice più facile da seguire, più veloce da eseguire e meno soggetto a errori. -There are two common cases in which you don't need Effects: -- **You don't need Effects to transform data for rendering.** -- **You don't need Effects to handle user events.** +Ci sono due casi comuni in cui non hai bisogno degli Effetti: +- **Non hai bisogno degli Effetti per trasformare dati per la renderizzazione.** +- **Non hai bisogno degli Effetti per gestire eventi dell'utente.** -For example, you don't need an Effect to adjust some state based on other state: +Per esempio, non hai bisogno di un Effetto per regolare dello state in base ad altro state: ```js {expectedErrors: {'react-compiler': [8]}} {5-9} function Form() { @@ -215,7 +222,7 @@ function Form() { } ``` -Instead, calculate as much as you can while rendering: +Invece, calcola il più possibile durante la renderizzazione: ```js {4-5} function Form() { @@ -227,19 +234,19 @@ function Form() { } ``` -However, you *do* need Effects to synchronize with external systems. +Tuttavia, *hai* bisogno degli Effetti per sincronizzarti con sistemi esterni. -Read **[You Might Not Need an Effect](/learn/you-might-not-need-an-effect)** to learn how to remove unnecessary Effects. +Leggi **[Potresti non avere bisogno di un Effetto](/learn/you-might-not-need-an-effect)** per imparare a rimuovere Effetti non necessari. -## Lifecycle of reactive effects {/*lifecycle-of-reactive-effects*/} +## Ciclo di vita degli Effetti reattivi {/*lifecycle-of-reactive-effects*/} -Effects have a different lifecycle from components. Components may mount, update, or unmount. An Effect can only do two things: to start synchronizing something, and later to stop synchronizing it. This cycle can happen multiple times if your Effect depends on props and state that change over time. +Gli Effetti hanno un ciclo di vita diverso dai componenti. I componenti possono montare, aggiornarsi o smontarsi. Un Effetto può fare solo due cose: avviare la sincronizzazione di qualcosa e, in seguito, fermarla. Questo ciclo può ripetersi più volte se il tuo Effetto dipende da props e state che cambiano nel tempo. -This Effect depends on the value of the `roomId` prop. Props are *reactive values,* which means they can change on a re-render. Notice that the Effect *re-synchronizes* (and re-connects to the server) if `roomId` changes: +Questo Effetto dipende dal valore della prop `roomId`. Le props sono *valori reattivi,* il che significa che possono cambiare a ogni ri-renderizzazione. Nota che l'Effetto si *re-sincronizza* (e si riconnette al server) se `roomId` cambia: @@ -302,19 +309,19 @@ button { margin-left: 10px; } -React provides a linter rule to check that you've specified your Effect's dependencies correctly. If you forget to specify `roomId` in the list of dependencies in the above example, the linter will find that bug automatically. +React fornisce una regola del linter per verificare che tu abbia specificato correttamente le dipendenze del tuo Effetto. Se dimentichi di specificare `roomId` nell'elenco delle dipendenze nell'esempio sopra, il linter troverà automaticamente quel bug. -Read **[Lifecycle of Reactive Events](/learn/lifecycle-of-reactive-effects)** to learn how an Effect's lifecycle is different from a component's. +Leggi **[Ciclo di vita degli Effetti reattivi](/learn/lifecycle-of-reactive-effects)** per imparare in che modo il ciclo di vita di un Effetto è diverso da quello di un componente. -## Separating events from Effects {/*separating-events-from-effects*/} +## Separare eventi ed Effetti {/*separating-events-from-effects*/} -Event handlers only re-run when you perform the same interaction again. Unlike event handlers, Effects re-synchronize if any of the values they read, like props or state, are different than during last render. Sometimes, you want a mix of both behaviors: an Effect that re-runs in response to some values but not others. +I gestori di eventi vengono rieseguiti solo quando ripeti la stessa interazione. A differenza dei gestori di eventi, gli Effetti si re-sincronizzano se un valore che leggono, come una prop o una variabile di state, è diverso rispetto all'ultima renderizzazione. A volte vuoi un mix di entrambi i comportamenti: un Effetto che si riesegue in risposta ad alcuni valori ma non ad altri. -All code inside Effects is *reactive.* It will run again if some reactive value it reads has changed due to a re-render. For example, this Effect will re-connect to the chat if either `roomId` or `theme` have changed: +Tutto il codice all'interno degli Effetti è *reattivo.* Verrà eseguito di nuovo se un valore reattivo che legge è cambiato a causa di una ri-renderizzazione. Per esempio, questo Effetto si riconnetterà alla chat se `roomId` o `theme` sono cambiati: @@ -442,7 +449,7 @@ label { display: block; margin-top: 10px; } -This is not ideal. You want to re-connect to the chat only if the `roomId` has changed. Switching the `theme` shouldn't re-connect to the chat! Move the code reading `theme` out of your Effect into an *Effect Event*: +Non è ideale. Vuoi riconnetterti alla chat solo se `roomId` è cambiato. Cambiare il `theme` non dovrebbe riconnetterti alla chat! Sposta il codice che legge `theme` fuori dal tuo Effetto in un *Effect Event*: @@ -575,19 +582,19 @@ label { display: block; margin-top: 10px; } -Code inside Effect Events isn't reactive, so changing the `theme` no longer makes your Effect re-connect. +Il codice all'interno degli Effect Event non è reattivo, quindi cambiare il `theme` non fa più riconnettere il tuo Effetto. -Read **[Separating Events from Effects](/learn/separating-events-from-effects)** to learn how to prevent some values from re-triggering Effects. +Leggi **[Separare eventi ed Effetti](/learn/separating-events-from-effects)** per imparare a impedire che alcuni valori riattivino gli Effetti. -## Removing Effect dependencies {/*removing-effect-dependencies*/} +## Rimuovere le dipendenze degli Effetti {/*removing-effect-dependencies*/} -When you write an Effect, the linter will verify that you've included every reactive value (like props and state) that the Effect reads in the list of your Effect's dependencies. This ensures that your Effect remains synchronized with the latest props and state of your component. Unnecessary dependencies may cause your Effect to run too often, or even create an infinite loop. The way you remove them depends on the case. +Quando scrivi un Effetto, il linter verifica che tu abbia incluso ogni valore reattivo (come props e state) che l'Effetto legge nell'elenco delle dipendenze del tuo Effetto. Questo garantisce che il tuo Effetto resti sincronizzato con le props e lo state più recenti del tuo componente. Dipendenze non necessarie possono far eseguire il tuo Effetto troppo spesso, o persino creare un loop infinito. Il modo in cui le rimuovi dipende dal caso. -For example, this Effect depends on the `options` object which gets re-created every time you edit the input: +Per esempio, questo Effetto dipende dall'oggetto `options` che viene ricreato ogni volta che modifichi l'input: @@ -662,7 +669,7 @@ button { margin-left: 10px; } -You don't want the chat to re-connect every time you start typing a message in that chat. To fix this problem, move creation of the `options` object inside the Effect so that the Effect only depends on the `roomId` string: +Non vuoi che la chat si riconnetta ogni volta che inizi a digitare un messaggio in quella chat. Per risolvere questo problema, sposta la creazione dell'oggetto `options` all'interno dell'Effetto in modo che l'Effetto dipenda solo dalla stringa `roomId`: @@ -736,19 +743,19 @@ button { margin-left: 10px; } -Notice that you didn't start by editing the dependency list to remove the `options` dependency. That would be wrong. Instead, you changed the surrounding code so that the dependency became *unnecessary.* Think of the dependency list as a list of all the reactive values used by your Effect's code. You don't intentionally choose what to put on that list. The list describes your code. To change the dependency list, change the code. +Nota che non hai iniziato modificando l'elenco delle dipendenze per rimuovere la dipendenza `options`. Sarebbe sbagliato. Invece, hai cambiato il codice circostante in modo che la dipendenza diventasse *non necessaria.* Pensa all'elenco delle dipendenze come a un elenco di tutti i valori reattivi usati dal codice del tuo Effetto. Non scegli intenzionalmente cosa mettere in quell'elenco. L'elenco descrive il tuo codice. Per cambiare l'elenco delle dipendenze, cambia il codice. -Read **[Removing Effect Dependencies](/learn/removing-effect-dependencies)** to learn how to make your Effect re-run less often. +Leggi **[Rimuovere le dipendenze degli Effetti](/learn/removing-effect-dependencies)** per imparare a far rieseguire un Effetto meno spesso. -## Reusing logic with custom Hooks {/*reusing-logic-with-custom-hooks*/} +## Riutilizzare logica con Custom Hook {/*reusing-logic-with-custom-hooks*/} -React comes with built-in Hooks like `useState`, `useContext`, and `useEffect`. Sometimes, you’ll wish that there was a Hook for some more specific purpose: for example, to fetch data, to keep track of whether the user is online, or to connect to a chat room. To do this, you can create your own Hooks for your application's needs. +React include diversi Hook integrati come `useState`, `useContext` e `useEffect`. A volte vorresti che esistesse un Hook per uno scopo più specifico: ad esempio, per recuperare dati, per tenere traccia se l'utente è online o per connettersi a una chat room. Per farlo, puoi creare i tuoi Hook per le esigenze della tua applicazione. -In this example, the `usePointerPosition` custom Hook tracks the cursor position, while `useDelayedValue` custom Hook returns a value that's "lagging behind" the value you passed by a certain number of milliseconds. Move the cursor over the sandbox preview area to see a moving trail of dots following the cursor: +In questo esempio, il custom Hook `usePointerPosition` tiene traccia della posizione del cursore, mentre il custom Hook `useDelayedValue` restituisce un valore che "resta indietro" rispetto al valore che hai passato di un certo numero di millisecondi. Muovi il cursore sull'area di anteprima della sandbox per vedere una scia di punti che segue il cursore: @@ -829,14 +836,14 @@ body { min-height: 300px; } -You can create custom Hooks, compose them together, pass data between them, and reuse them between components. As your app grows, you will write fewer Effects by hand because you'll be able to reuse custom Hooks you already wrote. There are also many excellent custom Hooks maintained by the React community. +Puoi creare custom Hook, comporli insieme, passare dati tra loro e riutilizzarli tra componenti. Man mano che la tua app cresce, scriverai meno Effetti a mano perché potrai riutilizzare i custom Hook che hai già scritto. Ci sono anche molti ottimi custom Hook mantenuti dalla community React. -Read **[Reusing Logic with Custom Hooks](/learn/reusing-logic-with-custom-hooks)** to learn how to share logic between components. +Leggi **[Riutilizzare logica con Custom Hook](/learn/reusing-logic-with-custom-hooks)** per imparare a condividere logica tra componenti. -## What's next? {/*whats-next*/} +## Cosa fare dopo? {/*whats-next*/} -Head over to [Referencing Values with Refs](/learn/referencing-values-with-refs) to start reading this chapter page by page! +Vai su [Referenziare valori con i ref](/learn/referencing-values-with-refs) per iniziare a leggere questo capitolo pagina per pagina! diff --git a/src/content/reference/react/Children.md b/src/content/reference/react/Children.md index 3647b1eed..b0c2b63f9 100644 --- a/src/content/reference/react/Children.md +++ b/src/content/reference/react/Children.md @@ -1,16 +1,23 @@ --- title: Children +translationStatus: ai-draft --- + + +Questa pagina è stata tradotta automaticamente e supervisionata da un maintainer. Un'ulteriore revisione da parte della community sarebbe comunque utile. [Migliora questa traduzione](https://github.com/reactjs/it.react.dev/edit/main/src/content/reference/react/Children.md). + + + -Using `Children` is uncommon and can lead to fragile code. [See common alternatives.](#alternatives) +L'uso di `Children` è poco comune e può portare a codice fragile. [Vedi le alternative comuni.](#alternatives) -`Children` lets you manipulate and transform the JSX you received as the [`children` prop.](/learn/passing-props-to-a-component#passing-jsx-as-children) +`Children` ti permette di manipolare e trasformare il JSX che hai ricevuto come [prop `children`.](/learn/passing-props-to-a-component#passing-jsx-as-children) ```js const mappedChildren = Children.map(children, child => @@ -31,7 +38,7 @@ const mappedChildren = Children.map(children, child => ### `Children.count(children)` {/*children-count*/} -Call `Children.count(children)` to count the number of children in the `children` data structure. +Chiama `Children.count(children)` per contare il numero di children nella struttura dati `children`. ```js src/RowList.js active import { Children } from 'react'; @@ -46,25 +53,25 @@ function RowList({ children }) { } ``` -[See more examples below.](#counting-children) +[Vedi altri esempi sotto.](#counting-children) #### Parameters {/*children-count-parameters*/} -* `children`: The value of the [`children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) received by your component. +* `children`: Il valore della [prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) ricevuto dal tuo componente. #### Returns {/*children-count-returns*/} -The number of nodes inside these `children`. +Il numero di nodi all'interno di questi `children`. #### Caveats {/*children-count-caveats*/} -- Empty nodes (`null`, `undefined`, and Booleans), strings, numbers, and [React elements](/reference/react/createElement) count as individual nodes. Arrays don't count as individual nodes, but their children do. **The traversal does not go deeper than React elements:** they don't get rendered, and their children aren't traversed. [Fragments](/reference/react/Fragment) don't get traversed. +- I nodi vuoti (`null`, `undefined` e valori booleani), le stringhe, i numeri e gli [elementi React](/reference/react/createElement) contano come nodi individuali. Gli array non contano come nodi individuali, ma i loro children sì. **L'attraversamento non va più a fondo degli elementi React:** non vengono renderizzati e i loro children non vengono attraversati. I [Fragment](/reference/react/Fragment) non vengono attraversati. --- ### `Children.forEach(children, fn, thisArg?)` {/*children-foreach*/} -Call `Children.forEach(children, fn, thisArg?)` to run some code for each child in the `children` data structure. +Chiama `Children.forEach(children, fn, thisArg?)` per eseguire del codice per ogni child nella struttura dati `children`. ```js src/RowList.js active import { Children } from 'react'; @@ -78,27 +85,27 @@ function SeparatorList({ children }) { // ... ``` -[See more examples below.](#running-some-code-for-each-child) +[Vedi altri esempi sotto.](#running-some-code-for-each-child) #### Parameters {/*children-foreach-parameters*/} -* `children`: The value of the [`children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) received by your component. -* `fn`: The function you want to run for each child, similar to the [array `forEach` method](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) callback. It will be called with the child as the first argument and its index as the second argument. The index starts at `0` and increments on each call. -* **optional** `thisArg`: The [`this` value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) with which the `fn` function should be called. If omitted, it's `undefined`. +* `children`: Il valore della [prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) ricevuto dal tuo componente. +* `fn`: La funzione che vuoi eseguire per ogni child, simile al callback del [metodo `forEach` degli array](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). Verrà chiamata con il child come primo argomento e il suo indice come secondo argomento. L'indice parte da `0` e si incrementa a ogni chiamata. +* **optional** `thisArg`: Il [valore di `this`](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Operators/this) con cui la funzione `fn` dovrebbe essere chiamata. Se omesso, è `undefined`. #### Returns {/*children-foreach-returns*/} -`Children.forEach` returns `undefined`. +`Children.forEach` restituisce `undefined`. #### Caveats {/*children-foreach-caveats*/} -- Empty nodes (`null`, `undefined`, and Booleans), strings, numbers, and [React elements](/reference/react/createElement) count as individual nodes. Arrays don't count as individual nodes, but their children do. **The traversal does not go deeper than React elements:** they don't get rendered, and their children aren't traversed. [Fragments](/reference/react/Fragment) don't get traversed. +- I nodi vuoti (`null`, `undefined` e valori booleani), le stringhe, i numeri e gli [elementi React](/reference/react/createElement) contano come nodi individuali. Gli array non contano come nodi individuali, ma i loro children sì. **L'attraversamento non va più a fondo degli elementi React:** non vengono renderizzati e i loro children non vengono attraversati. I [Fragment](/reference/react/Fragment) non vengono attraversati. --- ### `Children.map(children, fn, thisArg?)` {/*children-map*/} -Call `Children.map(children, fn, thisArg?)` to map or transform each child in the `children` data structure. +Chiama `Children.map(children, fn, thisArg?)` per mappare o trasformare ogni child nella struttura dati `children`. ```js src/RowList.js active import { Children } from 'react'; @@ -116,32 +123,32 @@ function RowList({ children }) { } ``` -[See more examples below.](#transforming-children) +[Vedi altri esempi sotto.](#transforming-children) #### Parameters {/*children-map-parameters*/} -* `children`: The value of the [`children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) received by your component. -* `fn`: The mapping function, similar to the [array `map` method](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) callback. It will be called with the child as the first argument and its index as the second argument. The index starts at `0` and increments on each call. You need to return a React node from this function. This may be an empty node (`null`, `undefined`, or a Boolean), a string, a number, a React element, or an array of other React nodes. -* **optional** `thisArg`: The [`this` value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) with which the `fn` function should be called. If omitted, it's `undefined`. +* `children`: Il valore della [prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) ricevuto dal tuo componente. +* `fn`: La funzione di mapping, simile al callback del [metodo `map` degli array](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/map). Verrà chiamata con il child come primo argomento e il suo indice come secondo argomento. L'indice parte da `0` e si incrementa a ogni chiamata. Devi restituire un nodo React da questa funzione. Può essere un nodo vuoto (`null`, `undefined` o un valore booleano), una stringa, un numero, un elemento React o un array di altri nodi React. +* **optional** `thisArg`: Il [valore di `this`](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Operators/this) con cui la funzione `fn` dovrebbe essere chiamata. Se omesso, è `undefined`. #### Returns {/*children-map-returns*/} -If `children` is `null` or `undefined`, returns the same value. +Se `children` è `null` o `undefined`, restituisce lo stesso valore. -Otherwise, returns a flat array consisting of the nodes you've returned from the `fn` function. The returned array will contain all nodes you returned except for `null` and `undefined`. +Altrimenti, restituisce un array piatto composto dai nodi che hai restituito dalla funzione `fn`. L'array restituito conterrà tutti i nodi che hai restituito, tranne `null` e `undefined`. #### Caveats {/*children-map-caveats*/} -- Empty nodes (`null`, `undefined`, and Booleans), strings, numbers, and [React elements](/reference/react/createElement) count as individual nodes. Arrays don't count as individual nodes, but their children do. **The traversal does not go deeper than React elements:** they don't get rendered, and their children aren't traversed. [Fragments](/reference/react/Fragment) don't get traversed. +- I nodi vuoti (`null`, `undefined` e valori booleani), le stringhe, i numeri e gli [elementi React](/reference/react/createElement) contano come nodi individuali. Gli array non contano come nodi individuali, ma i loro children sì. **L'attraversamento non va più a fondo degli elementi React:** non vengono renderizzati e i loro children non vengono attraversati. I [Fragment](/reference/react/Fragment) non vengono attraversati. -- If you return an element or an array of elements with keys from `fn`, **the returned elements' keys will be automatically combined with the key of the corresponding original item from `children`.** When you return multiple elements from `fn` in an array, their keys only need to be unique locally amongst each other. +- Se restituisci un elemento o un array di elementi con key da `fn`, **le key degli elementi restituiti verranno combinate automaticamente con la key dell'elemento originale corrispondente da `children`.** Quando restituisci più elementi da `fn` in un array, le loro key devono essere uniche solo localmente tra loro. --- ### `Children.only(children)` {/*children-only*/} -Call `Children.only(children)` to assert that `children` represent a single React element. +Chiama `Children.only(children)` per verificare che `children` rappresenti un singolo elemento React. ```js function Box({ children }) { @@ -151,23 +158,23 @@ function Box({ children }) { #### Parameters {/*children-only-parameters*/} -* `children`: The value of the [`children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) received by your component. +* `children`: Il valore della [prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) ricevuto dal tuo componente. #### Returns {/*children-only-returns*/} -If `children` [is a valid element,](/reference/react/isValidElement) returns that element. +Se `children` [è un elemento valido,](/reference/react/isValidElement) restituisce quell'elemento. -Otherwise, throws an error. +Altrimenti, lancia un errore. #### Caveats {/*children-only-caveats*/} -- This method always **throws if you pass an array (such as the return value of `Children.map`) as `children`.** In other words, it enforces that `children` is a single React element, not that it's an array with a single element. +- Questo metodo **lancia sempre un errore se passi un array (come il valore restituito da `Children.map`) come `children`.** In altre parole, impone che `children` sia un singolo elemento React, non che sia un array con un singolo elemento. --- ### `Children.toArray(children)` {/*children-toarray*/} -Call `Children.toArray(children)` to create an array out of the `children` data structure. +Chiama `Children.toArray(children)` per creare un array dalla struttura dati `children`. ```js src/ReversedList.js active import { Children } from 'react'; @@ -180,23 +187,23 @@ export default function ReversedList({ children }) { #### Parameters {/*children-toarray-parameters*/} -* `children`: The value of the [`children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) received by your component. +* `children`: Il valore della [prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) ricevuto dal tuo componente. #### Returns {/*children-toarray-returns*/} -Returns a flat array of elements in `children`. +Restituisce un array piatto di elementi in `children`. #### Caveats {/*children-toarray-caveats*/} -- Empty nodes (`null`, `undefined`, and Booleans) will be omitted in the returned array. **The returned elements' keys will be calculated from the original elements' keys and their level of nesting and position.** This ensures that flattening the array does not introduce changes in behavior. +- I nodi vuoti (`null`, `undefined` e valori booleani) verranno omessi nell'array restituito. **Le key degli elementi restituiti verranno calcolate dalle key degli elementi originali e dal loro livello di annidamento e posizione.** Questo garantisce che l'appiattimento dell'array non introduca cambiamenti nel comportamento. --- ## Usage {/*usage*/} -### Transforming children {/*transforming-children*/} +### Trasformare i children {/*transforming-children*/} -To transform the children JSX that your component [receives as the `children` prop,](/learn/passing-props-to-a-component#passing-jsx-as-children) call `Children.map`: +Per trasformare il JSX dei children che il tuo componente [riceve come prop `children`,](/learn/passing-props-to-a-component#passing-jsx-as-children) chiama `Children.map`: ```js {6,10} import { Children } from 'react'; @@ -214,7 +221,7 @@ function RowList({ children }) { } ``` -In the example above, the `RowList` wraps every child it receives into a `
` container. For example, let's say the parent component passes three `

` tags as the `children` prop to `RowList`: +Nell'esempio sopra, `RowList` avvolge ogni child che riceve in un contenitore `

`. Ad esempio, supponiamo che il componente genitore passi tre tag `

` come prop `children` a `RowList`: ```js @@ -224,7 +231,7 @@ In the example above, the `RowList` wraps every child it receives into a `

``` -Then, with the `RowList` implementation above, the final rendered result will look like this: +Poi, con l'implementazione di `RowList` sopra, il risultato finale renderizzato sarà simile a questo: ```js
@@ -240,7 +247,7 @@ Then, with the `RowList` implementation above, the final rendered result will lo
``` -`Children.map` is similar to [to transforming arrays with `map()`.](/learn/rendering-lists) The difference is that the `children` data structure is considered *opaque.* This means that even if it's sometimes an array, you should not assume it's an array or any other particular data type. This is why you should use `Children.map` if you need to transform it. +`Children.map` è simile a [trasformare array con `map()`.](/learn/rendering-lists) La differenza è che la struttura dati `children` è considerata *opaca.* Ciò significa che, anche se a volte è un array, non dovresti assumere che lo sia o che abbia un altro tipo di dato particolare. Per questo motivo, se devi trasformarla, dovresti usare `Children.map`. @@ -293,24 +300,24 @@ export default function RowList({ children }) { -#### Why is the children prop not always an array? {/*why-is-the-children-prop-not-always-an-array*/} +#### Perché la prop `children` non è sempre un array? {/*why-is-the-children-prop-not-always-an-array*/} -In React, the `children` prop is considered an *opaque* data structure. This means that you shouldn't rely on how it is structured. To transform, filter, or count children, you should use the `Children` methods. +In React, la prop `children` è considerata una struttura dati *opaca*. Ciò significa che non dovresti fare affidamento su come è strutturata. Per trasformare, filtrare o contare i children, dovresti usare i metodi `Children`. -In practice, the `children` data structure is often represented as an array internally. However, if there is only a single child, then React won't create an extra array since this would lead to unnecessary memory overhead. As long as you use the `Children` methods instead of directly introspecting the `children` prop, your code will not break even if React changes how the data structure is actually implemented. +In pratica, la struttura dati `children` è spesso rappresentata internamente come un array. Tuttavia, se c'è un solo child, React non creerà un array aggiuntivo perché ciò porterebbe a un overhead di memoria non necessario. Finché usi i metodi `Children` invece di ispezionare direttamente la prop `children`, il tuo codice non si romperà anche se React cambia il modo in cui la struttura dati è effettivamente implementata. -Even when `children` is an array, `Children.map` has useful special behavior. For example, `Children.map` combines the [keys](/learn/rendering-lists#keeping-list-items-in-order-with-key) on the returned elements with the keys on the `children` you've passed to it. This ensures the original JSX children don't "lose" keys even if they get wrapped like in the example above. +Anche quando `children` è un array, `Children.map` ha un comportamento speciale utile. Ad esempio, `Children.map` combina le [key](/learn/rendering-lists#keeping-list-items-in-order-with-key) sugli elementi restituiti con le key sui `children` che gli hai passato. Questo garantisce che i children JSX originali non "perdano" le key anche se vengono avvolti come nell'esempio sopra. -The `children` data structure **does not include rendered output** of the components you pass as JSX. In the example below, the `children` received by the `RowList` only contains two items rather than three: +La struttura dati `children` **non include l'output renderizzato** dei componenti che passi come JSX. Nell'esempio sotto, i `children` ricevuti da `RowList` contengono solo due elementi anziché tre: 1. `

This is the first item.

` 2. `` -This is why only two row wrappers are generated in this example: +Per questo motivo in questo esempio vengono generati solo due wrapper di riga: @@ -369,15 +376,15 @@ export default function RowList({ children }) { -**There is no way to get the rendered output of an inner component** like `` when manipulating `children`. This is why [it's usually better to use one of the alternative solutions.](#alternatives) +**Non c'è modo di ottenere l'output renderizzato di un componente interno** come `` quando manipoli `children`. Per questo motivo [di solito è meglio usare una delle soluzioni alternative.](#alternatives)
--- -### Running some code for each child {/*running-some-code-for-each-child*/} +### Eseguire del codice per ogni child {/*running-some-code-for-each-child*/} -Call `Children.forEach` to iterate over each child in the `children` data structure. It does not return any value and is similar to the [array `forEach` method.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) You can use it to run custom logic like constructing your own array. +Chiama `Children.forEach` per iterare su ogni child nella struttura dati `children`. Non restituisce alcun valore ed è simile al [metodo `forEach` degli array.](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) Puoi usarlo per eseguire logica personalizzata, come costruire il tuo array. @@ -413,15 +420,15 @@ export default function SeparatorList({ children }) { -As mentioned earlier, there is no way to get the rendered output of an inner component when manipulating `children`. This is why [it's usually better to use one of the alternative solutions.](#alternatives) +Come accennato in precedenza, non c'è modo di ottenere l'output renderizzato di un componente interno quando manipoli `children`. Per questo motivo [di solito è meglio usare una delle soluzioni alternative.](#alternatives) --- -### Counting children {/*counting-children*/} +### Contare i children {/*counting-children*/} -Call `Children.count(children)` to calculate the number of children. +Chiama `Children.count(children)` per calcolare il numero di children. @@ -484,15 +491,15 @@ export default function RowList({ children }) { -As mentioned earlier, there is no way to get the rendered output of an inner component when manipulating `children`. This is why [it's usually better to use one of the alternative solutions.](#alternatives) +Come accennato in precedenza, non c'è modo di ottenere l'output renderizzato di un componente interno quando manipoli `children`. Per questo motivo [di solito è meglio usare una delle soluzioni alternative.](#alternatives) --- -### Converting children to an array {/*converting-children-to-an-array*/} +### Convertire i children in un array {/*converting-children-to-an-array*/} -Call `Children.toArray(children)` to turn the `children` data structure into a regular JavaScript array. This lets you manipulate the array with built-in array methods like [`filter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), [`sort`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort), or [`reverse`.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse) +Chiama `Children.toArray(children)` per trasformare la struttura dati `children` in un normale array JavaScript. Questo ti permette di manipolare l'array con i metodi array integrati come [`filter`](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), [`sort`](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) o [`reverse`.](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse) @@ -524,7 +531,7 @@ export default function ReversedList({ children }) { -As mentioned earlier, there is no way to get the rendered output of an inner component when manipulating `children`. This is why [it's usually better to use one of the alternative solutions.](#alternatives) +Come accennato in precedenza, non c'è modo di ottenere l'output renderizzato di un componente interno quando manipoli `children`. Per questo motivo [di solito è meglio usare una delle soluzioni alternative.](#alternatives) @@ -534,21 +541,21 @@ As mentioned earlier, there is no way to get the rendered output of an inner com -This section describes alternatives to the `Children` API (with capital `C`) that's imported like this: +Questa sezione descrive alternative all'API `Children` (con la `C` maiuscola) che si importa così: ```js import { Children } from 'react'; ``` -Don't confuse it with [using the `children` prop](/learn/passing-props-to-a-component#passing-jsx-as-children) (lowercase `c`), which is good and encouraged. +Non confonderla con [l'uso della prop `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) (con la `c` minuscola), che è buona pratica ed è incoraggiato. -### Exposing multiple components {/*exposing-multiple-components*/} +### Esporre più componenti {/*exposing-multiple-components*/} -Manipulating children with the `Children` methods often leads to fragile code. When you pass children to a component in JSX, you don't usually expect the component to manipulate or transform the individual children. +Manipolare i children con i metodi `Children` spesso porta a codice fragile. Quando passi children a un componente in JSX, di solito non ti aspetti che il componente manipoli o trasformi i singoli children. -When you can, try to avoid using the `Children` methods. For example, if you want every child of `RowList` to be wrapped in `
`, export a `Row` component, and manually wrap every row into it like this: +Quando puoi, cerca di evitare l'uso dei metodi `Children`. Ad esempio, se vuoi che ogni child di `RowList` sia avvolto in `
`, esporta un componente `Row` e avvolgi manualmente ogni riga così: @@ -607,7 +614,7 @@ export function Row({ children }) { -Unlike using `Children.map`, this approach does not wrap every child automatically. **However, this approach has a significant benefit compared to the [earlier example with `Children.map`](#transforming-children) because it works even if you keep extracting more components.** For example, it still works if you extract your own `MoreRows` component: +A differenza dell'uso di `Children.map`, questo approccio non avvolge automaticamente ogni child. **Tuttavia, questo approccio ha un vantaggio significativo rispetto al [precedente esempio con `Children.map`](#transforming-children) perché funziona anche se continui a estrarre altri componenti.** Ad esempio, funziona ancora se estrai il tuo componente `MoreRows`: @@ -674,13 +681,13 @@ export function Row({ children }) { -This wouldn't work with `Children.map` because it would "see" `` as a single child (and a single row). +Questo non funzionerebbe con `Children.map` perché "vedrebbe" `` come un singolo child (e una singola riga). --- -### Accepting an array of objects as a prop {/*accepting-an-array-of-objects-as-a-prop*/} +### Accettare un array di oggetti come prop {/*accepting-an-array-of-objects-as-a-prop*/} -You can also explicitly pass an array as a prop. For example, this `RowList` accepts a `rows` array as a prop: +Puoi anche passare esplicitamente un array come prop. Ad esempio, questo `RowList` accetta un array `rows` come prop: @@ -729,9 +736,9 @@ export function RowList({ rows }) { -Since `rows` is a regular JavaScript array, the `RowList` component can use built-in array methods like [`map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) on it. +Poiché `rows` è un normale array JavaScript, il componente `RowList` può usare metodi array integrati come [`map`](https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/map) su di esso. -This pattern is especially useful when you want to be able to pass more information as structured data together with children. In the below example, the `TabSwitcher` component receives an array of objects as the `tabs` prop: +Questo pattern è particolarmente utile quando vuoi poter passare più informazioni come dati strutturati insieme ai children. Nell'esempio sotto, il componente `TabSwitcher` riceve un array di oggetti come prop `tabs`: @@ -789,13 +796,13 @@ export default function TabSwitcher({ tabs }) { -Unlike passing the children as JSX, this approach lets you associate some extra data like `header` with each item. Because you are working with the `tabs` directly, and it is an array, you do not need the `Children` methods. +A differenza del passaggio dei children come JSX, questo approccio ti permette di associare alcuni dati extra come `header` a ogni elemento. Poiché lavori direttamente con `tabs`, ed è un array, non hai bisogno dei metodi `Children`. --- -### Calling a render prop to customize rendering {/*calling-a-render-prop-to-customize-rendering*/} +### Chiamare una render prop per personalizzare la renderizzazione {/*calling-a-render-prop-to-customize-rendering*/} -Instead of producing JSX for every single item, you can also pass a function that returns JSX, and call that function when necessary. In this example, the `App` component passes a `renderContent` function to the `TabSwitcher` component. The `TabSwitcher` component calls `renderContent` only for the selected tab: +Invece di produrre JSX per ogni singolo elemento, puoi anche passare una funzione che restituisce JSX e chiamarla quando necessario. In questo esempio, il componente `App` passa una funzione `renderContent` al componente `TabSwitcher`. Il componente `TabSwitcher` chiama `renderContent` solo per la tab selezionata: @@ -844,9 +851,9 @@ export default function TabSwitcher({ tabIds, getHeader, renderContent }) { -A prop like `renderContent` is called a *render prop* because it is a prop that specifies how to render a piece of the user interface. However, there is nothing special about it: it is a regular prop which happens to be a function. +Una prop come `renderContent` si chiama *render prop* perché è una prop che specifica come renderizzare un pezzo dell'interfaccia utente. Tuttavia, non c'è nulla di speciale: è una prop normale che per caso è una funzione. -Render props are functions, so you can pass information to them. For example, this `RowList` component passes the `id` and the `index` of each row to the `renderRow` render prop, which uses `index` to highlight even rows: +Le render props sono funzioni, quindi puoi passare loro informazioni. Ad esempio, questo componente `RowList` passa l'`id` e l'`index` di ogni riga alla render prop `renderRow`, che usa `index` per evidenziare le righe pari: @@ -927,15 +934,15 @@ export function Row({ children, isHighlighted }) { -This is another example of how parent and child components can cooperate without manipulating the children. +Questo è un altro esempio di come componenti genitore e figlio possono cooperare senza manipolare i children. --- ## Troubleshooting {/*troubleshooting*/} -### I pass a custom component, but the `Children` methods don't show its render result {/*i-pass-a-custom-component-but-the-children-methods-dont-show-its-render-result*/} +### Passo un componente personalizzato, ma i metodi `Children` non mostrano il suo risultato di renderizzazione {/*i-pass-a-custom-component-but-the-children-methods-dont-show-its-render-result*/} -Suppose you pass two children to `RowList` like this: +Supponiamo di passare due children a `RowList` così: ```js @@ -944,6 +951,6 @@ Suppose you pass two children to `RowList` like this: ``` -If you do `Children.count(children)` inside `RowList`, you will get `2`. Even if `MoreRows` renders 10 different items, or if it returns `null`, `Children.count(children)` will still be `2`. From the `RowList`'s perspective, it only "sees" the JSX it has received. It does not "see" the internals of the `MoreRows` component. +Se esegui `Children.count(children)` dentro `RowList`, otterrai `2`. Anche se `MoreRows` renderizza 10 elementi diversi, o se restituisce `null`, `Children.count(children)` sarà comunque `2`. Dal punto di vista di `RowList`, "vede" solo il JSX che ha ricevuto. Non "vede" l'interno del componente `MoreRows`. -The limitation makes it hard to extract a component. This is why [alternatives](#alternatives) are preferred to using `Children`. +Questa limitazione rende difficile estrarre un componente. Per questo motivo le [alternative](#alternatives) sono preferite all'uso di `Children`. diff --git a/src/sidebarLearn.json b/src/sidebarLearn.json index 5991ea5a2..30ffe5039 100644 --- a/src/sidebarLearn.json +++ b/src/sidebarLearn.json @@ -199,7 +199,7 @@ ] }, { - "title": "Escape Hatches", + "title": "Soluzioni alternative", "path": "/learn/escape-hatches", "tags": [ "advanced" @@ -218,7 +218,7 @@ "path": "/learn/synchronizing-with-effects" }, { - "title": "You Might Not Need an Effect", + "title": "Potresti non avere bisogno di un Effetto", "path": "/learn/you-might-not-need-an-effect" }, {