Busqué sobre el desbordamiento de la pila pero no encontré ninguno similar (simplemente reemplace un valor clave de objeto sin usar el valor anterior).
Considere un gráfico declarado con useState
const [graphBounds, setGraphBounds] = useState(graphBoundsInitialValue);Dónde
const graphBoundsInitialValue = { left: Number.MAX_SAFE_INTEGER, right: 0, top: 0, bottom: Number.MAX_SAFE_INTEGER };Izquierda y derecha son para el eje X e inferior y superior son para el eje Y respectivamente.
Puedo tener 1 o más gráficos y para todos ellos necesito obtener el mínimo X, el mínimo Y, el máximo X, el máximo Y para mostrarlos correctamente
Necesito cambiar uno de los parámetros de graphBounds de acuerdo con el nuevo valor del servidor almacenado en la variable del graph y en función del valor anterior de ese parámetro.
Intenté muchas cosas como
setGraphBounds(prev => ({...prev, top : prev.top > graph.maxY ? prev.top : graph.maxY}));El problema es que intellijIdea se queja de ese código y no me deja. Probé [] corchetes y así sucesivamente, pero sin suerte.
He terminado algo como esto:
const updatedTop = graphBounds.top > graph.maxY ? graphBounds.top : graph.maxY; let updatedBottom = graphBounds.bottom < graph.minY ? graphBounds.bottom : graph.minY || 0; // bottom domain always above zero updatedBottom = updatedBottom > 0 ? updatedBottom : 0; const updatedLeft = graphBounds.left < graph.minX ? graphBounds.left : graph.minX; const updatedRight = graphBounds.right > graph.maxX ? graphBounds.right : graph.maxX; setGraphBounds({top: updatedTop, bottom: updatedBottom, left: updatedLeft, right: updatedRight});Este código siempre se ejecuta cuando llegan nuevos datos y compara el nuevo valor del gráfico con el anterior.
Todavía tengo una sensación molesta de código no optimizado.
PD
PERO si me atrevo a hacerlo, seguirá siendo 4 llamadas no optimizadas (sí, en un lote, pero lo que sea) como
para izquierda: setGraphBounds(prev => ({...prev, left : prev.left > graph.minX ...
por la derecha: setGraphBounds(prev ...
para arriba: setGraphBounds(prev...
para abajo: setGraphBounds(prev...
Cualquier sugerencia es apreciada. Gracias por adelantado
Puede enfrentar algunos problemas porque no está accediendo al estado actual graphBounds , ejemplo aquí:
const updatedTop = graphBounds.top > graph.maxY ? graphBounds.top : graph.maxY; El valor de graphBounds no siempre es el valor actual.
Al usar la devolución de llamada en lugar del objeto, tendrá acceso a la última versión de su estado graphBounds :
setGraphBounds((graphBounds) => { const updatedTop = graphBounds.top > graph.maxY ? graphBounds.top : graph.maxY; const updatedBottom = graphBounds.bottom < graph.minY ? graphBounds.bottom : graph.minY || 0; // bottom domain always above zero updatedBottom = updatedBottom > 0 ? updatedBottom : 0; const updatedLeft = graphBounds.left < graph.minX ? graphBounds.left : graph.minX; const updatedRight = graphBounds.right > graph.maxX ? graphBounds.right : graph.maxX; return { top: updatedTop, bottom: updatedBottom, left: updatedLeft, right: updatedRight, }; });