在 React 中更改页面时 Apexchart 消失

Apexchart disappearing when changing page in React

我的主页上显示了一个图表。该图正常显示,但是当我切换到我的应用程序中的页面并返回主页时,该图消失了。

我在 React 中使用路由系统在我的页面之间切换。

正在渲染的图形的反应组件:

import React,{Component} from 'react'; 

class Widget1 extends React.Component{
    render(){
        return(
            <div> 

                    {/*begin::Stats Widget 1*/}
                    <div className="card card-custom gutter-b">
                        {/*begin::Body*/}
                        <div className="card-body p-0">
                          <div className="d-flex align-items-center justify-content-between card-spacer flex-grow-1">
                            <span className="symbol symbol-circle symbol-50 symbol-light-danger mr-2">
                              <span className="symbol-label">
                                <span className="svg-icon svg-icon-xl svg-icon-danger">
                                  {/*begin::Svg Icon | path:assets/media/svg/icons/Layout/Layout-4-blocks.svg*/}
                                  <svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1">
                                    <g stroke="none" strokeWidth={1} fill="none" fillRule="evenodd">
                                      <rect x={0} y={0} width={24} height={24} />
                                      <rect fill="#000000" x={4} y={4} width={7} height={7} rx="1.5" />
                                      <path d="M5.5,13 L9.5,13 C10.3284271,13 11,13.6715729 11,14.5 L11,18.5 C11,19.3284271 10.3284271,20 9.5,20 L5.5,20 C4.67157288,20 4,19.3284271 4,18.5 L4,14.5 C4,13.6715729 4.67157288,13 5.5,13 Z M14.5,4 L18.5,4 C19.3284271,4 20,4.67157288 20,5.5 L20,9.5 C20,10.3284271 19.3284271,11 18.5,11 L14.5,11 C13.6715729,11 13,10.3284271 13,9.5 L13,5.5 C13,4.67157288 13.6715729,4 14.5,4 Z M14.5,13 L18.5,13 C19.3284271,13 20,13.6715729 20,14.5 L20,18.5 C20,19.3284271 19.3284271,20 18.5,20 L14.5,20 C13.6715729,20 13,19.3284271 13,18.5 L13,14.5 C13,13.6715729 13.6715729,13 14.5,13 Z" fill="#000000" opacity="0.3" />
                                    </g>
                                  </svg>
                                  {/*end::Svg Icon*/}
                                </span>
                              </span>
                            </span>
                            <div className="d-flex flex-column text-right">
                              <span className="text-dark-75 font-weight-bolder font-size-h3">12000 dh</span>
                              <span className="text-muted font-weight-bold mt-2">Revenu hebdomadaire</span>
                            </div>
                          </div>
                          <div id="kt_stats_widget_11_chart" className="card-rounded-bottom" data-color="danger" style={{height: 150}} />
                        </div>
                        {/*end::Body*/}
                      </div>
                      {/*end::Stats Widget 1*/}


            </div>
        )
    }
}

export default Widget1;

图表的javascript(月份、颜色等..):

var _initStatsWidget11 = function () {
        var element = document.getElementById("kt_stats_widget_11_chart");

        var height = parseInt(KTUtil.css(element, 'height'));
        var color = KTUtil.hasAttr(element, 'data-color') ? KTUtil.attr(element, 'data-color') : 'success';

        if (!element) {
            return;
        }

        var options = {
            series: [{
                name: 'Profit',
                data: [40, 40, 30, 30, 35, 35, 50]
            }],
            chart: {
                type: 'area',
                height: 150,
                toolbar: {
                    show: false
                },
                zoom: {
                    enabled: false
                },
                sparkline: {
                    enabled: true
                }
            },
            plotOptions: {},
            legend: {
                show: false
            },
            dataLabels: {
                enabled: false
            },
            fill: {
                type: 'solid',
                opacity: 1
            },
            stroke: {
                curve: 'smooth',
                show: true,
                width: 3,
                colors: [KTApp.getSettings()['colors']['theme']['base'][color]]
            },
            xaxis: {
                categories: ['Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Aug', 'Sep'],
                axisBorder: {
                    show: false,
                },
                axisTicks: {
                    show: false
                },
                labels: {
                    show: false,
                    style: {
                        colors: KTApp.getSettings()['colors']['gray']['gray-500'],
                        fontSize: '12px',
                        fontFamily: KTApp.getSettings()['font-family']
                    }
                },
                crosshairs: {
                    show: false,
                    position: 'front',
                    stroke: {
                        color: KTApp.getSettings()['colors']['gray']['gray-300'],
                        width: 1,
                        dashArray: 3
                    }
                },
                tooltip: {
                    enabled: true,
                    formatter: undefined,
                    offsetY: 0,
                    style: {
                        fontSize: '12px',
                        fontFamily: KTApp.getSettings()['font-family']
                    }
                }
            },
            yaxis: {
                min: 0,
                max: 55,
                labels: {
                    show: false,
                    style: {
                        colors: KTApp.getSettings()['colors']['gray']['gray-500'],
                        fontSize: '12px',
                        fontFamily: KTApp.getSettings()['font-family']
                    }
                }
            },
            states: {
                normal: {
                    filter: {
                        type: 'none',
                        value: 0
                    }
                },
                hover: {
                    filter: {
                        type: 'none',
                        value: 0
                    }
                },
                active: {
                    allowMultipleDataPointsSelection: false,
                    filter: {
                        type: 'none',
                        value: 0
                    }
                }
            },
            tooltip: {
                style: {
                    fontSize: '12px',
                    fontFamily: KTApp.getSettings()['font-family']
                },
                y: {
                    formatter: function (val) {
                        return "$" + val + " thousands"
                    }
                }
            },
            colors: [KTApp.getSettings()['colors']['theme']['light'][color]],
            markers: {
                colors: [KTApp.getSettings()['colors']['theme']['light'][color]],
                strokeColor: [KTApp.getSettings()['colors']['theme']['base'][color]],
                strokeWidth: 3
            }
        };

        var chart = new ApexCharts(element, options);
        chart.render();
    }

App.js 用于页面切换:

import Home from './pages/home';
import HeaderMenu from './components/HeaderMenu';
import Menu from './components/menu';
import Widget1 from './components/Widget1';
import Patient from './pages/patients';
import logo from './logo.svg';
import './App.css';
import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; 
 


const App = () => { 
    return (
      <div>
        <Router>

          <Menu /> 
          <HeaderMenu />  
            <Switch>
             <Route exact path="/"  component={Home}>
                <Home />
            </Route>

            <Route path='/patients' component={Patient}>
                <Patient />
            </Route> 
          </Switch> 
          
        </Router>
      </div>
    )
    
}

export default App;

如果您先通过 /patients 启动您的应用程序,然后转到您的应用程序组件,那么这也不会起作用。 所以,这不是来回走动的问题。您的图表初始化函数是在代码中某处开始调用的,因此当您的图表组件首先呈现时,代码获取 dom 元素并对其进行初始化。但是在导航时,只有组件代码运行,而将重新初始化抛在脑后。因此,在需要图表的 Home 组件的 componentDidMount 生命周期中调用 init 函数。