2017-10-05 7 views
0

私は反応の中でスライドカルーセルを作成しています。私は解析して、それを解析してレンダリングのために親コンポーネントに送るjsonファイルにリストされたスライドコンポーネントを持たせたいと思います。私はそれがコンポーネントを渡すことによって行うことができますが、私はどのようにjsonの文字列から実際のコンポーネントにそれを解析するのか分からない。jsonデータから別のコンポネントを渡す

私のJSONは、このようなものです:

{ "slides": 
[ 
{ 
    "id": "slide0", 
    "title": "Slide: 0", 
    "caption": "Slide caption: 0", 
    "slideNum": 0, 
    "url": "adminLogins", 
    "slideType": "<AdminLoginsChart />" 
}, 
...etc. json 
]} 

私はこのような別のコンポーネントにコンポーネントを渡すことができます。

<Slide component={this.state.slides[this.state.slideNum].slideType}/> 

が、私はJSONの文字列としてでコンポーネントを持ったときに、私ができますそれを通過するコンポーネントに戻しているようです。引用符を何も置き換えないとJSON.parse(item)を実行するとjsonの解析エラーが発生します。誰かが文字列値をコンポーネントとして渡してみて、どうにかそれらをコンポーネントに変換しましたか?

答えて

2

もうすぐです!提供

const components = [{ 'YourComponent': YourComponentReference }]; 

const Slide = ({ 
    component, 
} => { 
    const Component = components[component]; 
    return (
    <Component /> 
); 
}); 
+0

これは私にとってはうまくいきません。私は、YourComponentをjsonファイル内の文字列表現にする必要があります。しかし、私が手動で引用符を使わないで状態にしても、コンポーネントを引っ張らない。 – bradrice

+0

あなたのメソッドを使ったjsfiddleの例を以下に示します。何かが間違って見える? https://jsfiddle.net/reactjs/69z2wepo/ – bradrice

+0

あなたはフィドルを使って私を見せてもらえますか?ここでは、あなたがここに示したように、別のコンポーネントから1つのコンポーネントを引き出そうとしています:https://jsfiddle.net/bradrice/69z2wepo/86971/パスの問題を忘れてください – bradrice

1

<Slide />で年代は、あなたがこのような何かをしたいレンダリング、その後

import YourComponent from './YourComponent';  

{ 
    slides: [{ 
    id: 'slide0', 
    title: 'Slide 0', 
    ... 
    slideType: 'YourComponent', 
    }], 
} 

:あなたはそれがJSONファイル(その文字列)であることする必要がある場合は、これを試してくださいあなたのコンポーネントはSlideコンポーネントと同じフォルダに保存され、javascriptファイルは大文字になります(例えばAdminLoginsChart.js)。コンポーネントの名前はJSONファイルで利用可能です(例えば "slideType": "AdminLoginsChart")。次のようにスライドコンポーネントを書き込むことができます:

class Slide extends React.Component { 

    render() { 
    const { component, ...props } = this.props; 
    const Component = require(`./${component}`).default; 
    return (
     <div className="slide> 
     <Component {...props} /> 
     </div> 
    ) 
    } 

} 

ファイル名にアンダースコアを使用している場合は、lodashsnakeCase関数を使用して、コンポーネント名をファイル名に変換することができます。

+0

私は試していますが、このエラーが発生しています:React.createElement:タイプが無効です - 文字列(組み込みコンポーネントの場合)またはクラス/関数(複合コンポーネントの場合)がありますが、未定義です。コンポーネントが定義されているファイルからコンポーネントをエクスポートするのを忘れている可能性があります。 – bradrice

+0

私の事例を自分の状況に適応させる必要があります。コンポーネントのファイル名がダッシュ記号で区切られた小文字の場合は、コンポーネント名の形式(例: AdminLoginsChartからadmin-logins-chartに変更します。 –

+0

申し訳ありませんが、私は 'component'変数を宣言していましたが、代わりに次の行で' componentName'を使用していました...修正済み! –

関連する問題