dicembre 21, 2025
14 min di lettura

Domande per il colloquio di lavoro come Junior React Native Developer: Guida completa

interview
career-advice
job-search
entry-level
Domande per il colloquio di lavoro come Junior React Native Developer: Guida completa
MB

Milad Bonakdar

Autore

Padroneggia i fondamenti dello sviluppo React Native con domande essenziali per il colloquio di lavoro che coprono i concetti base di React, i componenti, la navigazione, la gestione dello stato e i concetti specifici per il mobile, pensate per gli sviluppatori junior.


Introduzione

React Native consente agli sviluppatori di creare applicazioni mobile native utilizzando JavaScript e React. Con un unico codebase, puoi creare app sia per iOS che per Android, rendendolo una scelta potente per lo sviluppo mobile cross-platform.

Questa guida copre le domande essenziali per i colloqui per Junior React Native Developer. Esploreremo i fondamenti di React, i componenti, gli hook, la navigazione, la gestione dello stato e i concetti specifici per il mobile per aiutarti a prepararti per il tuo primo ruolo come sviluppatore React Native.


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 DOM virtuale è una rappresentazione JavaScript leggera del DOM reale.

  • Processo:
    1. Quando lo stato cambia, React crea un nuovo albero DOM virtuale
    2. Lo confronta con il DOM virtuale precedente (diffing)
    3. Calcola le modifiche minime necessarie
    4. Aggiorna solo le parti modificate nel DOM reale
  • Vantaggi: Aggiornamenti efficienti, prestazioni migliori

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 è un sistema di archiviazione asincrono chiave-valore semplice per React Native.

  • Casi d'uso: Preferenze utente, token, piccoli dati
  • Non per: Set di dati di grandi dimensioni, query complesse (utilizzare invece SQLite)
import AsyncStorage from '@react-native-async-storage/async-storage';

// Save data
const saveData = async (key, value) => {
  try {
    await AsyncStorage.setItem(key, value);
  } catch (error) {
    console.error('Error saving data:', error);
  }
};

// Save object
const saveUser = async (user) => {
  try {
    const jsonValue = JSON.stringify(user);
    await AsyncStorage.setItem('user', jsonValue);
  } catch (error) {
    console.error('Error saving user:', error);
  }
};

// Read data
const getData = async (key) => {
  try {
    const value = await AsyncStorage.getItem(key);
    return value !== null ? value : null;
  } catch (error) {
    console.error('Error reading data:', error);
  }
};

// Read object
const getUser = async () => {
  try {
    const jsonValue = await AsyncStorage.getItem('user');
    return jsonValue != null ? JSON.parse(jsonValue) : null;
  } catch (error) {
    console.error('Error reading user:', error);
  }
};

// Remove data
const removeData = async (key) => {
  try {
    await AsyncStorage.removeItem(key);
  } catch (error) {
    console.error('Error removing data:', error);
  }
};

// Clear all
const clearAll = async () => {
  try {
    await AsyncStorage.clear();
  } catch (error) {
    console.error('Error clearing storage:', error);
  }
};

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

Decorative doodle

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.