En aquest projecte, construirem una aplicació de llista de tasques (To-Do List) utilitzant React Native. Aquest projecte ens permetrà aplicar els conceptes apresos en els mòduls anteriors i veure com es poden combinar per crear una aplicació funcional.
Objectius del Projecte
- Crear una interfície d'usuari per afegir, visualitzar i eliminar tasques.
- Utilitzar l'estat per gestionar les tasques.
- Implementar estilització amb Flexbox.
- Emmagatzemar les tasques localment utilitzant AsyncStorage.
Passos del Projecte
- Configuració Inicial
-
Crear un nou projecte de React Native:
npx react-native init TodoListApp cd TodoListApp -
Instal·lar les dependències necessàries:
npm install @react-native-async-storage/async-storage
- Estructura del Projecte
Organitzarem el projecte en diversos components per mantenir el codi net i modular.
App.jscomponents/TaskInput.jscomponents/TaskItem.jscomponents/TaskList.js
- Implementació dels Components
3.1. TaskInput.js
Aquest component serà responsable de capturar l'entrada de l'usuari per afegir noves tasques.
import React, { useState } from 'react';
import { View, TextInput, Button, StyleSheet } from 'react-native';
const TaskInput = ({ onAddTask }) => {
const [task, setTask] = useState('');
const handleAddTask = () => {
if (task.trim()) {
onAddTask(task);
setTask('');
}
};
return (
<View style={styles.inputContainer}>
<TextInput
placeholder="Add a new task"
style={styles.input}
value={task}
onChangeText={setTask}
/>
<Button title="Add" onPress={handleAddTask} />
</View>
);
};
const styles = StyleSheet.create({
inputContainer: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: 20,
},
input: {
width: '80%',
borderBottomColor: 'black',
borderBottomWidth: 1,
padding: 10,
},
});
export default TaskInput;3.2. TaskItem.js
Aquest component representarà cada tasca individualment.
import React from 'react';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
const TaskItem = ({ task, onDelete }) => {
return (
<TouchableOpacity onPress={() => onDelete(task.id)}>
<View style={styles.taskItem}>
<Text>{task.text}</Text>
</View>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
taskItem: {
padding: 10,
backgroundColor: '#ccc',
borderColor: 'black',
borderWidth: 1,
marginVertical: 10,
},
});
export default TaskItem;3.3. TaskList.js
Aquest component gestionarà la llista de tasques.
import React from 'react';
import { FlatList, StyleSheet } from 'react-native';
import TaskItem from './TaskItem';
const TaskList = ({ tasks, onDeleteTask }) => {
return (
<FlatList
data={tasks}
renderItem={({ item }) => (
<TaskItem task={item} onDelete={onDeleteTask} />
)}
keyExtractor={(item) => item.id.toString()}
/>
);
};
const styles = StyleSheet.create({});
export default TaskList;
- Integració a App.js
import React, { useState, useEffect } from 'react';
import { View, StyleSheet, SafeAreaView, StatusBar } from 'react-native';
import TaskInput from './components/TaskInput';
import TaskList from './components/TaskList';
import AsyncStorage from '@react-native-async-storage/async-storage';
const App = () => {
const [tasks, setTasks] = useState([]);
useEffect(() => {
const loadTasks = async () => {
try {
const storedTasks = await AsyncStorage.getItem('tasks');
if (storedTasks) {
setTasks(JSON.parse(storedTasks));
}
} catch (error) {
console.error(error);
}
};
loadTasks();
}, []);
useEffect(() => {
const saveTasks = async () => {
try {
await AsyncStorage.setItem('tasks', JSON.stringify(tasks));
} catch (error) {
console.error(error);
}
};
saveTasks();
}, [tasks]);
const addTask = (taskText) => {
setTasks((currentTasks) => [
...currentTasks,
{ id: Math.random().toString(), text: taskText },
]);
};
const deleteTask = (taskId) => {
setTasks((currentTasks) => currentTasks.filter((task) => task.id !== taskId));
};
return (
<SafeAreaView style={styles.screen}>
<StatusBar barStyle="dark-content" />
<View style={styles.container}>
<TaskInput onAddTask={addTask} />
<TaskList tasks={tasks} onDeleteTask={deleteTask} />
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
screen: {
flex: 1,
},
container: {
padding: 50,
},
});
export default App;
- Proves i Depuració
- Prova l'aplicació en un simulador/emulador per assegurar-te que totes les funcionalitats funcionen correctament.
- Depura qualsevol error que pugui sorgir durant el desenvolupament.
- Conclusió
En aquest projecte, hem creat una aplicació de llista de tasques utilitzant React Native. Hem après a gestionar l'estat, a estilitzar components amb Flexbox, i a emmagatzemar dades localment amb AsyncStorage. Aquest projecte ens ha proporcionat una base sòlida per a desenvolupar aplicacions més complexes en el futur.
Exercici Pràctic:
- Afegir una funcionalitat per marcar les tasques com a completades.
- Implementar una funcionalitat per editar les tasques existents.
Solució:
- Per marcar les tasques com a completades, pots afegir una propietat
completeda cada tasca i canviar el seu estil en funció d'aquesta propietat. - Per editar les tasques, pots afegir un botó d'edició a cada
TaskItemi gestionar l'actualització del text de la tasca en l'estat.
Amb això, hem completat el nostre primer projecte de React Native. Felicitats!
Curs de React Native
Mòdul 1: Introducció a React Native
- Què és React Native?
- Configuració de l'entorn de desenvolupament
- Aplicació Hello World
- Comprendre JSX
- Components i Props
Mòdul 2: Components bàsics i estilització
- Visió general dels components bàsics
- Text, View i Image
- Estilització amb Flexbox
- Gestió de l'entrada de l'usuari
- ScrollView i ListView
Mòdul 3: Estat i cicle de vida
- Mètodes d'estat i cicle de vida
- Gestió d'esdeveniments
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Navegació
- Introducció a React Navigation
- Stack Navigator
- Tab Navigator
- Drawer Navigator
- Passar paràmetres a les rutes
Mòdul 5: Xarxes i dades
- Obtenir dades amb Fetch API
- Utilitzar Axios per a sol·licituds HTTP
- Gestió d'errors de xarxa
- AsyncStorage per a dades locals
- Integració amb APIs REST
Mòdul 6: Conceptes avançats
Mòdul 7: Desplegament i publicació
- Construcció per a iOS
- Construcció per a Android
- Publicació a l'App Store
- Publicació a Google Play
- Integració i lliurament continus
