![](/img/trans.png)
[英]Pass a click Event from one class component to another in React
[英]React JS pass click event to another component
我在 Navbar 組件中有 Avatar 和 Menu 組件。 我想通過單擊 Avatar 組件從 Menu 組件觸發 function。 我的問題是如何將 clickEvent 從頭像傳遞到菜單組件。
<AppBar position="sticky" className={classes.navBarStyle}> <Toolbar> <Avatar alt="" className={classes.userAvatar} src="./avatar.jpg"/> <DropDownMenu/> </Toolbar> </AppBar>
function DropDownMenu() { const [anchorEl, setAnchorEl] = React.useState(null); const open = Boolean(anchorEl); const handleClick = (event) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; return ( <div> <Menu id="fade-menu" anchorEl={anchorEl} keepMounted open={open} onClose={handleClose} TransitionComponent={Fade} > <MenuItem onClick={handleClose}>Profile</MenuItem> <MenuItem onClick={handleClose}>My account</MenuItem> <MenuItem onClick={handleClose}>Logout</MenuItem> </Menu> </div> ); }
你不需要傳遞點擊事件,你只需要使用AppBar
將anchorEl
state 移動到你的組件,並將anchorEl
和onClose
作為道具傳遞給DropDownMenu
:
function MainAppBar() {
const [anchorEl, setAnchorEl] = React.useState(null);
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
<AppBar position="sticky" className={classes.navBarStyle}>
<Toolbar>
<Avatar alt="" className={classes.userAvatar} src="./avatar.jpg" onClick={handleClick} />
<DropDownMenu anchorEl={anchorEl} onClose={handleClose} />
</Toolbar>
</AppBar>
}
function DropDownMenu({ anchorEl, onClose }) {
const open = Boolean(anchorEl);
return (
<div>
<Menu
id="fade-menu"
anchorEl={anchorEl}
keepMounted
open={open}
onClose={onClose}
TransitionComponent={Fade}
>
<MenuItem onClick={handleClose}>Profile</MenuItem>
<MenuItem onClick={handleClose}>My account</MenuItem>
<MenuItem onClick={handleClose}>Logout</MenuItem>
</Menu>
</div>
);
}
我寫了一個庫material-ui-popup-state
,在這樣的情況下使用起來不太麻煩:
import {bindTrigger, bindMenu, usePopupState} from 'material-ui-popup-state/hooks';
function MainAppBar() {
const popupState = usePopupState({ variant: 'popover', popupId: 'fade-menu' });
<AppBar position="sticky" className={classes.navBarStyle}>
<Toolbar>
<Avatar {...bindTrigger(popupState)} alt="" className={classes.userAvatar} src="./avatar.jpg" />
<DropDownMenu popupState={popupState} />
</Toolbar>
</AppBar>
}
function DropDownMenu({ popupState }) {
return (
<div>
<Menu
{...bindMenu(popupState)}
keepMounted
TransitionComponent={Fade}
>
<MenuItem onClick={popupState.close}>Profile</MenuItem>
<MenuItem onClick={popupState.close}>My account</MenuItem>
<MenuItem onClick={popupState.close}>Logout</MenuItem>
</Menu>
</div>
);
}
訣竅是將 function 放在父組件中,並且都是子組件,並將其作為道具傳遞下去,這樣它就可以成為共享的 function。
您有ToolBar
組件,它是您的avatar
和menudropdown
組件的父級。 放置那些 handleClick、handleClose 和const [anchorEl, setAnchorEl] = React.useState(null);
在這些孩子的父組件中。
接下來將 handleClose 函數傳遞給dropDownMenu
組件,並將 handleClick 作為道具傳遞給Avatar
組件。 您還應該將 state 傳遞給基於它的操作的那些組件,在這種情況下傳遞給menuDropDown
組件,因為我看到他需要這個 state 數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.