我从这段代码开始:https://www.codementor.io/reactjs/tutorial/how-to-build-a-sliding-menu-using-react-js-and-less-css
但是我使用es6并尝试转换代码。这是我的结果
import Menu from "../components/layout/Menu";
import MenuItem from "../components/layout/MenuItem";
export default class Layout extends React.Component {
render() {
return (
<Menu ref="right" alignment="right">
<MenuItem hash="first-page">First Page</MenuItem>
<MenuItem hash="second-page">Second Page</MenuItem>
<MenuItem hash="third-page">Third Page</MenuItem>
</Menu>
);
}
}
菜单项
import React from 'react';
export default class MenuItem extends React.Component {
navigate(hash) {
window.location.hash = hash;
}
render() {
return (
<div className="menu-item" onClick={this.navigate.bind(this, this.props.hash)}>{this.props.children}</div>
);
}
}
菜单
import React from 'react';
export default class Menu extends React.Component {
constructor() {
super();
this.state = {
visible: false
}
};
show() {
this.setState({visible: true});
document.addEventListener("click", this.hide.bind(this));
}
hide() {
this.setState({visible: false});
document.removeEventListener("click", this.hide.bind(this));
}
render() {
return (
<div className="menu">
<div className={(this.state.visible ? "visible " : "") + this.props.alignment}>{this.props.children}</div>
</div>
);
}
}
第一次点击按钮时菜单会打开。如果我再次点击按钮,菜单将关闭。但如果我第三次点击按钮就没有任何反应。 Chrome控制台中的菜单无法打开且没有错误消息。它可以是EventListener的东西吗?如果我发表评论document.removeEventListener("click", this.hide.bind(this));
答案 0 :(得分:0)
我认为它不相关,但Layout
应该有一个使用return(...)
返回组件的render()方法。
答案 1 :(得分:0)
试试这个 (在菜单中渲染功能):
render() {
return (
<div className="menu">
{!!this.state.visible &&
<div className={(this.state.visible ? "visible " : "") + this.props.alignment}>{this.props.children}</div>
}
</div>
);
}
!!this.state.visible &&
与if(this.state.visible === true)
这样做只会在菜单可见的情况下呈现。这是一种更“反应”的方式来隐藏/显示组件(它卸载并安装所有菜单子项)。否则,我猜测它可能是生成的visible
类名的问题 - 例如,如果this.props.alignment
未定义,或者没有空格,则呈现什么字符串? visibleundefined
?或者,如果已定义,是否需要visible
和alignment
之间的空格?
答案 2 :(得分:0)
也许你可以使用https://www.npmjs.com/package/react-side-bar。 Example中有一个完整的例子,看起来很好。
npm install --save react-side-bar