代码之家  ›  专栏  ›  技术社区  ›  Guy

为了可读性,将defaultProps放在无状态组件定义之前

  •  0
  • Guy  · 技术社区  · 6 年前

    为了可读性,有没有办法把 上下文类型 默认道具 在无状态反应组件之前?

    type TopBarProps = {
        children: string,
        color: string
    };
    
    TopBar.defaultProps = {
        color: "white"
    };
    
    TopBar.contextTypes = {
        locale: PropTypes.string,
        colors: PropTypes.object,
        i18n: PropTypes.object,
        fontFamily: PropTypes.object,
        scale: PropTypes.number,
        alignStyle: PropTypes.string,
        navMethods: PropTypes.object,
        token: PropTypes.string,
        arrowName: PropTypes.string,
        materialArrows: PropTypes.object
    };
    
    export const TopBar = (props: TopBarProps, context) => {
        const { colors } = context;
    
        styles = styles || initStyles(context);
    
        return (
            <View style={styles.container}>
                <View>
                    <Menu color={colors.colorFont} />
                </View>
                <View>
                    <TopLabel color={props.color}>{props.children}</TopLabel>
                </View>
            </View>
        );
    };
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Jemi Salo    6 年前

    您可以先将它们定义为常量,然后在定义之后将它们设置为组件的字段。因为它们的名称是正确的,所以读者应该非常清楚常量的用途。

    const defaultProps = { ... }
    const contextTypes = { ... }
    
    export const TopBar = (props: TopBarProps, context) => { ... }
    
    TopBar.defaultProps = defaultProps
    TopBar.contextTypes = contextTypes
    
        2
  •  0
  •   Anton Harniakou    6 年前

    使用定义组件 function 语法,就像这样:

    export function TopBar(props: TopBarProps, context) {
        const { colors } = context;
    
        styles = styles || initStyles(context);
    
        return (
            <View style={styles.container}>
                <View>
                    <Menu color={colors.colorFont} />
                </View>
                <View>
                    <TopLabel color={props.color}>{props.children}</TopLabel>
                </View>
            </View>
        );
    };
    

    它应该可以工作,因为 hoisting