2017-11-15 16 views
3

静的propTypeで必要な文字列値として設定したいmatch> paramsオブジェクトに、Reactルータから渡された小道具を持っています。 photo:PropTypes.string.isRequiredと設定するとエラーが発生します。React Router 4でPropTypes isRequired params prop

Warning: Failed prop type: The prop `photo` is marked as required in `BlogEntry`, but its value is `undefined`. 

私がルータの小道具を経由して来るもののログを見ると、私は写真が文字列idであることがわかります。

const {match:{params:{photo}}} = this.props; 
console.log("photo = ", photo); 
// result: 
photo = 5a03c474e1bbc026de896aa8 

写真に必要なタイプのバリデーションはありますか?

これは私の設定です。

import React, {Component} from 'react'; 
import {connect} from 'react-redux'; 
import PropTypes from 'prop-types'; 
import {fetchBlogEntry} from '../../actions/index'; 
import BlogPost from '../../components/client/blog-post'; 

class BlogEntry extends Component{ 

    constructor(props){ 
    super(props); 
    console.log('constructor = ', this.props.match.params.photo); 
    } 

    static propTypes={ 
    entry: PropTypes.object.isRequired, 
    photo: PropTypes.string.isRequired 
    } 

    componentWillMount(){ 
    const {match:{params:{photo}}} = this.props; 
    console.log("photo = ", photo); 
    this.props.fetchBlogEntry(photo); 
    } 

    render(){ 
    const {entry} = this.props; 
    return(
     <div id='blog' className='container'> 
     <BlogPost {...entry}/> 
     </div> 
    ) 
    } 
} 

function mapStateToProps({blog:{entry}}){ 
    return{ 
    entry 
    } 
} 

export default connect(({blog:{entry}}) => ({entry}), {fetchBlogEntry})(BlogEntry); 

答えて

4

チェック写真を入力するには、React Routerから来ている場合は、それが一致すると予想するように小道具を交換する必要があります。例えば

私はprops.match.params.name私proptypesに をチェックすると入力したい場合は、次のようになります。

match: PropTypes.shape({ 
    params: PropTypes.shape({ 
     name: PropTypes.string.isRequired 
    }) 
    }), 
+0

優れたおかげ。あなたはシェイプを少し説明してくれるでしょうか? "特定の形を取るオブジェクト"。入れ子にされたオブジェクトにシェイプを使用することとは別に、それは何を意味するのか、正確に行うのかまたは、それだけです(ネストされた小道具の検証を許可します) –

+0

他の誰かがあなたのコードを試しても少し修正します。名前:Proptypes.string.isRequiredは名前である必要があります:PropTypes.string.isRequired。 PropTypeの資本T –

+1

Shapeを使うと、オブジェクトのフィールドを記述することができます。だから、それがオブジェクトだと言っているのではなく、このように見えるオブジェクトを言うことができます。 'objectOf'のようにオブジェクトを記述するための他のpropタイプもありますが、記述的ではありません。また、私の例を修正しました。 – Dakota

関連する問題