Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

431
Visualizações
e.target.disabled = true no funciona si un useState Hook está presente en la misma función

Tengo dos mesas una al lado de la otra. La tabla de la izquierda contiene un botón Agregar que pasa el contenido de la tabla de la izquierda a la tabla de la derecha.

Una vez que se realiza este proceso, el botón debe desactivarse y debe heredar un estilo diferente de una clase diferente.

 const [recordsRight, setRecordsRight] = useState([]); <TableBody className = "leftTable"> { recordsLeft === null ? [] : recordsLeft.map((item, index) => ( //<TableCell></TableCell> //Table Contents <button className="addToggle" id={"addToggle" + index} onClick={(e) => handleAddSwitch(e, item)}> <CircleCheckIcon /> Add </button> )) } </TableBody> <TableBody className = "rightTable"> { recordsRight === null ? [] : recordsRight.map((item, index) => ( //<TableCell></TableCell> //Same Table Contents )) } </TableBody> function handleAddSwitch(e, item) { e.target.disabled = true; e.target.className = "addToggle2"; let newRecordsRight = [...recordsRight]; newRecordsRight.push(item); setRecordsRight(newRecordsRight); } .addToggle{ background: green; } .addToggle2{ background: grey; }

cuando elimino la línea setRecordsRight de la función handleAddSwitch, el color del botón cambia y se desactiva.

Pero una vez que lo agrego nuevamente, el proceso deja de funcionar y podría agregar el mismo elemento de izquierda a derecha una y otra vez. ¿Qué tengo que hacer?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Debería almacenar el indicador para deshabilitado/habilitado en el estado de su componente (como un indicador en el item , o como un mapa separado de indicadores marcados por algún identificador único para item ), sin modificar directamente el DOM. (Esto no solo se aplica al indicador disabled en los botones, se aplica generalmente a cualquier cosa en el DOM renderizado). La razón es que si modifica directamente el DOM, entonces su componente se vuelve a renderizar por cualquier motivo, React lo sobrescribirá sus modificaciones DOM.

He aquí un ejemplo simplificado:

 const {useState} = React; let nextItemId = 1; const initialItems = [ {id: nextItemId++, enabled: true}, {id: nextItemId++, enabled: true}, {id: nextItemId++, enabled: true}, {id: nextItemId++, enabled: true}, ]; const Example = () => { const [items, setItems] = useState(initialItems); const addItem = () => { setItems(items => [...items, { id: nextItemId++, enabled: true, }]); }; const toggleItem = itemToToggle => { setItems(items => items.map(item => { if (item.id === itemToToggle.id) { item = {...item, enabled: !item.enabled}; } return item; })); }; return <div> {items.map(item => ( <div className="item" key={item.id} onClick={() => toggleItem(item)}> Item {item.id}: {item.enabled ? "Enabled - click to disable" : "Disabled - click to enable"} </div> ))} <input type="button" onClick={addItem} value="Add item" /> </div>; }; ReactDOM.render(<Example />, document.getElementById("root"));
 .item { user-select: none; }
 <div id="root"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda