模态没有出现在与 react-bootstrap 的反应中
Modal not showing up in react with react-bootstrap
我正在尝试创建一个模式,以便在单击 NavBar.Item
Login/Register.
时弹出 login/register
我的模态定义如下:
import React from "react";
import '../assets/styles/GenericTheme.css'
import { Modal } from "react-bootstrap";
class LoginRegisterModal extends React.Component {
constructor(props, context) {
super(props);
this.state = {show: false};
}
open = () => {
this.setState({show: true});
}
close = () => {
this.setState({show: false});
}
render() {
return (
// <Modal show={this.state.show} onHide={this.close} dialogClassName="popup-inner">
<Modal show={this.state.show} fade={false} style={{width: "200px", display: "block"}}>
<Modal.Body>test</Modal.Body>
</Modal>
);
}
}
export default LoginRegisterModal;
在 NavBar 中,我添加了对 Modal 的引用,如下所示:
import React, {} from 'react';
import { Navbar, Nav, NavDropdown } from 'react-bootstrap';
import SearchForm from '../HeaderFooter/SearchForm';
import SiteLogo from '../../assets/images/village-logo.svg';
import '../../assets/styles/HeaderTheme.css'
import LoginRegisterModal from '../LoginRegisterModal';
class NavHeader extends React.Component {
constructor(props, context) {
super(props);
this.state = {showLogin: false};
}
openLogin = () => {
this.setState({showLogin: !this.state.showLogin});
}
render() {
return (
<div>
<Navbar className="village-header" width="100" expand="lg">
<Navbar.Brand href="/">
<img
src= { SiteLogo }
width="214"
height="28"
className="d-inline-block align-top"
alt="Village"
/>
</Navbar.Brand>
<SearchForm />
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto village-header">
<Nav.Link href="/discover">Discover</Nav.Link>
<Nav.Link href="/create">Create</Nav.Link>
<Nav.Link href="/howitworks">How it Works</Nav.Link>
<Nav.Link ref="LoginRegisterModal" eventKey={1} href="#" onClick={this.openLogin}>Login/Register</Nav.Link>
<NavDropdown title="Profile" id="basic-nav-dropdown">
<NavDropdown.Item>Firstname LastName</NavDropdown.Item>
<NavDropdown.Divider />
<NavDropdown.Item href="/profile">Profile</NavDropdown.Item>
<NavDropdown.Item href="/messages">Messages</NavDropdown.Item>
<NavDropdown.Item href="/settings">Settings</NavDropdown.Item>
<NavDropdown.Item href="/logout">Logout</NavDropdown.Item>
</NavDropdown>
</Nav>
</Navbar.Collapse>
</Navbar>
<LoginRegisterModal show={this.state.showLogin} />
</div>
);
}
}
export default NavHeader;
当我点击 Login/Register:
<Nav.Link ref="LoginRegisterModal" eventKey={1} href="#" onClick={this.openLogin}>Login/Register</Nav.Link>
没有任何反应,没有显示弹出窗口或模式。另外,我在 NavBar
中添加了以下行
<LoginRegisterModal show={this.state.showLogin} />
但没有任何变化。我也尝试过添加 className
并将 z-layer
强制为 2,但效果不佳。
有什么想法吗?
此致
您的模态组件不是 "listening" 任何传递的道具,即从 NavHeader
传递的 show
道具。一个快速的方法是实现 componentDidUpdate
生命周期函数来检查 show
属性值的变化。还可以使用 show
属性值来设置初始状态,以防安装时显示为打开状态。
class LoginRegisterModal extends React.Component {
constructor(props, context) {
super(props);
this.state = {
show: props.show, // use the initial show value
};
}
open = () => {
this.setState({ show: true });
}
close = () => {
this.setState({ show: false });
}
componentDidUpdate(prevProps) {
const { show } = this.props;
if (prevProps.show !== show) {
if (show) {
open(); // open if parent says to
} else {
close(); // close if parent says to
}
}
}
render() {
return (
// <Modal
// show={this.state.show}
// onHide={this.close}
// dialogClassName="popup-inner"
// >
<Modal
show={this.state.show}
fade={false}
style={{width: "200px", display: "block"}}
>
<Modal.Body>test</Modal.Body>
</Modal>
);
}
}
这允许 parent 切换模式的显示状态,但是如果模式是从内部 closed/dismissed 怎么办。您可能需要某种方式向 NavHeader
发出信号,表明模态已关闭,因此它可以 "sync" 其状态。 onHide
道具可以做到这一点,并且您已将其注释掉。我建议也暴露给 LoginRegisterModal
API 一个 onHide
prop.
close = () => {
this.setState({show: false});
this.props.onHide();
}
parent这样使用
<LoginRegisterModal
show={this.state.showLogin}
onHide={() => this.setState({ showLogin: false })}
/>
然而,这会造成代码重复。使 LoginRegisterModal
成为受控组件并简单地将 show
和 onHide
属性从 NavHeader
传递到 Modal
的内部组件可能是一个更好的设计=21=].
const LoginRegisterModal = props => (
<Modal
// pass props on through to Modal
{...props}
// set any props here that you don't want "overridable" by passed props
fade={false}
style={{ width: "200px", display: "block" }}
>
<Modal.Body>test</Modal.Body>
</Modal>
);
我正在尝试创建一个模式,以便在单击 NavBar.Item
Login/Register.
我的模态定义如下:
import React from "react";
import '../assets/styles/GenericTheme.css'
import { Modal } from "react-bootstrap";
class LoginRegisterModal extends React.Component {
constructor(props, context) {
super(props);
this.state = {show: false};
}
open = () => {
this.setState({show: true});
}
close = () => {
this.setState({show: false});
}
render() {
return (
// <Modal show={this.state.show} onHide={this.close} dialogClassName="popup-inner">
<Modal show={this.state.show} fade={false} style={{width: "200px", display: "block"}}>
<Modal.Body>test</Modal.Body>
</Modal>
);
}
}
export default LoginRegisterModal;
在 NavBar 中,我添加了对 Modal 的引用,如下所示:
import React, {} from 'react';
import { Navbar, Nav, NavDropdown } from 'react-bootstrap';
import SearchForm from '../HeaderFooter/SearchForm';
import SiteLogo from '../../assets/images/village-logo.svg';
import '../../assets/styles/HeaderTheme.css'
import LoginRegisterModal from '../LoginRegisterModal';
class NavHeader extends React.Component {
constructor(props, context) {
super(props);
this.state = {showLogin: false};
}
openLogin = () => {
this.setState({showLogin: !this.state.showLogin});
}
render() {
return (
<div>
<Navbar className="village-header" width="100" expand="lg">
<Navbar.Brand href="/">
<img
src= { SiteLogo }
width="214"
height="28"
className="d-inline-block align-top"
alt="Village"
/>
</Navbar.Brand>
<SearchForm />
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto village-header">
<Nav.Link href="/discover">Discover</Nav.Link>
<Nav.Link href="/create">Create</Nav.Link>
<Nav.Link href="/howitworks">How it Works</Nav.Link>
<Nav.Link ref="LoginRegisterModal" eventKey={1} href="#" onClick={this.openLogin}>Login/Register</Nav.Link>
<NavDropdown title="Profile" id="basic-nav-dropdown">
<NavDropdown.Item>Firstname LastName</NavDropdown.Item>
<NavDropdown.Divider />
<NavDropdown.Item href="/profile">Profile</NavDropdown.Item>
<NavDropdown.Item href="/messages">Messages</NavDropdown.Item>
<NavDropdown.Item href="/settings">Settings</NavDropdown.Item>
<NavDropdown.Item href="/logout">Logout</NavDropdown.Item>
</NavDropdown>
</Nav>
</Navbar.Collapse>
</Navbar>
<LoginRegisterModal show={this.state.showLogin} />
</div>
);
}
}
export default NavHeader;
当我点击 Login/Register:
<Nav.Link ref="LoginRegisterModal" eventKey={1} href="#" onClick={this.openLogin}>Login/Register</Nav.Link>
没有任何反应,没有显示弹出窗口或模式。另外,我在 NavBar
中添加了以下行<LoginRegisterModal show={this.state.showLogin} />
但没有任何变化。我也尝试过添加 className
并将 z-layer
强制为 2,但效果不佳。
有什么想法吗? 此致
您的模态组件不是 "listening" 任何传递的道具,即从 NavHeader
传递的 show
道具。一个快速的方法是实现 componentDidUpdate
生命周期函数来检查 show
属性值的变化。还可以使用 show
属性值来设置初始状态,以防安装时显示为打开状态。
class LoginRegisterModal extends React.Component {
constructor(props, context) {
super(props);
this.state = {
show: props.show, // use the initial show value
};
}
open = () => {
this.setState({ show: true });
}
close = () => {
this.setState({ show: false });
}
componentDidUpdate(prevProps) {
const { show } = this.props;
if (prevProps.show !== show) {
if (show) {
open(); // open if parent says to
} else {
close(); // close if parent says to
}
}
}
render() {
return (
// <Modal
// show={this.state.show}
// onHide={this.close}
// dialogClassName="popup-inner"
// >
<Modal
show={this.state.show}
fade={false}
style={{width: "200px", display: "block"}}
>
<Modal.Body>test</Modal.Body>
</Modal>
);
}
}
这允许 parent 切换模式的显示状态,但是如果模式是从内部 closed/dismissed 怎么办。您可能需要某种方式向 NavHeader
发出信号,表明模态已关闭,因此它可以 "sync" 其状态。 onHide
道具可以做到这一点,并且您已将其注释掉。我建议也暴露给 LoginRegisterModal
API 一个 onHide
prop.
close = () => {
this.setState({show: false});
this.props.onHide();
}
parent这样使用
<LoginRegisterModal
show={this.state.showLogin}
onHide={() => this.setState({ showLogin: false })}
/>
然而,这会造成代码重复。使 LoginRegisterModal
成为受控组件并简单地将 show
和 onHide
属性从 NavHeader
传递到 Modal
的内部组件可能是一个更好的设计=21=].
const LoginRegisterModal = props => (
<Modal
// pass props on through to Modal
{...props}
// set any props here that you don't want "overridable" by passed props
fade={false}
style={{ width: "200px", display: "block" }}
>
<Modal.Body>test</Modal.Body>
</Modal>
);