React не выполняет повторную визуализацию при изменении состояния

У меня в основном есть компонент, как на картинке где переключатель меняет вид графика с таблицы на график.

Флажок обработчик выглядит следующим образом:

 handleTableChange = e => {
    const plot = e.target.checked;
    this.setState({ plot });
  };

Логика для отображения элемента:

{this.state.plot ? plot : table}

Проблема в том, что если я пытаюсь изменить представление с графика на таблицу после того, как я взаимодействую с графиком (скажем, изолировал трассировку), состояние изменяется, но представление не меняется.

Этот рисунок показывает, что сначала (с нетронутым сюжетом) переключение работает, но после взаимодействия сюжета это изменение происходит только при второй попытке переключения.

Почему это происходит и как это исправить?

UPD.: весь код для компонента

https://codepen.io/nikitaneganov/pen/JwBLoe

Минимальный пример:

import React, { Component } from "react";
import Plot from "react-plotly.js";
import classes from "./FirstSeen.module.css";
import { instance } from "../../../axios/index";

class FirstSeen extends Component {
  state = {
    city: "Все города",
    model: "Выберите услугу",
    cities: null,
    models: null,
    mode: "cities",
    plot: true
  };
  handleFormChange = e => {
    const check = e.target.checked;
    const mode = !check ? "cities" : "models";
    this.setState({ mode });
  };
  handleTableChange = e => {
    const plot = e.target.checked;
    this.setState({ plot });
  };
  showResults = values => {
    let { city, service, model, startDate, endDate } = values;
    const cityCheck = city;
    const modelCheck = model;
    this.setState({ city, service, model, startDate, endDate });
  };

  render() {
    if (this.props.loaded && this.state.cities && this.state.models) {
      let title = "Количество новых устройств ";
      let dataForPlot = [];
      /* Here used to be some data collecting */
      const plot = (
        <div className={classes.PlotContainer}>
          <Plot
            // data = {dataForPlot}
            data={newDataForPlot}
          />
        </div>
      );
      const table = (
        <div className={classes.PlotContainer}>
          <Plot
            data={[
              {
                type: "table",
                columnwidth: [4, 1],
                header: {
                  values: headerValues
                },
                cells: {
                  values: cellValues
                }
              }
            ]}
          />
        </div>
      );
      return (
        <div className={classes.Container}>
          <div className={classes.FormContainer}>
            <Form
              className={classes.Form}
              onSubmit={this.showResults}
              initialValues={{
                city: this.state.city,
                service: "Выберите услугу",
                model: this.state.model,
                startDate: this.state.startDate, //startDateInitial,
                endDate: this.state.endDate //endDateInitial
              }}
            >
              {({ handleSubmit, submitting, values }) => (
                <form onSubmit={handleSubmit}>
                  <div className={classes.Controls}>
                    <div className={classes.controlsSecondRow}>
                      <div className={classes.SwitchDiv}>
                        <Field
                          name="plot"
                          className={classes.Input}
                          placeholder="Enter service type"
                        >
                          {({ input, placeholder, meta, className }) => (
                            <div className={classes.SwitchContainer}>
                              Таблица
                              <label
                                className={s.Switch + " " + classes.Switch}
                              >
                                <input
                                  type="checkbox"
                                  {...input}
                                  checked={this.state.plot === true}
                                  placeholder={placeholder}
                                  className={className}
                                  onChange={this.handleTableChange}
                                />
                                <span
                                  className={s.Slider + " " + classes.Switch}
                                />{" "}
                              </label>
                              График
                              {meta.error && meta.touched && (
                                <span>{meta.error}</span>
                              )}
                            </div>
                          )}
                        </Field>
                      </div>
                    </div>
                  </div>
                </form>
              )}
            </Form>
          </div>
          <div className={classes.fPlot}>
            <h3 style={{ margin: "20px 0px -50px 0px", zIndex: 1000 }}>
              {title}
            </h3>
            {!this.state.plot ? table : plot}
          </div>
        </div>
      );
    }
    return (
      <div className={classes.SpinnerWrap}>
        <Spinner />
      </div>
    );
  }
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(FirstSeen);

1 ответ

То, что вам нужно изменить, это способ привязки вашего флажка. this.state.plot === true,

<input
   type="checkbox"
   {...input}
   checked={this.state.plot}
   placeholder={placeholder}
   className={className}
   onChange={this.handleTableChange}
/>
Другие вопросы по тегам