2017-09-22 6 views
0

私は新しいブログを作成するか、既存のブログを編集するブログフォームを含むブートストラップモーダルコンポーネントを持っています。モーダルコンポーネントで編集するブログを選択すると、ajaxが呼び出され、フォームデータが自動入力されます。コンポーネントを非表示にして、コンポーネントWillRecievePropsを使用して小道具を処理する

私の親コンポーネントは次のようになります。

class Dashboard extends React.Component { 
    ... 
    editSelectedBlog(blog){ 
    this.setState({ selectedBlog: blog, modalShown: true, blogEditing: true }, this.showModal) 
    } 

    showNewBlogModal() { 
    this.setState({ modalShown: true, blogEditing: false }, this.showModal) 
    } 

    showModal() { 
    $('#addBlog').modal('show') 
    } 

    hideModal(updateBlogs = false) { 
    this.setState({ modalShown: false, blogEditing: false }) 
    if (updateBlogs) { // call ajax and fetch updated blogs } 
    } 

    render() { 
    ... 
    <Blogs> 
     {blogs.map((blog) => { 
     return (
      <Blog 
      key={shortid.generate()} 
      blog={blog} 
      onEditItem={this.editSelectedBlog} 
      /> 
     ) 
     } 
    )} 
    </Blogs> 
    {modalShown && 
     <BlogModal 
     postApi={someUrl} 
     selectedBlogId={this.state.selectedBlog? this.state.selectedBlog.id : undefined} 
     onModalHide={this.hideModal} 

     /> 
    } 
    <div role="presentation" onClick={this.showNewBlogModal} > Add new blog 
    </div> 
    } 
} 

ブログのモーダルコンポーネントは次のようになります。

class BlogModal extends React.Component { 
    ... 
    componentWillMount() { 
    if(selectedBlogId){ // call ajax for blog using blog id and set blog form data } 
    } 

    render() { 
    const isEditing = this.props.selectedBlogId !== undefined 
    return (
     .... 
     {isEditing ? (
      <button type="button" onClick={this.editSelectedBlog}>Update</button> 
     ) : (
      <button type="button" onClick={this.addNewBlog}>Save</button> 
     ) 
     } 
    ) 
    } 

BlogModal.defaultProps = { 
    blog: { 
    title: '', 
    date: '', 
    content: '' 
    } 
} 

は、モーダルを隠し、その後 componentWillMount方法でAJAXを呼び出すこの方法が推奨されますか私は modalShown条件を削除し、常にモーダルを維持し、その後 BlogModalcomponentWillRecieveProps方法で編集するためのAJAXリクエストを処理する必要がありますか?

答えて

1

まず、componentDidMount()でajaxコールを行う必要があります。

React docs suggestこれはcomponentWillMount()ではなくネットワーク要求/副作用を実行するのに適した場所です。

第2に、ダッシュボードとBlogModalの両方にロジックを振りかける方法は理想的ではないと思います。代わりに、BlogModalから取り出したブログデータをダッシュ​​ボードに移動します。このようにして、あなたのBlogModalはUIを「プレゼンテーション」することだけを心配しています。これは、一般的にコンテナおよびプレゼンテーションコンポーネントまたはスマートおよびダムコンポーネントと呼ばれる概念です。ダン・アブラモフはこのコンセプトについてa good articleを持っています。

+0

ありがとうございました。また、新しいブログの作成や既存のブログの更新に使用される保存ボタンと更新ボタンがモーダルにあります。 Post/Put Ajaxを親メソッドにも移動する必要がありますか?私はこれらの2つの方法がモーダルの一部でなければならないと思います、私が間違っているかどうかを教えてください。 –

+0

その場合、おそらくDashboardはBlogModalの表示/非表示のみになります。その後、すべてのロジックをBlogModalに移動します。次に、ボタンをレンダリングするための別個のコンポーネントを作成します。 BlogModalActions - とコンテンツ/フォーム - たとえばBlogModalForm。 その後、BlogModalはすべてのハンドラと非同期を処理し、子プロセスはコールする小道具としてコールバックを受け取ります。即ちそれらは提示的である。 – patrick

関連する問題