代码之家  ›  专栏  ›  技术社区  ›  TechSavy

类型错误:使用反应图表时试图破坏不可重复实例的尝试无效

  •  2
  • TechSavy  · 技术社区  · 6 年前

    我已经使用SSR(servder-side-rendering)呈现了一个react应用程序。我正在使用 react-charts 在React组件中显示图表,但这会给出错误说明:

    类型错误:试图破坏不可iterable实例的尝试无效

    web包.config.js

    const path = require("path");
    module.exports = {
      entry: {
        client: "./src/client.js",
        bundle: "./src/bundle.js"
      },
      output: {
        path: path.resolve(__dirname, "assets"),
        filename: "[name].js"
      },
      module: {
        rules: [
          {
            test: /\.(js|jsx)?$/,
            exclude: /node_modules/,
            loader: "babel-loader",
            query: {
              presets: ["@babel/preset-env", "@babel/preset-react"]
            }
          }
        ]
      },
      resolve: {
        extensions: [".jsx", ".js"]
      }
    };
    

    巴贝尔克:

    {
        "presets": ["@babel/env", "@babel/react"],
        "plugins": [
            "@babel/plugin-proposal-class-properties"
        ]
    }
    

    App.JS:

    import React, { Component } from "react";
    import { Router, Route, Switch } from "react-router-dom";
    import Header from "./Header_footer/Header";
    import Footer from "./Header_footer/Footer";
    import Home from "./Home";
    
    import createMemoryHistory from "history/createMemoryHistory";
    
    const history = createMemoryHistory();
    
    class App extends Component {
      render() {
        return (
          <Router history={history}>
            <React.Fragment>
              <Header />
              <Switch>
                <Route exact path="/" component={Home} />
              </Switch>
              <Footer />
            </React.Fragment>
          </Router>
        );
      }
    }
    
    export default App;
    

    我编写图表代码的组件:

    import React, { Component } from "react";
    import Sidebar from "./Sidebar";
    import { Chart } from "react-charts";
    import axios from "axios";
    
    const qs = require("qs");
    
    class Home extends Component {
    state = {
        datelist: [],
        chart_data: [],
        loading: true
    };
    
    componentDidMount() {
        this.getDatesList();
    }
    
    getDatesList() {
        axios.get("http://127.0.0.1:8001/dateslist/").then(res => {
        if (res.data.result === 1) {
            this.setState({ datelist: res.data.data });
        } else {
            this.setState({ datelist: [] });
        }
        });
    }
    
    handleChange = event => {
        var dateval = event.target.value;
        if (dateval === "select") {
        this.setState({ chart_data: [] });
        } else {
        axios
            .post(
            `http://127.0.0.1:8001/pricedata/`,
            qs.stringify({ date: dateval })
            )
            .then(res => {
            if (res.data.result === 1) {
                this.setState({
                chart_data: [
                    {
                    label: "price1",
                    data: res.data.data.map(d => ({ x: d.strike, y: d.price1 }))
                    },
                    {
                    label: "price2",
                    data: res.data.data.map(d => ({ x: d.strike, y: d.price2 }))
                    }
                ], loading: false
                });
            } else {
                this.setState({ chart_data: [] });
            }
            });
        }
    };
    
    render() {
        return (
        <div className="container container_padding">
            <div className="row">
            <Sidebar />
            <div className="col-md-9 col-sm-9 col-xs-12">
                <select
                className="form-control"
                style={{ width: "120px", marginBottom: "10px" }}
                onChange={this.handleChange}
                >
                <option value="select">Select</option>
                {this.state.datelist.map((date, i) => (
                    <option value={date} key={i}>
                    {date}
                    </option>
                ))}
                </select>
                <div
                style={{
                    width: "600px",
                    height: "300px",
                    marginTop: "35px",
                    marginLeft: "25px"
                }}
                >
                <Chart
                    data={this.state.chart_data}
                    series={{ type: "bar" }}
                    axes={[
                    { primary: true, type: "ordinal", position: "bottom" },
                    { type: "linear", position: "left", min: 0 }
                    ]}
                    primaryCursor
                    secondaryCursor
                    tooltip
                />
                </div>
            </div>
            </div>
        </div>
        );
    }
    }
    
    export default Home;
    

    有配置问题吗?

    如果我删除 <Charts> 从部件上看,一切正常。这里缺少什么?有什么问题吗 .babelrc webpack.config.js ?

    更新 :完全错误stacktrace:

    TypeError: Invalid attempt to destructure non-iterable instance
        at /usr/projects/myproject/node_modules/react-charts/dist/index.js:138:13
        at ChartInner (/usr/projects/myproject/node_modules/react-charts/dist/index.js:4547:22)
        at HookComponent.render (/usr/projects/myproject/node_modules/react-charts/dist/index.js:339:19)
        at processChild (/usr/projects/myproject/node_modules/react-dom/cjs/react-dom-server.node.development.js:2863:18)
        at resolve (/usr/projects/myproject/node_modules/react-dom/cjs/react-dom-server.node.development.js:2716:5)
        at ReactDOMServerRenderer.render (/usr/projects/myproject/node_modules/react-dom/cjs/react-dom-server.node.development.js:3100:22)
        at ReactDOMServerRenderer.read (/usr/projects/myproject/node_modules/react-dom/cjs/react-dom-server.node.development.js:3059:29)
        at renderToString (/usr/projects/myproject/node_modules/react-dom/cjs/react-dom-server.node.development.js:3526:27)
        at render (/usr/projects/myproject/views/server.js:18:44)
        at app.get (/usr/projects/myproject/index.js:28:39)
    

    感谢您的帮助。

    事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   TechSavy    6 年前

    我已经解决了我的问题,我在这里张贴,以防其他人也面临类似的问题。

    我一直保持着 loading 状态和加载 <Chart> 仅当从API中提取数据时标记,如:

      {this.state.loading ? (
              ""
            ) : (
              <div
                style={{
                  width: "600px",
                  height: "300px",
                  marginTop: "35px",
                  marginLeft: "25px"
                }}
              >
                <Chart
                  data={this.state.chart_data}
                  series={{ type: "bar" }}
                  axes={[
                    { primary: true, type: "ordinal", position: "bottom" },
                    { type: "linear", position: "left", min: 0 }
                  ]}
                  primaryCursor
                  secondaryCursor
                  tooltip
                />
              </div>
            )}