admin管理员组

文章数量:1278914

I am trying to write a reusable Header Component in React-Native. I want to write it in a ways that the left and right button can be passed as child ponents. To know where to render which button I want to pass a prop like rightIcon or leftIcon. However I don't know how to access these props.

This is my App.js file

import React from 'react';
import {StyleSheet, TouchableHighlight, View} from 'react-native';
import Header from "./src/Header";
import {Ionicons} from '@expo/vector-icons';

export default class App extends React.Component {
    render() {
        return (
            <View style={styles.container}>
                <Header headerText={"Barcode Scanner"}>
                    <TouchableHighlight righticon>
                        <Ionicons name="md-barcode" size={36} color="white"></Ionicons>
                    </TouchableHighlight>
                </Header>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1
    },
});

I am trying to write a reusable Header Component in React-Native. I want to write it in a ways that the left and right button can be passed as child ponents. To know where to render which button I want to pass a prop like rightIcon or leftIcon. However I don't know how to access these props.

This is my App.js file

import React from 'react';
import {StyleSheet, TouchableHighlight, View} from 'react-native';
import Header from "./src/Header";
import {Ionicons} from '@expo/vector-icons';

export default class App extends React.Component {
    render() {
        return (
            <View style={styles.container}>
                <Header headerText={"Barcode Scanner"}>
                    <TouchableHighlight righticon>
                        <Ionicons name="md-barcode" size={36} color="white"></Ionicons>
                    </TouchableHighlight>
                </Header>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1
    },
});
And this is the Header Component

import React from 'react';
import {Text, View} from 'react-native';

export default class Header extends React.Component {
    render() {

        const {textStyle, viewStyle, rightButton} = styles;

        return (
            <View style={viewStyle}>
                <Text style={textStyle}>{this.props.headerText}</Text>
                <View style={rightButton}>
                    {this.renderRightChild()}
                </View>
            </View>
        );
    }

    renderRightChild = () => {
        console.log("Check if rightIcon Prop is set");
    }
}


const styles = {
        viewStyle: {
            backgroundColor: '#5161b8',
            justifyContent: 'center',
            alignItems: 'center',
            height: 80,
            paddingTop: 25,
            shadowColor: '#000',
            shadowOffset: {width: 0, height: 2},
            shadowOpacity: 0.2,
            elevation: 2,
            position: 'relative'
        },
        textStyle: {
            color: '#fff',
            fontSize: 20
        },
        rightButton: {
            position: 'absolute',
            top:
                35,
            right:
                20
        }

    }
;

I already tried to use React.Children.toArray but this always throws an error that the request entity is too large.

Thanks for all the answers

Share Improve this question asked Feb 7, 2018 at 11:31 Luigi NatorLuigi Nator 1231 gold badge1 silver badge7 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 4

I guess you can always use a render prop that way you can not only decide whether to render left/right icon ponent but the ponent rendering the icon does not even have to know what to render:

The term “render prop” refers to a simple technique for sharing code between React ponents using a prop whose value is a function.

return (
  <View style={styles.container}>
    <Header
      headerText={"Barcode Scanner"}
      renderRightIcon={() => (
        <TouchableHighlight righticon>
          <Ionicons name="md-barcode" size={36} color="white" />
        </TouchableHighlight>
      )}
    />
  </View>
);

Then you can use call the right icon as a function:

return (
  <View style={viewStyle}>
    <Text style={textStyle}>{this.props.headerText}</Text>
    {renderLeftIcon && (
      <View style={leftButton}>
        {renderLeftIcon()}
      </View>)
    }
    {renderRightIcon  && (
      <View style={rightButton}>
        {renderRightIcon()}
      </View>)
    }
  </View>
);

You render both ponents, the right and left and you put an if condition inside state.

Header Component render method

render() {
  const { leftOrRight } = this.props // right - true, left - false
  return(
    ...
    { leftOrRight ? <RightIcon />  : <LeftIcon />}
  );

}

Inside Component that calls Header

import Header from './somepath ...';

class Something extends React.Component {
   this.state = { leftOrRight }

   render() {
     return(
        <Header leftOrRight = {this.state.LeftOrRight}/>
     );
   }
}

You could have a function that sets leftOrRight in your parent class

One way to do this is write a Header Component and pass all the things, as props, which you can then access them in Header Components Props like..

    <Header title="HeaderTitle" 
            leftButtonTitle="LeftButton" 
            rightButton={canBeAObjectWithSomeInfo} 
            leftButtonClick={handleClick} /> 

and then in your header ponent(can be class or a function)

const Header = ({}) => (
  <View>
    <View onPress={this.props.handleClick}>{this.props.leftButton}</View>
    <View>{this.props.title}</View>
    <View onPress={this.props.handleRightClick}>{this.props.rightButton}</View>
  </View>
)

something like this you can have and then you can design header accordingly

本文标签: javascriptConditional Rendering of child elements in ReactStack Overflow