2016-11-30 11 views
0

Next.jsでは、Reactコンポーネントで最初の読み込み時にサーバー側のレンダリングにバインドされたライフサイクルメソッドを使用できます。Next.js ReactコンポーネントgetInitialPropsが小道具をバインドしない

the ZEIT tutorial(あるいはon their Github)に示されているようにこの関数を使用しようとしましたが、this.propsはJSONを関数から返さないようです。 コンポーネントをクリックすると、空のオブジェクトが表示されます。

import React from 'react' 
import 'isomorphic-fetch' 
export default class extends React.Component { 
    static async getInitialProps() { 
     const res = await fetch('https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json') 
     const data = await res.json() 
     return { data } 
    } 
    print() { 
     console.log(this.props); 
    } 
    render() { 
     return <div onClick={this.print.bind(this)}>print props</div> 
    } 
} 
+0

これは/ pagesコンポーネントで取得する必要があります。さもなければ、getInitialPropsは呼び出されません。ページやコンポーネントを定義していますか? – elmasse

答えて

0

getInitialProps私が正しくリコール場合React.createClassの機能であり、React.Componentのために存在していません。

あなたには、いくつかのデータを取得したい場合は、(WillMountが推奨されません)componentDidMountでそれを行います。あなたのレンダリング関数は、最初のレンダリングにフェッチされたデータがないことに気付かなければなりません。またフェッチを1レベル上に移動し、コンポーネントを「ダンベル」にして、表示する特定の小道具を受け取るだけです(推奨)。

はまた、あなたが唯一のあなたは自分のエントリポイントファイルまたはその付近でこれを行うことができますので、一度お使いのアプリで同型フェッチインポートする必要があります注意してください。

import React, { Component } from 'react' 

export default class extends Component { 
    constructor() { 
     super(); 
     this.state = {}; 
    } 
    async componentDidMount() { 
     const res = await fetch('https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json'); 
     const data = await res.json(); 
     this.setState({ data }); 
    } 
    render() { 
     const data = this.state.data; 
     if (!data) { 
      return <div>Loading...</div>; 
     } 
     return <div>{JSON.stringify(data)}</div> 
    } 
} 
+0

[next.js 'Github](https://github.com/zeit/next.js#component-lifecycle)で提供されている例では、コンポーネントは次のように定義されています: 'export default class extends React.Component' – OhmWang

+0

ああ、私は 'getInitialProps'は' next.js'の特別なメソッドだと思います。 "最上位コンポーネントは、ルートのロードをブロックするgetInitialPropsを定義できます(サーバーレンダリングまたは遅延ロードのいずれか)。 –

0

私はあなたのコードを試してみましたし、正常に動作するよう、コンソールがthis.propsを示しています

Result object

0

あなたは

あなたのコードに少し変更して、このようgetInitialProps方法であなたの電話をかけることができます
import React from 'react' 
import 'isomorphic-fetch' 
export default class extends React.Component { 
    static async getInitialProps() { 
     const res = await fetch('https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json') 
     const data = await res.json() 
     return { jsonData: data } 
    } 
    print() { 
     console.log(this.props.jsonData); 
    } 
    render() { 
     return <div onClick={()=> this.print()}>print props</div> 
    } 
} 
関連する問題