最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How do I pass props to ListHeaderComponent? - Stack Overflow

programmeradmin1浏览0评论

so I'm navigating to FooItems page from my first ponent and I'm passing props to navigation.

    showFooItemsPage = () => {
        this.props.navigation.navigate('FooItemsComponent', {
            fooItems: this.props.fooItems});
  };

On my FooItemsComponents, I have a Flatlist with renderItems function and that is working. However, I want to make changes to the Flatlist items list, then I want to click on Save in my header of my Flatlist ponent.

The main issue I'm having right now is sending props to the Header Component of my Flatlist. Props is undefined and I have no idea how to send it props from my FooItemsComponent or when I'm navigating between pages?

Here's some snippets from my FooItemsComponent:

class Header extends Component {

    constructor(props) {
        super(props);

    }

    async ponentDidMount() {
       //call some reducer action 
      }

    save = items => {
        this.props.saveItems(items);
        this.props.navigation.navigate("previousComponent");
    }

    render() {
        const {navigation, loading } = this.props;

        return (
        <View>
            <View style={styles.header}>
                <TouchableOpacity onPress={this.save}>
                    <Text style={styles.saveText}>Save</Text> 
                    </TouchableOpacity>
                </View>
            <View
                style={{
                borderTopWidth: 1,
                borderTopColor: Colors.grey,
                height: 1,
                }}> 
            </View>
        </View>
        );
    }
}

export class FooItemsComponent extends Component {

    constructor(props) {
        super(props);
    }

    async ponentDidMount() {
        //some reducer action 
      }

    renderItem = item => {
         if (item.load) {
          return <ActivityIndicator color={Colors.activityColor} size="small" />;
        } else {

          return (
              <View>
                <FooItems
                    {...item}
                    navigation={this.props.navigation}
                    showParticularItems={true}
                />
                </View>
          ); }
      };

    render() {
        const { fooItems, navigation, loading, props} = this.props;
        if (!fooItems) fooItems = [];

        return (
            <View style={styles.container}>
                <FlatList
                keyExtractor={(item, index) => `key-${index}`}
                data={fooItems}
                renderItem={item => this.renderItem(fooItems.item)}
                ItemSeparatorComponent={Separator}
                ListHeaderComponent={Header}
                ListFooterComponent={loading ? LoadingFooter : Separator}
                />
          </View>

        );
    }
}

so I'm navigating to FooItems page from my first ponent and I'm passing props to navigation.

    showFooItemsPage = () => {
        this.props.navigation.navigate('FooItemsComponent', {
            fooItems: this.props.fooItems});
  };

On my FooItemsComponents, I have a Flatlist with renderItems function and that is working. However, I want to make changes to the Flatlist items list, then I want to click on Save in my header of my Flatlist ponent.

The main issue I'm having right now is sending props to the Header Component of my Flatlist. Props is undefined and I have no idea how to send it props from my FooItemsComponent or when I'm navigating between pages?

Here's some snippets from my FooItemsComponent:

class Header extends Component {

    constructor(props) {
        super(props);

    }

    async ponentDidMount() {
       //call some reducer action 
      }

    save = items => {
        this.props.saveItems(items);
        this.props.navigation.navigate("previousComponent");
    }

    render() {
        const {navigation, loading } = this.props;

        return (
        <View>
            <View style={styles.header}>
                <TouchableOpacity onPress={this.save}>
                    <Text style={styles.saveText}>Save</Text> 
                    </TouchableOpacity>
                </View>
            <View
                style={{
                borderTopWidth: 1,
                borderTopColor: Colors.grey,
                height: 1,
                }}> 
            </View>
        </View>
        );
    }
}

export class FooItemsComponent extends Component {

    constructor(props) {
        super(props);
    }

    async ponentDidMount() {
        //some reducer action 
      }

    renderItem = item => {
         if (item.load) {
          return <ActivityIndicator color={Colors.activityColor} size="small" />;
        } else {

          return (
              <View>
                <FooItems
                    {...item}
                    navigation={this.props.navigation}
                    showParticularItems={true}
                />
                </View>
          ); }
      };

    render() {
        const { fooItems, navigation, loading, props} = this.props;
        if (!fooItems) fooItems = [];

        return (
            <View style={styles.container}>
                <FlatList
                keyExtractor={(item, index) => `key-${index}`}
                data={fooItems}
                renderItem={item => this.renderItem(fooItems.item)}
                ItemSeparatorComponent={Separator}
                ListHeaderComponent={Header}
                ListFooterComponent={loading ? LoadingFooter : Separator}
                />
          </View>

        );
    }
}
Share Improve this question asked Nov 7, 2019 at 14:31 Euridice01Euridice01 2,56812 gold badges48 silver badges80 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 8

Pass your ponent as a React element:

 <FlatList
    keyExtractor={(item, index) => `key-${index}`}
    data={fooItems}
    renderItem={item => this.renderItem(fooItems.item)}
    ItemSeparatorComponent={Separator}
    ListHeaderComponent={<Header yourProps={'blabla title'}/>}
    ListFooterComponent={loading ? LoadingFooter : Separator}
   />

and in Header ponent use this.props.yourProps

Never use arrow functions to render ponents passed as props, React won't have a stable reference to the function and therefor will not know that the header ponent is supposed to be the same ponent between renders. It can cause bugs and will hurt performance. See SearchBar in FlatList loses focus after typing for an example of a bug it can cause. Although, Idan was pretty close to having the correct solution. Instead, do this:


 <FlatList
    keyExtractor={(item, index) => `key-${index}`}
    data={fooItems}
    renderItem={item => this.renderItem(fooItems.item)}
    ItemSeparatorComponent={Separator}
    ListHeaderComponent={<Header yourProps={'blabla title'}/> }
    ListFooterComponent={loading ? LoadingFooter : Separator}
   />
发布评论

评论列表(0)

  1. 暂无评论