vida react qué que podemos pasar optimizar método example entre desmontar datos con comunicacion componentes componente componentdidmount ciclo reactjs

reactjs - qué - react comunicacion entre componentes



¿Cuál es la mejor manera de actualizar un objeto en una matriz en ReactJS? (4)

Cuando trabajas con una matriz, necesitas pasar un atributo personalizado, en mi ejemplo, estoy pasando
atributo de data-index data- , data- es un prefijo cuando pasa un atributo personalizado, también es una convención html 5,
Esta es la misma forma en que actualizamos la array en Reducer .

Ex:

//handleChange method handleChange(e){ //getting custom attribute value. let i = e.target.getAttribute(''data-index''), obj = Object.assign({}, this.state.arr[i],{[e.target.name]: e.target.value}); //update state value. this.setState({arr: [...this.state.arr.slice(0, i), obj, ...this.state.arr.slice(i + 1)]}) }

Si tiene una matriz como parte de su estado, y esa matriz contiene objetos, ¿cuál es una forma fácil de actualizar el estado con un cambio en uno de esos objetos?

Ejemplo, modificado desde el tutorial en reaccionar:

var CommentBox = React.createClass({ getInitialState: function() { return {data: [ { id: 1, author: "john", text: "foo" }, { id: 2, author: "bob", text: "bar" } ]}; }, handleCommentEdit: function(id, text) { var existingComment = this.state.data.filter({ function(c) { c.id == id; }).first(); var updatedComments = ??; // not sure how to do this this.setState({data: updatedComments}); } }


Mientras se actualiza el estado, la parte clave es tratarlo como si fuera inmutable. Cualquier solución funcionaría bien si puede garantizarlo.

Aquí está mi solución usando inmutability-helper :

jsFiddle: http://jsfiddle.net/eLmwf14a/

var update = require(''immutability-helper''); handleCommentEdit: function(id, text) { var data = this.state.data; var commentIndex = data.findIndex(function(c) { return c.id == id; }); var updatedComment = update(data[commentIndex], {text: {$set: text}}); var newData = update(data, { $splice: [[commentIndex, 1, updatedComment]] }); this.setState({data: newData}); },

Las siguientes preguntas sobre arreglos de estado también pueden ayudar:


Me gusta mucho hacer esto con Object.assign en lugar de los helpers de inmutabilidad.

handleCommentEdit: function(id, text) { this.setState({data: this.state.data.map( (el)=> el.id === id ? Object.assign({}, el, {text: text}) : el }); }

Simplemente creo que esto es mucho más breve que empalmar y no requiere conocer un índice ni manejar explícitamente el caso no encontrado.


Intentando limpiar / explicar mejor cómo hacer esto Y qué está pasando.

  • Primero, encuentre el índice del elemento que está reemplazando en la matriz de estado.
  • En segundo lugar, update el elemento en ese índice
  • En tercer lugar, llame a setState con la nueva colección

import update from ''immutability-helper''; // this.state = { employees: [{id: 1, name: ''Obama''}, {id: 2, name: ''Trump''}] } updateEmployee(employee) { const index = this.state.employees.findIndex((emp) => emp.id === employee.id); const updatedEmployees = update(this.state.employees, {$splice: [[index, 1, employee]]}); // array.splice(start, deleteCount, item1) this.setState({employees: updatedEmployees}); }