plotly / plotly/react-plotly.js

onSelected uses stale function even when prop for onSelected changed

Abierto
#197 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
JavaScript
Estrellas
1.1k
Forks
138
Merge medio
3 d 2 h
PR fusionados (30 d)
4

Descripción

While using react plotly I noticed that changes to the onSelected prop are ignored and the initial function used for that prop is called instead when building a lasso based chart. This is an issue when we want to listen to context changes to things like translations.

The code below shows the issue:

  const translations = useTranslation<TaggingIndicatorsTranslations>(
    allTranslations
  );
  const [currentBranch] = useBranch();
.....
.....
.....
   const filterSelectedProductsWithContext = function filterSelectedProductsCB(
    param: PlotSelectionEvent
  ) {
    filterSelectedProducts(param, currentBranch, translations);
  };

  return (
    <div style={{ height: "100%", width: "100%" }}>
      <Plot
        data={table}
        config={{ displayModeBar: false, plotlyServerURL: currentBranch }}
        layout={{
          dragmode: "lasso",
          xaxis: { title: xAndY.x },
          yaxis: { title: xAndY.y },
          autosize: true,
          // title: "Helpful Indicators To Tag",
        }}
        useResizeHandler
        style={{ width: "100%", height: "90%" }}
        onSelected={filterSelectedProductsWithContext}
      />
    </div>
  ); 

In the above translations and branch are context values (custom context values) that change. We want the behavior of onSelected to change to reflect this (to use a new callback.) Even when changes to data are reflected in the render we still see the stale onSelected is being used when lasso selecting bullet points.

This code snippet was used in a react hook with react-plotly version 2.4.0 and 2.3.0.

I have tried using big arrow and the "function" keyword but neither work. Looking at the source code for factory.js (https://github.com/plotly/react-plotly.js/blob/master/src/factory.js) I do see there is some handler replacement logic in "syncEventHandlers" when handlers are not the same to the props. I was thinking though that the updatePlotly function (that calls this synchronization might) might not be getting called during componentDidUpdate because the onSelected prop wasn't checked.

As a workaround right now I have to take my contexts and place them in a global wrapper so their changes are visible. Its not a good solution but I can't think of a better one and our contexts are mostly global for the entire dom tree anyways.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en src/factory.js, leyendo syncEventHandlers y la ruta de updatePlotly durante componentDidUpdate. Reproduce el caso de selección con lazo con valores de contexto cambiantes y confirma que onSelected usa el callback de prop más reciente en lugar del inicial.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, react
Área
data-visualization, frontend
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
30/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.