2017-09-14 18 views
0

私は現在、サイト内にあるカスタムサイドバーのコードをレンダリングしようとしていました。How to build a custom sidebar in React しかし、私はエラーを取得しています:不変違反:反応エラー#130

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. Check the render method of TheSidebar

私はそれが間違っていることを理解することはできませんが、私はリアクションに新しいです。ノード上で実行する。どんな助けもありがとうございます。ここ コードである:

const React = require('react'); 
const ReactDOM = require('react-dom'); 
const { IndexLink, Link } = require('react-router'); 
// import './Sidebar.scss' 
const classNames = require('classnames'); 




class TheSidebar extends React.Component { 

    constructor(props) { 
     super(props); 
     this.state = { 
      showMenu: false 
     } 
     this.toggleMenu = this.toggleMenu.bind(this) 
    } 
    componentDidMount() { 
     document.addEventListener('click', this.handleClickOutside.bind(this), true); 
    } 

    componentWillUnmount() { 
     document.removeEventListener('click', this.handleClickOutside.bind(this), true); 
    } 
    toggleMenu() { 
     this.setState({ showMenu: !this.state.showMenu }) 
    } 
    handleClickOutside(event) { 
     const domNode = ReactDOM.findDOMNode(this); 

     if ((!domNode || !domNode.contains(event.target))) { 
      this.setState({ 
       showMenu: false 
      }); 
     } 
    } 

    render() { 

     const showMenu = this.state.showMenu; 
     const sidebarClass = classNames({ 
      'sidebar': true, 
      'sidebar-menu-expanded': showMenu, 
      'sidebar-menu-collapsed': !showMenu 
     }); 

     const elementsClass = classNames({ 
      'expanded-element': true, 
      'is-hidden': !showMenu, 
     }); 



    return (
     <nav className={sidebarClass}> 
     <img 
      className="menuIcon" 
      // src={} 
      onClick={this.toggleMenu} 
     /> 
     <ul> 
      <li> 
      <Link className="expandable" to="/setting" title="Setting"> 
       <img 
       src={'https://png.icons8.com/setting/ffffff'} 
       alt="" 
       /> 
       <span className={elementsClass}>Setting</span> 
      </Link> 
      </li> 
     </ul> 
     </nav> 

     ); 
    } 
} 


module.exports = TheSidebar; 

サイドバー、ヘッダと共にアプリケーションファイル中に注入し、次にレンダリングされます。アプリのファイルとファイルをレンダリングし、以下のとおりです。

const React = require('react'); 
const Header = require('./Header.jsx'); 
const TheSidebar = require('./Sidebar.jsx'); 

class App extends React.Component { 
    render() { 
     return(
      <div> 
       <head> 
        <title>TESTING</title> 
       </head> 
       <body> 
        <div> 
         <Header /> 
        </div> 
        <div> 
         <TheSidebar /> 
        </div> 
       </body> 
      </div> 
     ); 
    } 
} 
module.exports = App; 

とレンダリング:

app.set('views', path.join(__dirname, "../views")); 
app.set('view engine', 'jsx'); 
app.engine('jsx', createEngine()); 
app.get("/testing", function(req, res){ 
    res.render('pages/App.jsx'); 
}); 
+0

react-routerの 'Link'コンポーネントが適切にインポートされていることを確認してください。 – Sulthan

+0

@Sulthanどのように正しくインポートされていることを確認できますか? –

+0

@Sulthanは、console.logのように、リンクが正しくインポートされていないとわかりません。理由は分かりません。 –

答えて

0

リンクとIndexLinkは、デフォルトのオブジェクトのエクスポート内のフィールドとしてエクスポートので、あなたが使用している場合、最初の取得デフォルトのエクスポート「を必要とされる」:

const ReactRouter = require('react-router') 

をそして、個々のフィールドを選びます:

const IndexLink = ReactRouter.IndexLink 
const Link = ReactRouter.Link 

EDIT:反応ルータのバージョンが4.0以上であれば、インデックスは内部でより長くなります。その反応ルータdomで。 IndexLinkはもはや利用できません。このコード例を実行するには、おそらく3.xに戻すべきです

+0

あなたのポイントは良いです。しかし、私はそれを試しただけで、エラーは依然として持続しています。 –

+0

@numus.273私の編集を参照してください。助けてくれるかもしれません:-) –

+0

はバージョン4.2なので、私はいつも元気に戻す必要があると思います:/ /しかし、どうやって元に戻すことができますか? –

0

あなたは正しくIndexLinkとリンクコンポーネントをインポートしていません。 ES6で名前付きのインポートをチェックしてください。

このようにインポートする必要があります。

import { IndexLink, Link } from 'react-router' 
+0

私はnode.jsで実行しているため、できません。私は実際に私のポストに、私の悪いことを追加する必要があります。 –

+0

このコンポーネントをアプリでどのように使用しているかを表示できますか?私はちょうど私のアプリでこの同じコードをコピーしたので、正常に動作しているようだ。 – codeslayer1

+0

私の投稿を編集したばかりです。そこにチェックしてください。 –

関連する問題