2017-06-18 12 views
0

初めてコンポーネントを読み込もうとすると、親状態が子に完全に渡されます。すべてのものがよく見えます。しかし、私は私のページを更新するとき、私はちょうど子供が渡される状態を見ることができません。私はちょうど子供からのいくつかの静的コンテンツを参照してください。続いて私の親である:反応ページをリフレッシュすると親状態が子状態になりません

render(){ 

    const {courses} = this.props; 
    // debugger; 
    let fn = (child) => { 
     return React.cloneElement(child, { 
      courses: courses 
     }); 
    }; 

    let childrenWithProps = React.Children.map(this.props.children, fn); 

    return (
     <div> 
      <div className="container jumbotron jumbotron-fluid"> 
       <h1>CoursesPage</h1> 
       <p>This page adds and lists all the courses</p> 
       <Link to="/courses/courseslist"> 
        <Button color="primary">Course Listing</Button> 
       </Link> 
      </div> 
      {childrenWithProps} 
     </div> 

    ); 
} 
} 

CoursesPage.propTypes = { 
    courses: PropTypes.array.isRequired, 
    actions: PropTypes.object.isRequired, 
    children: PropTypes.object.isRequired 
}; 

function mapStateToProps(state, ownProps){ 
    return { 
     courses: state.courses 
    }; 
} 

//mapping all course actions to actions in the props 
function mapDispatchToProps(dispatch){ 
    return { 
     actions: bindActionCreators(courseActions, dispatch) 
    }; 
} 


export default connect(mapStateToProps, mapDispatchToProps)(CoursesPage); 

また、これは私の子コンポーネントである:

class CourseDetailsAndList extends React.Component { 
constructor(props, context){ 
     super(props, context); 
     this.state = { 
      courses: this.props.courses 
     }; 
    } 
render(){ 
    const {courses} = this.props; 
    return (
     <div> 
      <h1>Courses</h1> 
      <CourseList courses={this.state.courses}/> 
     </div> 
    ); 
    } 
} 

CourseDetailsAndList.propTypes = { 
    courses: PropTypes.array.isRequired 
}; 

私はページを更新すると、私はちょうど空白の子供を参照してください、子供に渡されたコースの状態が表示されません。同じ行に、私は確かにその理由の一つに見えるコンソールでこの警告を参照してください:私は子コンポーネントの状態を渡す間違ったつもりどこ

Warning: Failed prop type: The prop `courses` is marked as required in `CourseDetailsAndList`, but its value is `undefined`. 
in CourseDetailsAndList (created by RouterContext) 
in RouterContext (created by Router) 
in Router 
in Provider 

誰かが私に教えていただけますか?そしてなぜ警告?

+0

あなたが '' CoursesPage.propTypes'でコメントアウトcourses'持っています。 'CoursesPage.courses'に有効な値を渡していますか? – Scott

+0

@Scottはい正しい値を渡しています。ボタンのonclickイベントは、最初のインスタンスでデータを正しく引き出します。ページをリフレッシュすると、データだけでなく子が表示されます。つまり、GETデータへのアクションがトリガーされません。しかし、私はどこに間違っているのか理解していません。子コンポーネントにもmapDispatchToPropsが必要ですか? – Omkar

+0

'mapDispatchToProps'は還元型ヘルパーメソッドです。このインスタンスで使用するかどうかは、このアプリケーションでreduxを使用しているかどうかに基づいています。上記で共有したコードには が含まれていますが、あなたは 'CoursesPage'コンポーネントの' render'メソッドのみを含んでいます。コンポーネント全体を共有できますか? – Scott

答えて

1

は、ここでは、あなたのコンポーネントの単純化されたバージョンを使用して、達成しようとしているものの作業例です:

https://jsfiddle.net/79qk1r50/2/

class ParentComponent extends React.Component { 
    render() { 
    const {parentProp} = this.props; 
    const childrenWithProps = React.Children.map(this.props.children, function(child) { 
     return React.cloneElement(child, {parentProp: parentProp}); 
    }); 

    return (
     <div> 
     <h1>ParentComponent</h1> 
     My parentProp is: {parentProp} 
     {childrenWithProps} 
     </div> 
    ); 
    } 
} 

class ChildComponent extends React.Component { 
    render(){ 
    const {parentProp} = this.props; 
    return (
     <div> 
     <h2>Child Component</h2> 
     Received from parent: {parentProp} 
     </div> 
    ); 
    } 
} 

React.render(
    <ParentComponent parentProp={'foo'}> 
    <ChildComponent /> 
    <ChildComponent />  
    </ParentComponent>, 
    document.getElementById('container')); 
+0

ちょっとスコット、これは間違いなく働いていますが、私はrender-functionをレンダリング機能でハードコーディングする代わりに、子コンポーネントをレンダリングするために反応ルータを使用していました。 – Omkar

関連する問題