Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

280
Views
Cómo incrementar el valor de un objeto dentro del estado Reaccionar

Así que tengo este componente llamado contadores donde el estado se ve así

 state = { counters: [ { id: 1, value: 0 }, { id: 2, value: 3 }, { id: 3, value: 0 }, { id: 4, value: 0 }, ], };

Y estoy tratando de incrementar el valor cada vez que se hace clic en un botón correspondiente. Esta es la función que escribí para él.

 handleIncrement = (counter) => { const counters = [...this.state.counters]; const index = counters.indexOf(counter); counters[index] = { ...counter }; counters[index].value++; this.setState({ counters }); };

no funciona Y he aquí algunas observaciones adicionales.

  1. Cuando console.log el objeto de contadores locales (copiado de state.counters) devuelve una fila adicional al final con id: -1 y valor: NaN
  2. El contador variable (que se pasa como parámetro) es de un componente secundario. Se supone que devuelve 0 si se hace clic en el primer botón, 1 si se hace clic en el segundo botón y así sucesivamente. Cuando lo consuelo.log, parece estar devolviendo los valores correctos.

por lo que parece, el problema parece estar en la línea

 const index = counters.indexOf(counter);

Como el valor del índice siempre se devuelve como -1.

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

intente esto para obtener el índice:

 const index = counters.findIndex(x => x.id === counter.id);
about 4 years ago · Santiago Trujillo Report

0

Puede usar el índice para actualizar el registro correspondiente en la matriz.

 const idx = this.state.counters.findIndex((counter) => counter.id === id);

Implementación completa: -

 import React from "react"; import "./styles.css"; export default class App extends React.Component { constructor(props) { super(props); this.state = { counters: [ { id: 1, value: 0 }, { id: 2, value: 3 }, { id: 3, value: 0 }, { id: 4, value: 0 } ] }; } handleClick = (id) => { const idx = this.state.counters.findIndex((counter) => counter.id === id); const counters = [...this.state.counters]; counters[idx] = { ...counters[idx], value: counters[idx].value++ }; this.setState(counters); }; render() { return ( <div> {this.state.counters.map((counter) => ( <div> <button onClick={() => this.handleClick(counter.id)}> Button {counter.id} </button> <span>Value {counter.value}</span> <hr /> </div> ))} </div> ); } }

Codesandbox - https://codesandbox.io/s/musing-black-cipbbs?file=/src/App.js

about 4 years ago · Santiago Trujillo Report

0

Agrego mi respuesta aquí en caso de que otra alma confundida tropiece con ella.

Aunque parecía que el problema estaba dentro de la línea

 const index = counters.indexOf(counter);

En realidad, estaba en el componente secundario donde se invocaba la función. Dentro del parámetro estaba pasando counters.value mientras que la función handleincrement dentro del componente principal no esperaba el valor, sino el objeto completo.

El código en su condición de trabajo es el siguiente Componente principal:

 import React, { Component } from "react"; import Counter from "./counter"; class Counters extends Component { state = { counters: [ { id: 1, value: 0 }, { id: 2, value: 3 }, { id: 3, value: 0 }, { id: 4, value: 0 }, ], }; handleIncrement = (counter) => { const counters = [...this.state.counters]; const index = counters.indexOf(counter); console.log(index); counters[index] = { ...counter }; counters[index].value++; this.setState({ counters }); };

Componente hijo:

 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> import React, { Component } from "react"; class Counter extends Component { render() { return ( <button onClick={() => this.props.onIncrement(this.props.counter)} className="btn btn-secondary btn-sm" > Increment </button> ) } ]

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!