2016-09-28 15 views
0

私のReactアプリケーションのさまざまなコンポーネントから「ユーザーログインのモーダル」と言うモーダルを開きたいとします。例:私は、モーダルをA.jsB.jsおよびC.jsから開きたいです。そこで私はModalWindow.jsという新しいコンポーネントを作成しました。これにはA.jsB.jsC.jsにインポートされました。React js:異なるコンポーネントから同じモーダルを開く

問題は、Modalが表示/非表示にするすべての3つのコンポーネントで状態showModal: falseを維持する必要があることです。とにかく、私は単一の状態を維持しなければならないのですか?

1つの方法は、親コンポーネントに状態を維持することです。しかし、可能な方法はありますか?

X.js

import A from 'A.js' 
import B from 'B.js' 
import C from 'C.js' 

class X extends Component { 
    return(
    render{ 
     <div> 
     <A /> 
     <B /> 
     <C /> 
     </div> 
    } 
) 
} 

export default X 

A.js

import ModalWindow from 'ModalWindow.js' 

class A extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showModal: false 
    }; 
    } 
    return(
    render{ 
     <ModalWindow show={this.state.showModal} container={this}/> 
    } 
) 
} 

export default A 

B.js

import ModalWindow from 'ModalWindow.js' 

class B extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showModal: false 
    }; 
    } 
    return(
    render{ 
     <ModalWindow show={this.state.showModal} container={this}/> 
    } 
) 
} 

export default B 

C.js

import ModalWindow from 'ModalWindow.js' 

class C extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showModal: false 
    }; 
    } 
    return(
    render{ 
     <ModalWindow show={this.state.showModal} container={this}/> 
    } 
) 
} 

export default C 

ModalWindow.js

import Modal from 'Bootstrap/Modal' 

class ModalWindow extends Component { 
    return(
    render{ 
     <Modal 
     show={this.props.showModal} 
     container={this.props.container} 
     bsSize='small' 
    > 
     <Modal.Header closeButton="true"> 
     <Modal.Title id="contained-modal-title"> 
      Login 
     </Modal.Title> 
     </Modal.Header> 
     <Modal.Body> 
     Login Here 
     </Modal.Body> 
    </Modal> 
    } 
) 
} 

export default ModalWindow 
+0

Reduxを使用している場合は、Reduxストアで状態を保持し、子コンポーネントにアクションをディスパッチして表示することができますが、この目的のためだけにReduxを実装することはお勧めしません。 –

+0

私はすでにレフィックスを使用しています。 – iamsaksham

+0

よく取る一般的なアプローチは、ディスプレイのさまざまな状態を処理する "ディスプレイ"レデューサーを保つことです。それから、私は、メッセージにモーダルを示すメッセージを取り込むアクションを持っています。その後、モーダル自体では、onClickがモーダルを隠すアクションを発生させるボタンを持つことがあります。 –

答えて

1

あなたはモーダル内部stateを有し、および/状態を変更します近いモーダルを開くには、二つの機能を公開することができます。これらの機能は、他のコンポーネントのrefsからアクセスできます。以下の例を参照してください。

ModalWindow.js

import Modal from 'Bootstrap/Modal' 

class ModalWindow extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showModal: false, 
    } 
    } 
    show() { 
    this.setState({ 
     showModal: true, 
    }) 
    } 
    hide() { 
    this.setState({ 
     showModal: true, 
    }) 
    } 
    render() { 
    return <Modal 
    show={this.state.showModal} 
    container={this.props.container} 
    bsSize='small'> 
     < Modal.Header closeButton = "true" > 
     < Modal.Title id = "contained-modal-title" > 
     Login < /Modal.Title> < /Modal.Header> <Modal.Body> 
     Login Here < /Modal.Body> < /Modal> 
    } 
} 

export default ModalWindow 

A.js、B.js、C.js

import ModalWindow from 'ModalWindow.js' 

class A extends Component { 
    constructor(props) { 
    super(props); 
    } 
    componentDidMount() { 
    this.refs.modal.show() //to show the modal 
    this.refs.modal.hide() //to hide the modal 
    } 
    render() { 
    return <ModalWindow container={this} ref = "modal"/> 
    } 
} 

export default A 
関連する問題