Aprende a gestionar hábitos de forma efectiva con React Native: incrementa la racha, marca como completo y agrega nuevos hábitos usando useState, useCallback, TextInput y Pressable. Con IDs únicos, validaciones y estilos con useThemeColor, lograrás una experiencia limpia y predecible.
¿Cómo aumentar la racha con estado y callbacks?
Para actualizar un hábito al tocarlo, se crea un callback que recibe el ID del hábito y usa setItems con .map. Así se ubica el hábito seleccionado, se alterna su isComplete y se ajusta la streak sin permitir valores negativos. Es clave no modificar directamente, sino retornar nuevos objetos.
Define un identificador único tipo string por hábito.
Usa setItems(prev => prev.map(...)) para actualizar inmutablemente.
Si el ID no coincide, retorna el hábito original.
Si coincide, alterna isComplete y ajusta streak.
Emplea Math.max(0, ...) para evitar rachas por debajo de cero.
¿Cómo agregar nuevos hábitos con TextInput y un botón?
Se controla una entrada de texto con state para el título del hábito. Con un callbackaddHabit, se valida que exista título, se construye un objeto con ID único, streak en 0, isComplete en false y priority en low, se agrega a items y se limpia el campo.
Controla el texto con const [nuevo, setNuevo] = useState('').
importReact,{ useCallback, useState }from'react';import{Pressable,Text,TextInput,View,StyleSheet}from'react-native';import{ useThemeColor }from'./useThemeColor';exportfunctionHabits(){const[items, setItems]=useState<any[]>([]);const[nuevo, setNuevo]=useState('');const colors =useThemeColor();const addHabit =useCallback(()=>{const title = nuevo.trim();if(!title)return;// no agregar si no hay títulosetItems(prev =>{const id =`H${Date.now()}`;const habit ={ id, title, streak:0, isComplete:false, priority:'low'};return[...prev, habit];});setNuevo('');// limpiar el campo},[nuevo]);return(<Viewstyle={styles.row}><TextInputvalue={nuevo}onChangeText={setNuevo}placeholder="Nuevo hábito: meditar"style={[styles.input,{ borderColor: colors.border, color: colors.text}]}/><PressableonPress={addHabit}style={[styles.button,{ borderColor: colors.border}]}><Textstyle={{ color: colors.text}}>añadir</Text></Pressable></View>);}const styles =StyleSheet.create({ row:{ flexDirection:'row', alignItems:'center', gap:8}, input:{ flex:1, borderWidth:1, padding:12, borderRadius:8}, button:{ paddingHorizontal:16, paddingVertical:12, borderWidth:1, borderRadius:8},});
Asegura que TextInput provenga de la librería de React Native y que useCallback se importe desde React.
Usa variables de color desde useThemeColor para background, borderColor y color.
¿Qué métricas y buenas prácticas refuerzan la implementación?
Para dar retroalimentación al usuario y mantener el rendimiento, se calcula cuántos hábitos hay en total y cuántos están completos usando un hook que memoriza el resultado. Además, al renderizar, incluye la key, el title, la streak, el isComplete, la priority y la acción de selección con el ID.
Memoriza el conteo de completados con un hook de memoria.
Mantén el mapeo completo del estado al actualizar con setItems.