dicembre 21, 2025
14 min di lettura

Domande e risposte colloquio Junior React Native Developer

interview
career-advice
job-search
entry-level
Domande e risposte colloquio Junior React Native Developer
Milad Bonakdar

Milad Bonakdar

Autore

Esercitati con domande da colloquio React Native junior su componenti, hook, navigazione, chiamate API, liste, AsyncStorage e basi mobile.


Introduzione

In un colloquio junior React Native ci si aspetta che tu sappia costruire schermate mobile semplici con React, spiegare il rendering nativo, gestire lo stato con gli hook, navigare tra schermate, leggere dati da API e salvare dati locali non sensibili. Una risposta forte è pratica: cosa useresti, quando lo eviteresti e quale trade-off crea su iOS e Android.

Usa questa guida per allenarti sulle domande più probabili per un primo ruolo React Native. Concentrati su fondamentali React, componenti principali, navigazione, form, liste, chiamate API, storage e debugging mobile invece di memorizzare dettagli di librerie.


Fondamenti di React (6 Domande)

1. Cos'è React Native e come differisce da React?

Risposta:

  • React: Libreria JavaScript per la creazione di interfacce utente web
  • React Native: Framework per la creazione di app mobile native utilizzando React
  • Differenze chiave:
    • React Native esegue il rendering su componenti nativi (non DOM)
    • Utilizza API native invece di API web
    • Approccio di styling diverso (nessun CSS, utilizza StyleSheet)
    • Codice specifico per piattaforma per iOS e Android
// React (Web)
import React from 'react';

function App() {
  return <div className="container">Hello Web</div>;
}

// React Native (Mobile)
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

function App() {
  return (
    <View style={styles.container}>
      <Text>Hello Mobile</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Rarità: Molto Comune Difficoltà: Facile


2. Quali sono i componenti principali in React Native?

Risposta: React Native fornisce componenti integrati che mappano gli elementi dell'interfaccia utente nativa:

  • View: Componente contenitore (come div nel web)
  • Text: Visualizza il testo (tutto il testo deve essere nel componente Text)
  • Image: Visualizza immagini
  • ScrollView: Contenitore scorrevole
  • TextInput: Campo di input di testo
  • TouchableOpacity/Pressable: Elementi toccabili
  • FlatList: Rendering efficiente delle liste
  • Button: Componente pulsante di base
import {
  View,
  Text,
  Image,
  TextInput,
  TouchableOpacity,
  StyleSheet,
} from 'react-native';

function MyComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Welcome</Text>
      <Image source={{ uri: 'https://example.com/image.jpg' }} style={styles.image} />
      <TextInput placeholder="Enter name" style={styles.input} />
      <TouchableOpacity style={styles.button} onPress={() => console.log('Pressed')}>
        <Text style={styles.buttonText}>Click Me</Text>
      </TouchableOpacity>
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Facile


3. Spiega la differenza tra View e ScrollView.

Risposta:

  • View: Contenitore statico. Il contenuto oltre i limiti dello schermo non è scorrevole.
  • ScrollView: Contenitore scorrevole. Esegue il rendering di tutti i figli contemporaneamente (può richiedere molta memoria per le liste di grandi dimensioni).
  • Quando usare:
    • View: Per layout che si adattano allo schermo
    • ScrollView: Per piccole quantità di contenuto scorrevole
    • FlatList: Per liste di grandi dimensioni (esegue il rendering solo degli elementi visibili)
// View - non scorrevole
<View style={{ height: 200 }}>
  <Text>Content 1</Text>
  <Text>Content 2</Text>
  {/* Se il contenuto supera i 200px, viene tagliato */}
</View>

// ScrollView - scorrevole
<ScrollView style={{ height: 200 }}>
  <Text>Content 1</Text>
  <Text>Content 2</Text>
  <Text>Content 3</Text>
  {/* Puoi scorrere per vedere tutto il contenuto */}
</ScrollView>

// FlatList - efficiente per liste di grandi dimensioni
<FlatList
  data={items}
  renderItem={({ item }) => <Text>{item.name}</Text>}
  keyExtractor={item => item.id}
/>

Rarità: Molto Comune Difficoltà: Facile


4. Cosa sono gli Hook di React e quali sono quelli più comunemente usati?

Risposta: Gli Hook sono funzioni che ti consentono di utilizzare le funzionalità di stato e ciclo di vita nei componenti funzionali.

  • Hook comuni:
    • useState: Gestisci lo stato del componente
    • useEffect: Gestisci gli effetti collaterali (recupero dati, sottoscrizioni)
    • useContext: Accedi ai valori del contesto
    • useCallback: Memorizza le funzioni
    • useMemo: Memorizza calcoli costosi
    • useRef: Fa riferimento agli elementi DOM o persiste i valori
import React, { useState, useEffect } from 'react';
import { View, Text, Button } from 'react-native';

function Counter() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log(`Count changed to: ${count}`);
    
    // Cleanup function
    return () => {
      console.log('Cleanup');
    };
  }, [count]); // Runs when count changes
  
  return (
    <View>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Facile


5. Spiega l'hook useEffect e il suo array di dipendenze.

Risposta: useEffect esegue effetti collaterali dopo il rendering. L'array di dipendenze controlla quando viene eseguito:

  • Nessun array: Viene eseguito dopo ogni rendering
  • Array vuoto []: Viene eseguito una volta dopo il rendering iniziale
  • Con dipendenze [dep1, dep2]: Viene eseguito quando le dipendenze cambiano
import { useEffect, useState } from 'react';

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  
  // Runs once on mount
  useEffect(() => {
    console.log('Component mounted');
  }, []);
  
  // Runs when userId changes
  useEffect(() => {
    fetchUser(userId).then(data => setUser(data));
  }, [userId]);
  
  // Runs after every render (avoid this)
  useEffect(() => {
    console.log('Rendered');
  });
  
  // Cleanup function
  useEffect(() => {
    const subscription = subscribeToUpdates();
    
    return () => {
      subscription.unsubscribe(); // Cleanup on unmount
    };
  }, []);
  
  return <Text>{user?.name}</Text>;
}

Rarità: Molto Comune Difficoltà: Media


6. Cos'è il DOM virtuale e come lo utilizza React?

Risposta: Il Virtual DOM è un concetto di React per il web: React mantiene un albero UI leggero, lo confronta dopo i cambiamenti di stato e aggiorna solo ciò che è cambiato. In React Native vale la stessa idea di riconciliazione, ma l’output finale sono viste native, non nodi del DOM del browser.

  • Cosa dire al colloquio:
    1. I cambiamenti di stato fanno rieseguire il render dei componenti coinvolti
    2. React confronta il nuovo albero dei componenti con quello precedente
    3. React Native applica gli aggiornamenti necessari ai componenti UI nativi
    4. Si ottimizza comunque con key stabili, stato posizionato bene e memoizzazione solo quando risolve un vero problema di re-render
  • Correzione importante: React Native non aggiorna HTML né il DOM del browser.

Rarità: Comune Difficoltà: Facile


Componenti e Props (4 Domande)

7. Qual è la differenza tra Props e State?

Risposta:

  • Props:
    • Passate dal genitore al figlio
    • Sola lettura (immutabili)
    • Utilizzate per la configurazione del componente
  • State:
    • Gestito all'interno del componente
    • Mutabile (può essere cambiato)
    • Utilizzato per dati dinamici
// Parent component
function ParentComponent() {
  const [count, setCount] = useState(0);
  
  return (
    <ChildComponent 
      title="Counter"  // Props
      count={count}    // Props
      onIncrement={() => setCount(count + 1)}  // Props
    />
  );
}

// Child component
function ChildComponent({ title, count, onIncrement }) {
  // Cannot modify props
  // title = "New Title"; // Error!
  
  return (
    <View>
      <Text>{title}</Text>
      <Text>Count: {count}</Text>
      <Button title="Increment" onPress={onIncrement} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Facile


8. Cosa sono i Componenti Funzionali rispetto ai Componenti Classe?

Risposta:

  • Componenti Funzionali:
    • Sintassi più semplice
    • Utilizzano gli hook per lo stato e il ciclo di vita
    • Preferiti in React moderno
  • Componenti Classe:
    • Approccio più vecchio
    • Utilizzano this.state e i metodi del ciclo di vita
    • Ancora supportati ma meno comuni
// Functional Component (Modern)
function Welcome({ name }) {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log('Mounted');
  }, []);
  
  return <Text>Hello, {name}</Text>;
}

// Class Component (Legacy)
class Welcome extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  
  componentDidMount() {
    console.log('Mounted');
  }
  
  render() {
    return <Text>Hello, {this.props.name}</Text>;
  }
}

Rarità: Comune Difficoltà: Facile


9. Come passi i dati dal componente figlio al componente genitore?

Risposta: Utilizza le funzioni di callback passate come props.

// Parent component
function ParentComponent() {
  const [message, setMessage] = useState('');
  
  const handleMessageFromChild = (msg) => {
    setMessage(msg);
  };
  
  return (
    <View>
      <Text>Message from child: {message}</Text>
      <ChildComponent onSendMessage={handleMessageFromChild} />
    </View>
  );
}

// Child component
function ChildComponent({ onSendMessage }) {
  const [input, setInput] = useState('');
  
  const sendMessage = () => {
    onSendMessage(input); // Chiama la funzione del genitore
  };
  
  return (
    <View>
      <TextInput value={input} onChangeText={setInput} />
      <Button title="Send to Parent" onPress={sendMessage} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Facile


10. Cos'è la prop key e perché è importante?

Risposta: La prop key aiuta React a identificare quali elementi sono stati modificati, aggiunti o rimossi nelle liste.

  • Scopo: Ottimizzare le prestazioni di rendering
  • Requisiti: Deve essere univoca tra i fratelli, stabile (non utilizzare l'indice se la lista può cambiare)
// Good - using unique ID
function UserList({ users }) {
  return (
    <FlatList
      data={users}
      keyExtractor={item => item.id} // Unique key
      renderItem={({ item }) => <Text>{item.name}</Text>}
    />
  );
}

// Bad - using index (avoid if list can change)
function BadList({ items }) {
  return (
    <View>
      {items.map((item, index) => (
        <Text key={index}>{item}</Text> // Don't use index
      ))}
    </View>
  );
}

// Good - using unique property
function GoodList({ items }) {
  return (
    <View>
      {items.map(item => (
        <Text key={item.id}>{item.name}</Text>
      ))}
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Facile


Stili e Layout (3 Domande)

11. Come stili i componenti in React Native?

Risposta: React Native utilizza oggetti JavaScript per lo styling, non CSS.

  • API StyleSheet: Crea stili ottimizzati
  • Stili Inline: Oggetti di stile diretti (meno performanti)
  • Flexbox: Sistema di layout predefinito
import { View, Text, StyleSheet } from 'react-native';

function StyledComponent() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Title</Text>
      <Text style={[styles.text, styles.bold]}>Multiple styles</Text>
      <Text style={{ color: 'red' }}>Inline style</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
    backgroundColor: '#fff',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: '#333',
  },
  text: {
    fontSize: 16,
    color: '#666',
  },
  bold: {
    fontWeight: 'bold',
  },
});

Rarità: Molto Comune Difficoltà: Facile


12. Spiega Flexbox in React Native.

Risposta: Flexbox è il sistema di layout principale in React Native.

  • Proprietà principali:
    • flexDirection: row o column (predefinito: column)
    • justifyContent: Allinea lungo l'asse principale
    • alignItems: Allinea lungo l'asse trasversale
    • flex: Dimensionamento proporzionale
const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row', // Layout orizzontale
    justifyContent: 'space-between', // Spazia gli elementi in modo uniforme
    alignItems: 'center', // Centra verticalmente
  },
  box1: {
    flex: 1, // Prende 1/3 dello spazio
    backgroundColor: 'red',
  },
  box2: {
    flex: 2, // Prende 2/3 dello spazio
    backgroundColor: 'blue',
  },
});

function FlexExample() {
  return (
    <View style={styles.container}>
      <View style={styles.box1} />
      <View style={styles.box2} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Media


13. Qual è la differenza tra margin e padding?

Risposta:

  • Padding: Spazio all'interno del componente (tra contenuto e bordo)
  • Margin: Spazio all'esterno del componente (tra componente e vicini)
const styles = StyleSheet.create({
  box: {
    margin: 20,        // Spazio esterno
    padding: 10,       // Spazio interno
    backgroundColor: 'lightblue',
  },
  // Specific sides
  specificBox: {
    marginTop: 10,
    marginBottom: 20,
    paddingLeft: 15,
    paddingRight: 15,
  },
  // Horizontal and vertical
  shorthand: {
    marginHorizontal: 20,  // left and right
    marginVertical: 10,    // top and bottom
    paddingHorizontal: 15,
    paddingVertical: 5,
  },
});

Rarità: Comune Difficoltà: Facile


14. Cos'è React Navigation e come lo usi?

Risposta: React Navigation è la libreria di navigazione più popolare per React Native.

  • Tipi:
    • Stack Navigator: Stack di schermate (push/pop)
    • Tab Navigator: Tab inferiori
    • Drawer Navigator: Menu a cassetto laterale
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

function HomeScreen({ navigation }) {
  return (
    <View>
      <Text>Home Screen</Text>
      <Button
        title="Go to Details"
        onPress={() => navigation.navigate('Details', { itemId: 42 })}
      />
    </View>
  );
}

function DetailsScreen({ route, navigation }) {
  const { itemId } = route.params;
  
  return (
    <View>
      <Text>Details Screen</Text>
      <Text>Item ID: {itemId}</Text>
      <Button title="Go Back" onPress={() => navigation.goBack()} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Media


15. Come passi i parametri tra le schermate?

Risposta: Utilizza la funzione navigate con un secondo parametro per i dati.

// Navigate with parameters
function HomeScreen({ navigation }) {
  const user = { id: 1, name: 'John', email: '[email protected]' };
  
  return (
    <Button
      title="View Profile"
      onPress={() => navigation.navigate('Profile', { user })}
    />
  );
}

// Receive parameters
function ProfileScreen({ route }) {
  const { user } = route.params;
  
  return (
    <View>
      <Text>Name: {user.name}</Text>
      <Text>Email: {user.email}</Text>
    </View>
  );
}

// Update parameters
function EditScreen({ navigation }) {
  const updateUser = () => {
    navigation.setParams({ user: updatedUser });
  };
  
  return <Button title="Update" onPress={updateUser} />;
}

Rarità: Molto Comune Difficoltà: Facile


16. Cosa sono le opzioni di navigazione e come personalizzi gli header?

Risposta: Le opzioni di navigazione controllano l'aspetto e il comportamento dello schermo.

function HomeScreen({ navigation }) {
  useEffect(() => {
    navigation.setOptions({
      title: 'My Home',
      headerStyle: {
        backgroundColor: '#f4511e',
      },
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',
      },
      headerRight: () => (
        <Button title="Info" onPress={() => alert('Info')} />
      ),
    });
  }, [navigation]);
  
  return <View><Text>Home</Text></View>;
}

// Or set in navigator
<Stack.Screen
  name="Home"
  component={HomeScreen}
  options={{
    title: 'My Home',
    headerStyle: { backgroundColor: '#f4511e' },
    headerTintColor: '#fff',
  }}
/>

Rarità: Comune Difficoltà: Facile


Dati e Archiviazione (4 Domande)

17. Come recuperi i dati da un'API in React Native?

Risposta: Utilizza l'API fetch o librerie come Axios.

import { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';

function UserList() {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  
  useEffect(() => {
    fetchUsers();
  }, []);
  
  const fetchUsers = async () => {
    try {
      const response = await fetch('https://api.example.com/users');
      
      if (!response.ok) {
        throw new Error('Network response was not ok');
      }
      
      const data = await response.json();
      setUsers(data);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };
  
  if (loading) return <ActivityIndicator />;
  if (error) return <Text>Error: {error}</Text>;
  
  return (
    <FlatList
      data={users}
      renderItem={({ item }) => <Text>{item.name}</Text>}
      keyExtractor={item => item.id.toString()}
    />
  );
}

Rarità: Molto Comune Difficoltà: Media


18. Cos'è AsyncStorage e come lo usi?

Risposta: AsyncStorage è uno storage asincrono chiave-valore per piccoli dati non sensibili.

  • Buoni casi d’uso: Tema scelto, flag di onboarding, JSON in cache, preferenze semplici
  • Da evitare per: Token di autenticazione, chiavi API, password, grandi dataset e dati che richiedono query complesse
  • Per dati sensibili: Usa storage sicuro della piattaforma, come iOS Keychain o storage cifrato Android tramite una libreria mantenuta
import AsyncStorage from '@react-native-async-storage/async-storage';

const savePreference = async (theme) => {
  await AsyncStorage.setItem('theme', theme);
};

const loadPreference = async () => {
  return await AsyncStorage.getItem('theme');
};

Rarità: Molto Comune Difficoltà: Facile


19. Qual è la differenza tra FlatList e ScrollView?

Risposta:

  • ScrollView:
    • Esegue il rendering di tutti i figli contemporaneamente
    • Buono per liste piccole
    • Richiede molta memoria per liste grandi
  • FlatList:
    • Esegue il rendering solo degli elementi visibili (lazy loading)
    • Efficiente per liste grandi
    • Ottimizzazioni integrate
// ScrollView - renders everything
<ScrollView>
  {items.map(item => (
    <View key={item.id}>
      <Text>{item.name}</Text>
    </View>
  ))}
</ScrollView>

// FlatList - renders only visible items
<FlatList
  data={items}
  renderItem={({ item }) => (
    <View>
      <Text>{item.name}</Text>
    </View>
  )}
  keyExtractor={item => item.id}
  // Performance optimizations
  initialNumToRender={10}
  maxToRenderPerBatch={10}
  windowSize={5}
/>

Rarità: Molto Comune Difficoltà: Facile


20. Come gestisci i form e l'input dell'utente?

Risposta: Utilizza componenti controllati con stato.

import { useState } from 'react';
import { View, TextInput, Button, Text } from 'react-native';

function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});
  
  const validate = () => {
    const newErrors = {};
    
    if (!email) {
      newErrors.email = 'Email is required';
    } else if (!/\S+@\S+\.\S+/.test(email)) {
      newErrors.email = 'Email is invalid';
    }
    
    if (!password) {
      newErrors.password = 'Password is required';
    } else if (password.length < 6) {
      newErrors.password = 'Password must be at least 6 characters';
    }
    
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };
  
  const handleSubmit = () => {
    if (validate()) {
      console.log('Form submitted:', { email, password });
      // Submit to API
    }
  };
  
  return (
    <View>
      <TextInput
        placeholder="Email"
        value={email}
        onChangeText={setEmail}
        keyboardType="email-address"
        autoCapitalize="none"
      />
      {errors.email && <Text style={{ color: 'red' }}>{errors.email}</Text>}
      
      <TextInput
        placeholder="Password"
        value={password}
        onChangeText={setPassword}
        secureTextEntry
      />
      {errors.password && <Text style={{ color: 'red' }}>{errors.password}</Text>}
      
      <Button title="Login" onPress={handleSubmit} />
    </View>
  );
}

Rarità: Molto Comune Difficoltà: Media


Newsletter subscription

Consigli di carriera settimanali che funzionano davvero

Ricevi le ultime idee direttamente nella tua casella di posta

Il Tuo Prossimo Colloquio Dista Solo un Curriculum

Crea un curriculum professionale e ottimizzato in pochi minuti. Non servono competenze di design—solo risultati comprovati.

Crea il mio curriculum

Condividi questo post

Raddoppia le Tue Chiamate per Colloqui

I candidati che personalizzano il loro curriculum in base alla descrizione del lavoro ottengono 2,5 volte più colloqui. Usa la nostra IA per personalizzare automaticamente il tuo CV per ogni singola candidatura istantaneamente.