我有两个组件:Main和LeftMenu。 LeftMenu组件上有一个图标。所需功能:单击图标将显示/隐藏主组件中的元素。
将FaDropbox图标添加到主组件中时,我能够设置所需的功能。但是,当我尝试将其放入LeftMenu组件时,它将无法正常工作。
具有FaDropbox图标工作的主要组件:
class Main extends Component {
state = {
isShowTiles: true
};
render() {
return (
<div className="Main">
{/* Background color set with Helmet */}
<Helmet>
<style>{"body { background-color: #1A2C3B; }"}</style>
</Helmet>
<div className="Container">
<Row className="RowHeader">
<Header
user={this.props.user}
photo={this.props.photo}
userProfile={this.props.userProfile}
/>
</Row>
<Row>
<div class="toggleArea">
{this.state.isShowTiles ? <Tiles /> : <BoxTiles />}
</div>
</Row>
</div>
<button onClick={this.toggleComponents}>
<FaDropbox />
</button>
</div>
);
}
toggleComponents = () => {
this.setState({
isShowTiles: !this.state.isShowTiles
});
};
}
export default Main;
当我尝试从FaDropbox图标上的LeftMenu组件调用toggleComponents时,它不起作用。
class LeftMenu extends Component {
render() {
return (
<div className="LeftMenu">
{/* Base Layout */}
<div className="LeftContainer">
<Row className="justify-content-md-center">
<div className="LeftIcon">
{/* <FaDropbox/> */}
<button onClick={toggleComponents}>
<FaDropbox />
</button>
</div>
</Row>
</div>
</div>
);
}
}
export default LeftMenu;
我试图从Main组件中导出toggleComponents方法,如下所示,但它不起作用:
export function toggleComponents() {
return this.toggleComponents;
}
预期结果是使FaDropbox图标具有onClick选项,但在LeftMenu组件上起作用。我不想在主要组件上安装FaDropbox。如何实现这一点并从Main组件外部正确调用此方法?
答案 0 :(得分:0)
向LeftMenu类添加一个toggleComponents函数,并以与Main中相同的方式使用它
<button onClick={this.toggleComponents}><FaDropbox/></button>
记住类中的this
绑定:
https://reactjs.org/docs/handling-events.html
您还可以将toggleComponents
函数传递给LeftMenu
<LeftMenu toggleComponents={this.toggleComponents} />
class LeftMenu extends Component {
render() {
return (
...
<button onClick={this.props.toggleComponents}><FaDropbox/></button>
)
}
}
答案 1 :(得分:0)
您需要将toggleComponents
作为道具传递给LeftMenu。
<LeftMenu toggleComponents = {this.toggleComponents}/>
然后,您可以在LeftMenu内部简单调用它,如下所示
<button onClick={() => this.props.toggleComponents()}><FaDropbox/></button>
答案 2 :(得分:0)
您未在两个组件之间提供连接。就像我的(极简主义版本)
您有布局组件
class Layout extends Component {
state = {
isShowTiles: true
};
toggleComponents = () => {
this.setState({
isShowTiles: !this.state.isShowTiles
});
};
render() {
return (
<div class="layout">
<Main isShowTiles={this.state.isShowTiles} />
<LeftMenu toggleComponents={this.toggleComponents} />
</div>
);
}
}
在主要组件中:
class Main extends Component {
render() {
return (
<div class="toggleArea">
{this.props.isShowTiles ? "Title" : "Box Title"}
</div>
);
}
}
和LeftMenu组件:
class LeftMenu extends Component {
render() {
return <button onClick={this.props.toggleComponents}>Click me!</button>;
}
}
答案 3 :(得分:0)
import LeftMenu from 'leftMenu';
class Main extends Component{
state ={
isShowTiles:true
};
toggleComponents=()=>{
this.setState({
isShowTiles:!this.state.isShowTiles
})
}
render() {
return (
<div className="Main">
{/* Background color set with Helmet */}
<Helmet>
<style>{'body { background-color: #1A2C3B; }'}</style>
</Helmet>
<div className="Container">
<Row className="RowHeader">
<Header user={this.props.user} photo={this.props.photo} userProfile={this.props.userProfile} />
</Row>
<Row>
<div class="toggleArea">
{ this.state.isShowTiles ? <Tiles /> : <BoxTiles/> }
</div>
</Row>
</div>
<LeftMenu toggleComponents={this.toggleComponents} />
</div>
);
}
}
export default Main;
左侧菜单组件:
class LeftMenu extends Component {
render() {
const { toggleComponents } = this.props;
return (
<div className="LeftMenu">
{/* Base Layout */}
<div className="LeftContainer">
<Row className="justify-content-md-center">
<div className="LeftIcon">
{/* <FaDropbox/> */}
<button onClick={toggleComponents}><FaDropbox/></button>
</div>
</Row>
</div>
</div>
);
}
}
export default LeftMenu;