如何将此子级包装在高阶组件中?

时间:2019-10-02 22:09:33

标签: reactjs react-native higher-order-components

const LoggedInView = (props) => <Text>You are logged in!</Text>
export default withAuth(LoggedInView)


const withAuth = (component) => <AuthRequired>{ component }</AuthRequired>


const AuthRequired = (props) => {
    const context = useContext(AuthContext)
    if(!context.auth){
        return (
            <View style={styles.container}>
               <Text>You need to login . Click here</Text>
            </View>
        )
    }
    return props.children 
}

我的<AuthRequired>视图可以正常工作,但我的withAuth则不能。

3 个答案:

答案 0 :(得分:1)

HOC接受一个组件并返回另一个组件。您正在获取一个组件并返回一个React节点,而不是一个组件。 Docs reference

对于您而言,您应该可以执行以下操作:

const withAuth = (Component) => (props) => <AuthRequired><Component ...props /></AuthRequired>

可能更容易理解为:

function withAuth(Component) {
    return function WithAuthHOC(props) {
        return (
            <AuthRequired>
                <Component ...props />
            </AuthRequired>
        );
    }
}

答案 1 :(得分:1)

您可以使用辅助组件。它是一个高阶组件。辅助元素不是具有语义目的,而是为了对元素进行分组,样式等目的而存在。只需创建一个名为Aux.js的组件并将其放在上面即可:

const aux = ( props ) => props.children;

export default aux;

然后用辅助包装withAuth

const withAuth = (component) => {
     return ( 
           <Aux> 
               <AuthRequired>{ component }</AuthRequired>
           </Aux> 
      );
}

答案 2 :(得分:0)

据我所知,您不能在React中将函数作为子函数返回。您如何尝试呢?

const LoggedInView = <div>You are logged in!</div>;

当我在笔记本电脑上尝试时,此代码有效。

请查看以下链接:Functions are not valid as a React child. This may happen if you return a Component instead of from render