Estoy tratando de enviar los datos que se configuran usando la función setData a datas[]. Puedo enviar los datos una vez, pero la segunda vez que los envío, en lugar de almacenarse en datas[1], reemplaza datas[0]. Qué estoy haciendo mal aquí. Gracias de antemano.
export default function App() { const [data,setData]= useState([]); const [activity, setActivity]= useState([]) const [name, setName] = useState("") const datas=[]; useEffect(()=>{ // handlePress() }, [setData, setName]) const rand= Math.floor(Math.random(1,5)*4)+1 const events=["Event A","Event B","Event C","Event D","Event E"] const handlePress=(day)=>{ setData(day); setName(`${events[rand]}`) datas.push(data); console.log(datas); } return ( <div className="App"> <Calendar onDayPress={day => { {handlePress(day)} }} /> </div> ); }la matriz de datas se agrega dentro del componente. Cada vez que el componente se vuelve a renderizar, se reinicializa para vaciar la matriz.
Además, en onDayPress prop en la función de devolución de llamada, ha agregado un par adicional de corchetes
La App se vuelve a renderizar cada vez que cambia de estado, por lo que const datas=[]; se inicializará como una nueva matriz.
Un problema más que puedo prever es que llame a setData(day) y luego llame a datas.push(data) en la misma función que no se aplicará con sus datos más recientes porque los cambios de estado son asíncronos
const handlePress=(day)=>{ setData(day); //`day` is set here but not applied immediately setName(`${events[rand]}`) datas.push(data); //data is the previous data, not `day` console.log(datas); }La modificación completa puede ser
const datas=[]; //move your `datas` to the global scope export default function App() { const [data,setData]= useState([]); const [activity, setActivity]= useState([]) const [name, setName] = useState("") useEffect(()=>{ // handlePress() }, [setData, setName]) const rand= Math.floor(Math.random(1,5)*4)+1 const events=["Event A","Event B","Event C","Event D","Event E"] const handlePress=(day)=>{ setData(day); //`data` will be changed later setName(`${events[rand]}`) datas.push(day); //push `day` directly instead of data console.log(datas); } return ( <div className="App"> <Calendar onDayPress={day => { {handlePress(day)} }} /> </div> ); } Tampoco debe usar useEffect con setters ( setData y setName ). Estos setters no tienen nada que ver con los efectos secundarios. Debe pasar valores de estado como dependencias en useEffect .
//whenever `name` or `data` change, `useEffect` will be triggered useEffect(()=>{ //TODO: Do your logic here }, [data, name])En reaccionar, cuando actualiza el estado, el componente de reacción se vuelve a procesar. Entonces, aquí, cuando actualiza el estado en la función handlePress (), su componente se vuelve a procesar. Por lo tanto, su matriz de datos se reinicializa y vuelve a estar vacía. Entonces, cada vez que presione un elemento, se agregará a la primera posición. Espero que te ayude.