React - 发送 ref 作为道具不起作用
React - sending down ref as a prop not working
我正在使用 react-mui library in my project where I would like to implement a MenuList
component, found under MenuList composition here. In my application though I am sending a ref
as prop
down to a child component
where I have a menu
. You can see the codesandbox example here。
当我从这样的父组件发送 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}
/>
);
}
到具有菜单按钮的子组件:
<MenuButton
className={classes.button}
handleToggle={handleToggle}
setRef={setRef}
open={open}
ref={ref}
/>
然后带有菜单列表的 Popper 组件在错误的位置打开,如果您单击 TOGGLE MENU GROW button
.
,您可以在 codesanbox 示例中看到这一点
<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>
我做错了什么以及如何解决这个问题,或者我如何在 stateless
组件中使用 ref
以避免将 ref
作为 [=15] 发送=]?
ref
是 reactjs 中的关键字。当您使用 ref
作为道具时,它将组件链接到 ref 对象。在 FancyButton
组件和 MenuListComposition
组件上将其重命名为您喜欢的名称。
React supports a special attribute that you can attach to any component.
Working example 在两个组件中 ref 重命名为 parentRef。
编辑:
正如 Vaibhav Shukla 所指出的,您可以在 FancyButton
和 MenuListComposition
上使用 React.forwardRef
,这可能是正确的方法。
Ref 不能像 React 中的 prop 一样传递。在构建组件时,通常会将引用分配给实例 属性,以便在整个组件中引用它们。此外,当将 ref 传递给渲染中的元素时,可以在 ref.
的当前属性处访问对节点的引用
React 提供了方法React.forwardRef 来在组件层次结构中传递引用。对于应用程序中的大多数组件来说,这通常不是必需的。但是,它对某些类型的组件很有用,尤其是在可重用组件库中。 Read about 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>;
我正在使用 react-mui library in my project where I would like to implement a MenuList
component, found under MenuList composition here. In my application though I am sending a ref
as prop
down to a child component
where I have a menu
. You can see the codesandbox example here。
当我从这样的父组件发送 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}
/>
);
}
到具有菜单按钮的子组件:
<MenuButton
className={classes.button}
handleToggle={handleToggle}
setRef={setRef}
open={open}
ref={ref}
/>
然后带有菜单列表的 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>
我做错了什么以及如何解决这个问题,或者我如何在 stateless
组件中使用 ref
以避免将 ref
作为 [=15] 发送=]?
ref
是 reactjs 中的关键字。当您使用 ref
作为道具时,它将组件链接到 ref 对象。在 FancyButton
组件和 MenuListComposition
组件上将其重命名为您喜欢的名称。
React supports a special attribute that you can attach to any component.
Working example 在两个组件中 ref 重命名为 parentRef。
编辑:
正如 Vaibhav Shukla 所指出的,您可以在 FancyButton
和 MenuListComposition
上使用 React.forwardRef
,这可能是正确的方法。
Ref 不能像 React 中的 prop 一样传递。在构建组件时,通常会将引用分配给实例 属性,以便在整个组件中引用它们。此外,当将 ref 传递给渲染中的元素时,可以在 ref.
的当前属性处访问对节点的引用React 提供了方法React.forwardRef 来在组件层次结构中传递引用。对于应用程序中的大多数组件来说,这通常不是必需的。但是,它对某些类型的组件很有用,尤其是在可重用组件库中。 Read about 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>;