reactjs - 如何通过 HOC 传递父 props 并正常使用它

标签 reactjs react-props higher-order-components

我学习了 React HOC,但无法理解一件事,

我有一个像这样的 HOC:

const MyHoc = WrapperComponent => {
    class TheHoc extends React.Component {
        constructor(props) {
            super(props);
            this.someMethod = this.someMethod.bind(this);
        }

        someMethod = () => {
            // ...do stuf
        };

        render() {
            return <WrapperComponent doStuff={this.someMethod} {...this.props} />;
        }
    }
    return TheHoc;
};

export default MyHoc;

当我这样使用它时:

function HocUser(props) {
    const { close, doStuff } = props;

    const onClickMe = () => {
        close();
        doStuff();
    };

    return (
        <div>
            <MenuLinksSpace />
            <MenuLinks>
            <li>
                    <a onClick={onClickMe} role="presentation">
                        <span className="icon is-medium">
                            <i className="fas fa-user" />
                        </span>{' '}
                        Click me
                    </a>
                </li>
            </MenuLinks>
        </div>
    );
}

export default MyHoc(HocUser);

我的问题是 close现在未定义,并且当它应该是从 HocUser 的父级传递的函数时给出错误.

close 以来,我的 HOC 出了问题。 Prop 丢失

请指教?

更新

这是使用 HocUser 的组件:像这样<HocUser close={close} />

import React, { useRef, useCallback, useEffect } from 'react';
import styled from 'styled-components';
import { useSpring, animated } from 'react-spring';
import useOnClickOutside from './UseOnClickOutside';
import NavLinkPage from './NavLinkPage';
import HocUser from './HocUser';

const CollapseMenu = props => {
    const { show, close } = props;
    const { open } = useSpring({ open: show ? 0 : 1 });

    const reference = useRef();
    useOnClickOutside(reference, close, 'burgerMenu');

    const escFunction = useCallback(
        event => {
            // only accept 27 if it's visible
            if (event.keyCode === 27 && show === true) {
                close();
            }
        },
        [close, show],
    );

    useEffect(() => {
        document.addEventListener('keydown', escFunction, false);
        return () => {
            document.removeEventListener('keydown', escFunction, false);
        };
    }, [escFunction]);

    if (show === true) {
        return (
            <CollapseWrapper
                ref={reference}
                style={{
                    transform: open
                        .interpolate({
                            range: [0, 0.2, 0.3, 1],
                            output: [0, -20, 0, -200],
                        })
                        .interpolate(openValue => `translate3d(0, ${openValue}px, 0`),
                }}
            >
                <NavLinkPage />
                <HocUser close={close} />
            </CollapseWrapper>
        );
    }
    return null;
};

export default CollapseMenu;

const CollapseWrapper = styled(animated.div)`
    position: fixed;
    left: 0;
    right: 0;
    height: 100%;
    width: 100%;
    z-index: 100;
`;

最佳答案

试试这个

const MyHoc = WrapperComponent => {
    const someMethod = () => {
        // ...do stuf
    };

    return (props) => {
        return <WrapperComponent doStuff={someMethod} {...props} />;
    };
};

export default MyHoc;

在 HocUser 内部检查 close 是否存在,然后调用 close 函数。如果关闭不是从父级传递的,您也应该处理这种情况。

const onClickMe = () => {
    if(close) close();
    doStuff();
};

您可以查看我的 HOC 示例 here连接是 HOC。

关于reactjs - 如何通过 HOC 传递父 props 并正常使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65420516/

相关文章:

javascript - React 在 this.props.children 上设置默认 Props

javascript - withSyles HOC 在传递 React.forwardRef 时不会将 innerRef 与其他 props 一起传递

reactjs - i18n for React、formatjs、react-intl

javascript - React 中的 props 不应该被更改/突变的原因是因为 React 希望元素尽可能可预测吗?

javascript - 如何在Recharts中显示多个对象数组?

javascript - 尝试映射我的 Prop 时,我收到 Cannot read property of 'exercises' of undefined 错误

reactjs - Typescript 高阶组件作为装饰器

javascript - React HOC 与辅助类?

javascript - 如何改变react中的状态值

html - 用于测试 React 应用程序的 jest/enzyme 不提供页面标题,如何获取标题?