我想在点击按钮时重定向到注册或登录路线,因为按钮负责显示模态。我在父组件中有一个showModal函数,即作为prop传递给子组件(Nav)的App。由于负责处理onClick事件的showModal函数在App组件中,我试图在那里使用路由器上下文,但我得到undefined
。
这是我的代码
index.js
ReactDOM.render(
<Provider store={createStoreWithMiddleware(reducers)}>
<ConnectedIntlProvider>
<Router>
<App />
</Router>
</ConnectedIntlProvider>
</Provider>
, document.querySelector('.app'));
class App extends Component {
constructor(props, context) {
super(props, context);
console.log('context', context);
this.state = { show: false };
}
showModal(e) {
e.preventDefault();
this.setState({ show: true });
this.context.router.transitionTo(e.target.href);
}
hideModal() {
this.setState({ show: false });
}
render() {
return (
<div className="container-fluid">
<Nav
showModal={(e) => this.showModal(e)}
hideModal={() => this.hideModal()}
show={this.state.show}
onHide={() => this.hideModal()}
/>
</div>
);
}
}
App.contextTypes = {
router: React.PropTypes.object
};
const Nav = (props) => (
<div>
<nav className="navbar navbar-default">
<div className="container-fluid">
<div className="navbar-header">
<a className="navbar-brand" href="">
<img
alt="Brand"
className="img-responsive"
src={logo}
role="presentation"
/>
</a>
</div>
<div className="collapse navbar-collapse" id="collapse-1">
<ul className="nav navbar-nav navbar-right nav-social-icon">
<li className="dropdown">
<a
href=""
className="dropdown-toggle"
data-toggle="dropdown"
>
ES
<span className="caret" />
</a>
<ul className="dropdown-menu" style={{ color: '#000', fontWeight: 'bold' }}>
<li onClick={() => props.selectedLocale('en')}>
en
</li>
<li onClick={() => props.selectedLocale('es')}>
es
</li>
</ul>
</li>
<li className="btn-group regLog">
<button
className="btn btn-default"
onClick={props.showModal}
>
<Link to={{ pathname: '/signup' }}>
{props.intl.formatMessage({ id: 'nav.registration.text' }) }
</Link>
</button>
<button
onClick={props.showModal}
className="btn btn-default"
>
<Link to={{ pathname: '/login' }}>
{props.intl.formatMessage({ id: 'nav.login.text' }) }
</Link>
</button>
{props.show ?
<ModalForm
show={props.show}
onHide={props.onHide}
/> : <span />
}
</li>
</ul>
</div>
</div>
</nav>
</div>
);
class ModalForm extends Component {
render() {
const { show, onHide, intl } = this.props;
return (
<Modal
{...this.props}
show={show}
onHide={onHide}
dialogClassName="custom-modal"
>
<Modal.Header closeButton>
<Link to='/login' className="logTitle">
<Modal.Title id="contained-modal-title-lg">
{intl.formatMessage({ id: 'nav.login.text' })}
</Modal.Title>
</Link>
<Link to='/signup' className="logTitle">
<Modal.Title id="contained-modal-title-lg">
{intl.formatMessage({ id: 'nav.registration.text' })}
</Modal.Title>
</Link>
</Modal.Header>
<Modal.Body>
<Match pattern='/login' component={Login} />
<Match pattern='/signup' component={Signup} />
</Modal.Body>
</Modal>
);
}
}
我正在使用 react-router v4 。
答案 0 :(得分:1)
您的代码有点奇怪,因为您使用了多个<Router>
组件。您应该在组件树的根目录附近只有一个<___Router>
(Browser
,Hash
或Memory
)。
ReactDOM.render((
<BrowserRouter>
<App />
</BrowserRouter>
), document.getElementById('root'))
router
上下文仅适用于<Router>
组件的子元素。您的<Router>
是<App>
组件的子级,因此<App>
无法访问router
上下文变量。
注意:我的回答是基于我可以看到的代码,它不包含组件树的根。如果您有另一个<Router>
定义的更高版本,则应将其包含在您提供的代码中,以帮助您更好地回答您的问题。
答案 1 :(得分:0)
你需要做三件事
首先,您需要添加子路线,如
<Route path="users" component={User}>
<Route path="login" component={Login}/>
</Route>
之后,在您的父组件中添加它,这将自动从Url检测组件并根据该组件呈现组件。
{this.props.children}
现在您需要为登录模式创建单独的组件。在这个模态打开模态框中使用此
componentDidMount: function(){
$('#login-modal').modal('show');
},