Soy nuevo en reaccionar y me topé con un problema con el que necesito ayuda. Estoy colocando varios elementos de entrada y estoy tratando de cambiar sus valores en función de un cambio de estado que, en este caso, es manual (verdadero o falso);
El código es una forma simple donde tiene 12 entradas dentro a través de un bucle. Mi problema es que, según si el manual es verdadero o falso, quiero cambiar el valor de las entradas.
Si el manual devuelve verdadero, quiero que actúe normalmente (ingrese normalmente), pero cuando el manual devuelve falso, quiero que todos mis valores de entrada muestren el número 12 y viceversa. El estado manual se activa mediante un botón, como se ve a continuación.
Tengo dos problemas aquí:
¿Alguien puede ayudarme a implementar esto? He intentado usar múltiples soluciones sin éxito:
import React, {useState, useEffect, useRef} from 'react'; function App() { const [budget, setBudget] = useState([]) const [manual, setManual] = useState(false); const handleInput = inputEv =>{ const budgetState = budget; const input = {index: inputEv.target.getAttribute('index'), value: inputEv.target.value}; // if data input already exists - update it if(budgetState.some(data=>data.index === input.index)){ var current = budgetState.find(data=>data.index === input.index); current.value = input.value; } else { budgetState.push(input) setBudget(budgetState); } } return ( <div> <form className="inputs"> {Array(12).fill().map((e, index)=>( <div key={index} className="month"> <input type="text" onChange={handleInput} index={index} disabled={manual ? false : true}/> </div> ))} </form> <button onClick={()=>setManual(!manual)}>Click</button> </div> ); } export default App;Antes de comenzar la parte lógica, primero debe declarar el state como:
const length = 12; const [budget, setBudget] = useState(Array.from({ length }, () => 12)); const [manual, setManual] = useState(false);Demo en vivo
Tienes que considerar dos escenarios:
1) When you click on the button which will toggle to manual value
Llamará a una función changeManual cuya definición es:
function changeManual() { if (manual) setBudget((state) => state.map((o) => 12)); else setBudget(budget); setManual(!manual); } 2) When you input on one of the input HTML element then you have to update the respective value in an array.
Necesita event e index , por lo que puede llamar a una función que internamente pasa tanto el valor como
<input type="text" value={budget[index]} onChange={(e) => handleInput(e, index)} disabled={manual ? false : true} /> que activará la función handleInput cuya definición es
const handleInput = (inputEv, index) => { const value = inputEv.target.value; setBudget((state) => state.map((val, i) => (i !== index ? val : value))); };