繁体   English   中英

如何从父节点访问子组件节点

[英]How to access child component node from parent

我正在尝试实现一项功能以在单击菜单组件外部时关闭它。 为此,我检查当前目标是否存在于 ref 节点中。 问题是当我点击 Icon 组件时...检查它,e.target 恰好是来自 Icon 组件的 img,如果我在 ref.current 上搜索它,它不存在...有没有办法链接 parent 和当我点击一个子组件时,子节点一起实现这个条件 ref.current.contains(e.target)?

父组件:

function Menu ({showMenu, close}) {
   const ref = useRef(null)
   useEffect(() => {
        document.addEventListener('click', handleClickOutside)

        return () =>{
            document.removeEventListener('click', handleClickOutside)
        }
    }, [])

    function handleClickOutside(e) {
        if (ref.current && !ref.current.contains(e.target) && showMenu) {
            close()
        }
    }

    return (
      <div ref={ref}>
          <Icon action={openMenu2}/>
          <h1>Menu</h1>
      </div>
    )

}

孩子

function Icon ({action}) {
    return (
        <div onClick={() => action()}>
            <i>
                <img src={imageSrc} alt="icon"></img>
            </i>
        </div>
    )
}

如果你只想使用子组件的 ref,你可以将 ref 传递给 props.action

//Child

const cRef = useRef(null)

function Icon ({action}) {
    return (
        <div ref= onClick={() => action(cRef)}>
            <i>
                <img src={imageSrc} alt="icon"></img>
            </i>
        </div>
    )
}

然后你可以在父组件中使用它

或者你可以将这些逻辑移动到子组件

为此,我检查当前目标是否存在于 ref 节点中。 问题是当我点击 Icon 组件时......检查它,e.target 恰好是来自 Icon 组件的 img,如果我在 ref.current 上搜索它,它不存在......

你可以通过 menu toggle function 直接给 down children 给 children,

切换 Function

使用这种方法,您无需检查 showMenu 是否为真,因为此 function 将在打开时关闭菜单,如果关闭则打开

假设您的 state 位于 Menu 组件的父级

 const toggleMenu = () => {
    setMenuOpen(!menuOpen);
  };

然后在 Menu 组件中传递 menuOpen 作为菜单的 state 和 toggleMenu 作为 function 来改变它。

function Menu({ toggleMenu, menuOpen }) {
  return (
    <div style={{ display: "flex", alignItems: "center" }}>
      <Icon toggleMenu={toggleMenu} />
      <h1>Menu : {`${menuOpen ? "open" : "closed"} in Menu component`}</h1>
    </div>
  );



}

在图标组件中,您可以切换菜单

function Icon({ toggleMenu }) {
  return (
    <div onClick={toggleMenu}>
      <img
        style={{ width: 35, cursor: "pointer" }}
        alt="hamburger-menu"
        src="https://cdn4.iconfinder.com/data/icons/wirecons-free-vector-icons/32/menu-alt-512.png"
      />
    </div>
  );
}
export default Icon;

在 codesandbox 上运行: https://codesandbox.io/s/eager-joliot-zb3t7?file=/src/Menu.jsx:54-299

如果您的应用因传递状态和传递 state 更改函数而变得复杂,我建议您检查 redux 模式。

此处链接为 redux: https://react-redux.js.org/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM