因此,我有一个react-bootstrap导航,并且我想要打开和关闭一个引导模式组件的导航项之一。

我有这个工作:

import React, { Component, render } from 'react';
import { Navbar, Nav, NavItem, NavDropdown, MenuItem, Modal, Button } from 'react-bootstrap';

export default class NavigationBar extends Component {
 constructor() {
  super();
 this.state = {
  showModal: false
 }
}
close() { this.setState({ showModal: false }); }
open() { this.setState({ showModal: true }); }
render() {
return (
  <div>
    <Navbar>
      ...entire navbar...
    </Navbar>
    <Modal show={this.state.showModal} onHide={() => this.close()}>

      ...entire modal... which would be nice to put if a different file

    </Modal>
  </div>
); } }


理想情况下,我想将模态放在另一个组件文件中并导入,但是当我这样做时,我对如何转换导航栏的打开和关闭一无所知。

组合组件同时保持文件间状态的最佳实践是什么?

谢谢!

最佳答案

考虑它的一个好方法是容器与表示组件。容器保存您的状态和大多数逻辑。演示组件接受输入(属性)并呈现html(jsx)[并且仅做其他事情]。

因此,您可以制作自己的Modal组件,该组件采用调用close的方法以及一个是否显示它的方法。它甚至可能是一个无状态的组件-如果只是props + jsx,则不需要完整的类结构:

import React, { PropTypes } from 'react';

const MyModal = ({ show, onHide}) => (
  <Modal show={show} onHide={onHide}>

    // ...entire modal...

  </Modal>
);

// displayName and propTypes are always good to have
MyModal.displayName = 'MyModal';
MyModal.propTypes = {
  show: PropTypes.bool.isRequired,
  onHide: PropTypes.func.isRequired,
};
export default MyModal;


然后要使用它,您需要确保绑定您的方法,以便在正确的上下文中调用它们:

class NavigationBar extends Component {
  constructor() {
    super();
    this.state = {
      showModal: false
    };

    // this is the important binding
    this.close = this.close.bind(this);
    this.open = this.open.bind(this);
  }
  close() { this.setState({ showModal: false }); }
  open() { this.setState({ showModal: true }); }
  render() {
    return (
      <div>
        <Navbar>
          // ...entire navbar...
        </Navbar>
        <MyModal
          show={this.state.showModal}
          onHide={this.close}
        >
          // child content if needed (unless it's all defined in MyModal)
        </Modal>
      </div>
    );
  }
}

关于javascript - ReactJS:分离组件最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42775707/

10-14 21:13
查看更多