Lef*_*eff 3 javascript reactjs material-ui react-ref
我在我的项目中使用了一个react-mui库,我想在其中实现一个MenuList组件,可以在此处的MenuList合成下找到。在我的应用程序中,虽然我将refas发送prop到child component我有menu. 您可以在此处查看codesandbox 示例。当我从父组件发送一个方法时,如下ref所示setRef:props
state = {
open: false,
ref: React.createRef()
};
setRef = element => {
this.setState({ ref: element });
};
handleToggle = () => {
this.setState(state => ({ open: !state.open }));
};
handleClose = () => {
this.setState({ open: false });
};
render() {
return (
<MenuListComposition
setRef={this.setRef}
handleToggle={this.handleToggle}
handleClose={this.handleClose}
open={this.state.open}
ref={this.state.ref}
/>
);
}
Run Code Online (Sandbox Code Playgroud)
对于具有菜单按钮的子组件:
<MenuButton
className={classes.button}
handleToggle={handleToggle}
setRef={setRef}
open={open}
ref={ref}
/>
Run Code Online (Sandbox Code Playgroud)
然后,具有菜单列表的 Popper 组件在错误的位置打开,如果单击TOGGLE MENU GROW button.
<Popper open={open} anchorEl={ref} transition disablePortal>
{({ TransitionProps, placement }) => (
<Grow
{...TransitionProps}
id="menu-list-grow"
style={{
transformOrigin:
placement === "bottom" ? "center top" : "center bottom"
}}
>
<Paper>
<ClickAwayListener onClickAway={handleClose}>
<MenuList>
<MenuItem onClick={handleClose}>Profile</MenuItem>
<MenuItem onClick={handleClose}>My account</MenuItem>
<MenuItem onClick={handleClose}>Logout</MenuItem>
</MenuList>
</ClickAwayListener>
</Paper>
</Grow>
)}
</Popper>
Run Code Online (Sandbox Code Playgroud)
我做错了什么以及如何解决这个问题,或者如何ref在stateless组件中使用以避免ref作为发送prop?
Ref 不能像 React 中的 prop 一样传递。引用通常在构造组件时分配给实例属性,以便可以在整个组件中引用它们。此外,当将 ref 传递给渲染中的元素时,可以通过 ref 的当前属性访问对该节点的引用。
React 提供了React.forwardRef方法来在组件层次结构中传递引用。对于应用程序中的大多数组件来说,这通常是不必要的。但是,它对于某些类型的组件很有用,特别是在可重用组件库中。了解forwardRef
const ButtonWrapper = React.forwardRef((props, ref) => (
<button ref={ref}>
{props.children}
</button>
));
// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<ButtonWrapper ref={ref}>Click me!</ButtonWrapper>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12209 次 |
| 最近记录: |