javascript - React中如何从父组件获取函数

标签 javascript reactjs

我有几个功能组件:

export default function IconModal({
    label,
    icon,
    className,
    children
}) {
    const el = useRef();
    const [ isExpanded, setExpanded ] = useState(false);
    const onClickOutside = useCallback(() => setExpanded(false), []);
    const cx = classNames('modal__wrapper', className);

    useOnClickOutside(el, onClickOutside);

    return (
        <div className={cx} aria-expanded={isExpanded} ref={el}>
            <button onClick={() => setExpanded(!isExpanded)}
                    aria-label={label}
                    className="modal__action">
                <Icon name={icon} />
            </button>

            <span className="modal">
                <button className="modal__close" onClick={() => setExpanded(false)}>
                    <Icon name="close"/>
                </button>
                {children}
            </span>
        </div>
    );
}

然后我打算像这样使用它:

export default function InfoIconModal() {
    const context = useContext(SomeContext);
    const title = 'Hey Here';

    return (
        <IconModal
            className="header__modal__wrapper--info"
            label="Know more about this"
            icon="info"
        >
            <h2 className="info__subtitle text--uppercase">How This Works</h2>
            <h3 className="info__title">{title} = {context.name}</h3>
            <div className="info__body" dangerouslySetInnerHTML={{__html: context.hiw}} />
            <p className="font--semi-bold">
                <a href="#" target="_blank">View Legend</a>
            </p>
        </IconModal>
    );
}

效果很好。现在的事实是,如果在本例中用户单击“查看图例”链接,我想关闭模式,但这可能是任何其他原因。

我怎样才能实现这个目标?

最佳答案

我认为这是 render prop 模式的一个很好的用例,如下所示:

export default function InfoIconModal() {
  const context = useContext(SomeContext);
  const title = 'Hey Here';

  return (
      <IconModal
          className="header__modal__wrapper--info"
          label="Know more about this"
          icon="info"
      >
      {
        ({onClose}) => (
          <h2 className="info__subtitle text--uppercase">How This Works</h2>
          <h3 className="info__title">{title} = {context.name}</h3>
          <div className="info__body" dangerouslySetInnerHTML={{__html: context.hiw}} />
          <p className="font--semi-bold">
           <a href="#" target="_blank" onClick={() => onClose()}>View Legend</a>
          </p>
        )
      }
      </IconModal>
  );
}

export default function IconModal({
  label,
  icon,
  className,
  children
}) {
  const el = useRef();
  const [ isExpanded, setExpanded ] = useState(false);
  const onClickOutside = useCallback(() => setExpanded(false), []);
  const cx = classNames('modal__wrapper', className);

  useOnClickOutside(el, onClickOutside);

  return (
      <div className={cx} aria-expanded={isExpanded} ref={el}>
          <button onClick={() => setExpanded(!isExpanded)}
                  aria-label={label}
                  className="modal__action">
              <Icon name={icon} />
          </button>

          <span className="modal">
              <button className="modal__close" onClick={() => setExpanded(false)}>
                  <Icon name="close"/>
              </button>
              {children({onClose: () => setExpanded(isExpanded => !isExpanded)})}
          </span>
      </div>
  );
}

了解更多:https://reactjs.org/docs/render-props.html

关于javascript - React中如何从父组件获取函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57874887/

相关文章:

javascript - @ 符号在 javascript 导入中起什么作用?

javascript - React.js Redux reducer 不插入项目

reactjs - axios GET请求函数在react中导出/导入

reactjs - 用 enzyme 浅渲染找不到元素

javascript - create-react-app 太慢并创建困惑的应用程序

javascript - 使用JS改变背景颜色

php - 如何使用 extjs url 将 javascript 动态数据发送到 php 变量?

javascript - 从滚动条中的 div 获取 sibling 对

javascript - child div看不到 Angular 范围

javascript - 通过检查响应来处理 Promise 中的错误