如何在 React Native 中使用 HoC

How to use HoC with React Native

我有一个列表应用程序,用户可以在其中为多个类别添加项目,当他们想要添加新记录时,有 3 个相关屏幕具有此特定功能。所有这些屏幕都有 <Header/> 组件,所以我认为 HoC 在这里会很好,这样我就可以在 3 个屏幕上重复使用它。 但是,我无法完成它。

这是我到目前为止尝试过的方法:

这是我的 HoC class

import React, { Component } from 'react';
import { View, StyleSheet, Text, StatusBar } from 'react-native';
import Header from '../components/Header';

const NewAd = (WrappedComponent) => {
    class NewAdHoc extends Component {
        handleBackPress = () => {
            this.props.navigation.navigate('Home');
            StatusBar.setBarStyle('dark-content', true);
        }
        render() {
            const {contentText, children} = this.props
            return (
                <View style={styles.container}>
                    <Header
                        headerText={'Yeni ilan ekle'}
                        onPress={this.handleBackPress}
                    />
                    <View style={styles.contentContainer}>
                        <Text style={styles.contentHeader}>{contentText}</Text>
                        <WrappedComponent/>
                    </View>
                </View>
            );
        }
    }


    return NewAdHoc;
}

这是我的屏幕:

class NewAdScreen extends Component {
    render() {
        const Content = () => {
            return (
                <View style={styles.flatListContainer}>
                    <ListViewItem />
                </View>
            );
        }
        return (
            NewAdHoc(Content)
        )
    }
}

之后我收到错误

TypeError: (0 , _NewAdHoc.NewAdHoc) is not a function(…)

而且我不知道该如何修复它,因为这是我第一次在 react-native 应用程序上使用 hocs。我已经查看了为什么会出现此错误,他们建议以这种方式导入组件:

import {NewAdHoc} from '../hocs/NewAdHoc';

但即使这样也没有解决。

如有任何帮助,我们将不胜感激。

HOC 的主要目的是跨组件封装和重用 stateful 逻辑。因为你只是重用了一些 jsx 而没有在 WrappedComponent 中注入任何东西,你应该在这里使用常规组件:

const NewAd = ({ contentText, children }) => {

    handleBackPress = () => {
        this.props.navigation.navigate('Home');
        StatusBar.setBarStyle('dark-content', true);
    }


    return (
        <View style={styles.container}>
            <Header
                headerText={'Yeni ilan ekle'}
                onPress={this.handleBackPress}
            />
            <View style={styles.contentContainer}>
                <Text style={styles.contentHeader}>{contentText}</Text>
                {children}
            </View>
        </View>
    );
}

然后像这样使用它

return(
    <>
         <NewAd>
            <Screen1 />
         </NewAd>
         <NewAd>
            <Screen2 />
         </NewAd>
         <NewAd>
            <Screen3 />
         </NewAd>
    </>
)