2017-10-15 23 views
0

jsx以外のReactプロジェクトをJSXに移行し、少しでも苦労して作業を開始する初期段階です。React JSXクラスライブラリのエクスポートが機能していません

私は、index.jsxファイルから作成するとシンプルなJSXコンポーネントを作成することができましたが、既存のコードと統合しようとしています。私は 'レガシー' Reactクラス私の新しいJSXクラスと一緒に。

マイDropdown.jsxコードは次のようになります。

class Dropdown extends React.Component { 

    constructor(props) { 
     super(props); 
     this.state = { 
     value: null, 
    }; 
} 

render() { 
    return <div> 
     <select name="carlist" form="carform"> 
      <option value="volvo">Volvo</option> 
      <option value="saab">Saab</option> 
      <option value="opel">Opel</option> 
      <option value="audi">Audi</option> 
     </select> 
    </div>; 
    } 
} 

export default Dropdown; 

次のように私はからリアクトコンポーネントをインスタンス化しようとしているhtmlファイルがある(これは私のレガシーコードのほとんどがどのように見えるかである)

var path = require('path') ; 

module.exports = { 
entry: { 
    react: [ './src/Dropdown.jsx' ] 
}, 
output: { 
    library: "Dropdown", 
    libraryTarget: "umd", 
    path: path.join(__dirname, 'dist'), 
    filename: '[name]-bundle.js' 
}, 
devtool: 'source-map', 
module: { 
    loaders: 
     [ 
      { 
       test: /\.js$/, 
       exclude: /node_modules/, 
       loaders: [ 
        'babel-loader' 
       ] 
      }, 
      { 
       test: /\.jsx$/, 
       exclude: /node_modules/, 
       loaders: [ 
        'babel-loader' 
       ] 
      } 

     ] 
} 
}; 

私は解像度の公平なビットを行ってきた:次のように

<!DOCTYPE html> 
<html lang="en" xmlns=""> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 

<div id="app"></div> 

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"></script> 

<script src="dist/react-bundle.js"></script> 

<script type="application/javascript"> 

    ReactDOM.render(
     React.createElement(Dropdown, {}, null), 
     document.getElementById('app') 
    ); 

</script> 

</body> 
</html>` 
そして、私のwebpack.config.jsファイルがありますこれを解決しようとしました。最後は、 'library'と 'libraryTarget'の設定をconfigファイルに追加していました。

スクリプトが(それは型エラーを発見していないクラスで失敗しないのIE)ドロップダウンクラスを認識しているようだが、私が代わりにfolloiwngを取得しています:

Warning: React.createElement: type should not be null, undefined, boolean, or number. 
It should be a string (for DOM elements) or a ReactClass (for composite components). 

私はからインスタンス化するとき、このクラスの作品を知っていますindex.jsxファイル

import React from 'react'; 
import ReactDOM from 'react-dom'; 

import Dropdown from './Dropdown'; 

ReactDOM.render(
<Dropdown />, 
document.getElementById('app') 
); 

export default Dropdown ; 

私は間違った方法でこの移行に近づいていますか? - JSX出力と古いReactコードを混在させて一致させることができると思ったでしょうか?

のWebPACKと事前

+0

React in Dropdown.jsx私は明らかに分かっていますが、ファイルに表示されていないbcozのものを確認したいのです –

+0

インポートを試みてくださいファイルの先頭で反応してください。 –

+0

ありがとうPiyush。私はいなかったが、それは蒸散時に不平を言うことはなかった。私は今インポートを追加しました。 –

答えて

1

で多くの感謝の事は、あなたが作成したクラスが適切に外の世界からカプセル化されているということです。あなたが受け取っているエラー

Warning: React.createElement: type should not be null, undefined, boolean, or number. 
It should be a string (for DOM elements) or a ReactClass (for composite components). 

Reactがクラス宣言をどこでも見つけることができないときに反応するのはエラーです。私はあなたが正しい道をたどるとindex.jsxファイルでそれをインスタンス化を示唆している間、あなたはまだ、これは必ず外部非ことになるだろう

window.Dropdown = Dropdown

Dropdown.jsxでこのハックを行うことでその作業を行うことができますwebpackコンパイルされたjavascriptは、ドロップダウンクラスを見ることができます。これは悪いことですが、グローバルな名前空間とそのベストプラクティスからクラスとライブラリを公開することからあなたを守るため、index.jsxファイルを使用することをお勧めします。

+0

Maruありがとうございます。これはベストプラクティスではありませんが、私は既存の古いスタイルのReactプロジェクトに新しいコードを組み込もうとしています。これはJSXを使用しません。 私はあなたの提案を試し、Dropdownクラス定義の最後に提案した行を追加しました。 バンドルファイルの新しい行が表示されますが、バンドルファイルが破損していると、その行が実行されていますが、createElement()と同じエラーが表示されます。 –

+0

My Apologies Maru - I Removedライブラリ: "Dropdown"、 libraryTarget: "umd"、webpack設定の行とそれが動作します!どうもありがとう! –

関連する問題