2017-03-23 5 views
1

私はReactJSアプリケーションを持っています。テーブルを持つページがあり、データを入力するためのモーダルを開く新しいレコードを作成するための作成ボタンがあります。それはうまく動作しますが、データを編集するために同じモーダルを再利用したいと思います。ユーザーは行を選択して[編集]をクリックできますが、必要なデータを取得できないようです。ReactJS Reuse Modal for Add and Edit

私のダイアログは次のようにページに含まれています。私は、ユーザーがまだ何も選択していませんので、それは常にときに、コンポーネントマウントnullになりますされてcomponentDidMountの問題でデータをフェッチしようとして呼び出しています]ダイアログコンポーネントで

render() { 
     return (
      <div> 
       <h2>Parameters</h2> 
       <div className="row"> 
        <ParameterDialog callback={this.fetchFromApi} messageCallback={this.props.messageCallback} open={this.state.modalOpen} openCallback={this.openModal} closeCallback={this.closeModal} selectedParameter={this.state.selectedRow} selectedParameterCallback={this.getSelectedParameter} /> 
        <div className="col-sm-10"> 
         <button type="button" onClick={this.onDelete} className="btn btn-danger pull-right" style={{marginRight: '15px', width: '80px'}}><span className="glyphicon glyphicon-remove"></span> Delete</button> 
         <button type="button" onClick={this.onEdit} className="btn btn-warning pull-right" style={{marginRight: '15px', width: '80px'}}><span className="glyphicon glyphicon-edit"></span> Edit</button> 
        </div> 
       </div> 
       <BootstrapTable data={this.state.parameters} options={options} pagination selectRow={{mode: 'radio', onSelect: this.onRowSelect}}> 
        <TableHeaderColumn isKey dataField='id'>ID</TableHeaderColumn> 
        <TableHeaderColumn dataField='groupId' filterFormatted dataFormat={enumFormatter} formatExtraData={this.props.parentState.parameterGroups} 
         filter={{type: 'SelectFilter', options: this.props.parentState.parameterGroups}}>Category</TableHeaderColumn> 
        <TableHeaderColumn dataField='subGroupId' filterFormatted dataFormat={enumFormatter} formatExtraData={this.state.subGroups} 
         filter={{type: 'SelectFilter', options: this.state.subGroups}}>Sub Category</TableHeaderColumn> 
        <TableHeaderColumn dataField='name' filter={ { type: 'TextFilter', delay: 500 } }>Parameter</TableHeaderColumn> 
        <TableHeaderColumn dataField='type' filterFormatted dataFormat={enumFormatter} formatExtraData={this.props.parentState.parameterTypes} 
             filter={{type: 'SelectFilter', options: this.props.parentState.parameterTypes}}>Type</TableHeaderColumn> 
        <TableHeaderColumn dataField='reboot'>Reboot</TableHeaderColumn> 
       </BootstrapTable> 
      </div> 
     ) 
    } 

componentDidMount() { 

    console.debug("ParameterDialog mounted..."); 

    axios({ 
     method: 'get', 
     url: urlBuilder.buildUrl('/api/groups'), 
     data: {}, 
    }).then(resp => { 
     this.setState({groups: resp.data}); 
    }).catch(error => { 
     this.props.messageCallback("Ohhhh snap!", "Unable to fetch data from server", Constants.MESSAGE_ERROR) 
    }); 

    axios({ 
     method: 'get', 
     url: urlBuilder.buildUrl(`/api/groups/2/subgroups`), 
     data: {} 
    }).then(resp => { 
     this.setState({subGroups: resp.data}); 
    }).catch(error => { 
     this.props.messageCallback("Ohhhh snap!", "Unable to fetch data from server", Constants.MESSAGE_ERROR) 
    }); 

    // init the state 
    this.setState({typeOptions: ['BOOLEAN', 'STRING', 'INTEGER', 'DECIMAL']}); 
    this.setState({selectedGroup: 2, parameter: '', description: null, type: 'BOOLEAN', rebootRequired: false}); 

    // if parameterId is present load record from database (Edit mode) 
    let parameterId = this.props.selectedParameterCallback(); 
    if (parameterId) { 
     console.debug("Parameter is being edited, loading record"); 
     this.editMode = true; 
     this.loadRecord(); 
    } 
} 

モーダルオープンプロパティは、親に結合したが、オープンの変更は、それがselectedParameter値を確認してからAPIかどうかを呼び出すための決定をする際にどのような私は本当に起こる必要があることですされています。

return (
     <div className="col-sm-2"> 
      <Button bsStyle="primary" onClick={this.props.openCallback}>Add Parameter</Button> 
      <Modal show={this.props.open} onHide={this.closeCallback}> 
       <Modal.Header> 
        <Modal.Title>Add/Edit Parameter</Modal.Title> 
       </Modal.Header> 
       ......... 

しかし、これはReactJSが動作するように望んでいる方法とは対照的であると思われる、私は考えることができる唯一のことは、親コンポーネントにすべての状態を移動することですが、それはそれは巨大になりますし、本当にいないようです良いモジュールデザインのように。

これを達成する別の方法はありますか?私がする必要があることを達成する親から子の機能を呼び出すことができると思う。

答えて

0

リアクションは、ビューの管理だけには最適ですが、ビューの背後にあるアクションは最適ではありません。

Reduxを使用することをお勧めします。 Reduxを使用すると、アクション作成者にAJAX呼び出しを行い、アプリケーション状態はレデューサーで維持されます。それはあなたの反応をかなり単純化し、維持しやすくします。

州をどこで維持するかについてのあなたの質問に関しては、Reduce州では減速機を使用していて、すべての州の変更はあなたのReactコンポーネントにPropsとして伝播します。親コンポーネント(ダイアログの親)がダイアログコンテンツをダイアログの小道具として渡すように、トップダウンの階層設計をしたいとします。このダイアログは、アクションの作成者にイベントを送信して、ロードおよび更新を行います。

関連する問題