2017-03-03 128 views
3

我想將this example使用反應數據網格複製到我的Typescript項目中。我創建了下面的類來匹配提供的一個....Gettting React.createElement:類型無效 - 期望一個字符串...但得到:undefined

import * as React from "react"; 
import ReactDataGrid from "react-data-grid"; 
interface PxGridProps {} 
interface PxGridState {} 
export default class PxGrid extends React.Component<PxGridProps, PxGridState>{ 
    private _columns; 
    private _rows; 
    constructor(props) { 
     super(props); 
     this.props = props; 
     this.createRows(); 
     this._columns = [ 
      { key: 'id', name: 'ID' }, 
      { key: 'title', name: 'Title' }, 
      { key: 'count', name: 'Count' } ]; 
     return null; 
    } 

    createRows() { 
     let rows = []; 
     for (let i = 1; i < 1000; i++) { 
      rows.push({ 
       id: i, 
       title: 'Title ' + i, 
       count: i * 1000 
      }); 
     } 

     this._rows = rows; 
    } 

    rowGetter(i) { 
     return this._rows[i]; 
    } 

    render() { 
     return (
      <ReactDataGrid 
       minHeight={500} 
       columns={this._columns} 
       rowGetter={this.rowGetter.bind(this)} 
       rowsCount={this._rows.length} 
       /> 
     ); 
    } 
} 

但是當我嘗試運行它,我得到

警告:React.createElement:類型無效 - 預期字符串(對於內置組件)或類/函數(對於複合組件),但得到:未定義。您可能忘記從您定義的文件中導出組件。檢查PxGrid的渲染方法。

如果我更換了渲染這樣的事情....

render() { 
     return (
      <h1> Thing </h1> 
     ); 
} 

它工作正常。我錯了什麼?錯誤消息根本沒有幫助。

+0

您的導入是否真的有效?你'npm安裝'? –

+0

是的,謝謝你,我真的想通了,我會發布答案。 – Jackie

回答

0

不知道太多關於打字稿,檢查該工作代碼和做的修改,應該在你的情況下,也工作:

class Example extends React.Component{ 
 
    constructor() { 
 
    super(); 
 
    this._columns = [ 
 
     { key: 'id', name: 'ID' }, 
 
     { key: 'title', name: 'Title' }, 
 
     { key: 'count', name: 'Count' } ]; 
 
    this._rows = this.createRows(); 
 
    } 
 
    
 
    createRows() { 
 
    let rows = []; 
 
    for (let i = 1; i < 1000; i++) { 
 
     rows.push({ 
 
     id: i, 
 
     title: 'Title ' + i, 
 
     count: i * 1000 
 
     }); 
 
    } 
 
    return rows; 
 
    } 
 

 
    rowGetter(i) { 
 
    return this._rows[i]; 
 
    } 
 

 
    render() { 
 
    return (
 
     <ReactDataGrid 
 
     columns={this._columns} 
 
     rowGetter={this.rowGetter.bind(this)} 
 
     rowsCount={this._rows.length} 
 
     minHeight={500} />); 
 
    } 
 
} 
 

 
ReactDOM.render(
 
    <Example />, 
 
    document.getElementById('container') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<script type="text/javascript" src="https://npmcdn.com/react-data-grid/dist/react-data-grid.min.js"></script> 
 

 
<div id='container'/>

+0

代碼實際上是確定的,這是一個導入問題。謝謝你! – Jackie

2

這是進口的問題。不知道是什麼導致它,但是當我有import ReactDataGrid from "react-data-grid";和調試上

render() { 
    return (
     <ReactDataGrid 
      minHeight={500} 
      columns={this._columns} 
      rowGetter={this.rowGetter.bind(this)} 
      rowsCount={this._rows.length} 
      /> 
    ); 
} 

我看到ReactDataGrid是不確定的。出於某種原因,我需要改變我的進口...

import * as ReactDataGrid from "react-data-grid";

所有的一切都開始正常工作。

+1

用'*'導入時,所有導出的函數都會導入到文件中(在您的情況下可能不需要)。如果沒有默認導出,簡單'import ReactDataGrid ...'不起作用。所以,如果你只想導入'ReactDataGrid',你可以通過編寫'react-data-grid''導入{ReactDataGrid}來完成。 –

+0

我試過了,它不起作用。當我從'react-data-grid''導入{ReactDataGrid}時,它返回undefined,但是將'import *作爲ReactDataGrid從「react-data-grid」中返回;'返回了正確的功能 – Jackie

+1

這意味着導出的函數名稱不同(不是'ReactDataGrid')。但是,由於您導入所有函數('*')並將其別名創建爲「ReactDataGrid」,這意味着只有一個函數,所以您的方法沒問題。請記住,如果添加更多方法,這可能會破壞您的應用程序。您可以檢查源代碼以查看組件的名稱,以便只導入該組件。雖然有趣的情況! –

相關問題