2017-06-02 23 views
1

Hallo Ich fange an, FlatList-Komponente anstelle von ListView zu verwenden, und ich habe einige Probleme beim Rendern des Trennzeichens, ich machte eine Multiple-Choice-Komponente und es funktioniert ok, aber ich verstehe nicht warum es nicht das Trennzeichen von der flachen Liste rendert, wenn ich das Trennzeichen innerhalb der renderItem Funktion einsetze, funktioniert es ok, aber ich möchte es von der flachen Liste als Stütze benutzen.Reactor native flatlist, nicht erwartetes Verhalten

Eine seltsame Sache ist, wenn ich die itemSeparatorComponent Prop von der FlatList in Rendermethode lösche die Komponente stoppt die Aktualisierung des Häkchens (renderIndicator()), dass das Element ausgewählt ist, so ist es wirklich nervig das, ich den gesamten Code , Überprüfen Sie bitte das.

Reagieren nativer: 0.44.0

import React, { Component } from 'react'; 
import { Button, Icon, Divider } from 'react-native-elements'; 
import { FlatList, View, TouchableOpacity, Text } from 'react-native'; 
import { Card, CardSection } from './commons'; 
import { appMainColor } from '../constants'; 

export default class ListOrderItems extends Component { 
    static navigationOptions = { 
    title: 'Realice su selección' 
    }; 

    state = { selected: [], items: this.props.navigation.state.params.items }; 

    onItemPress = (item) => { 
    const selected = this.state.selected; 
    const index = selected.indexOf(item.name); 

    if (index === -1) { 
     selected.push(item.name); 
    } else { 
     selected.splice(index, 1); 
    } 

    this.setState({ selected }); 
    }; 

    isSelected = (item) => { 
    return this.state.selected.indexOf(item.name) !== -1; 
    }; 

    keyExtractor = (item, index) => { 
    return index; 
    }; 

    renderOkButton =() => { 
    if (this.props.navigation.state.params.type === 'multipleChoice') { 
     return (
     <Button 
      raised 
      borderRadius={5} 
      backgroundColor={appMainColor} 
      title='Aceptar' 
      onPress={() => this.props.navigation.goBack()} 
     /> 
    ); 
    } 
    }; 

    renderCancelButton =() => { 
    return (
     <Button 
     raised 
     borderRadius={5} 
     backgroundColor={appMainColor} 
     title='Cancelar' 
     onPress={() => this.props.navigation.goBack()} 
     /> 
    ); 
    }; 

    renderIndicator = (item) => { 
    if (this.isSelected(item)) { 
     return <Icon name="check-circle" color={appMainColor} />; 
    } 
    }; 

    renderSeparator =() => { 
    return <Divider />; 
    }; 

    renderItem = ({ item, index }) => { 
    return (
     <TouchableOpacity 
     activeOpacity={0.7} 
     onPress={() => this.onItemPress(item, index)} 
     > 
     <View style={styles.row}> 
      <View style={styles.optionLabel}> 
      <Text>{item.name} (${item.price})</Text> 
      </View> 
      <View style={styles.optionIndicator}> 
      {this.renderIndicator(item, index)} 
      </View> 
     </View> 
     </TouchableOpacity> 
    ); 
    }; 

    render() { 
    return (
     <View> 
     <Card> 
      <CardSection> 
      <FlatList 
       data={this.state.items} 
       keyExtractor={this.keyExtractor} 
       renderItem={this.renderItem} 
       itemSeparatorComponent={() => this.renderSeparator()} 
      /> 
      </CardSection> 
     </Card> 
     <Card> 
      <CardSection style={{ justifyContent: 'space-around' }}> 
      {this.renderOkButton()} 
      {this.renderCancelButton()} 
      </CardSection> 
     </Card> 
     </View> 
    ); 
    } 
} 

const styles = { 
    row: { 
    flexDirection: 'row', 
    padding: 5 
    }, 
    optionLabel: { 
     flex: 1, 
    }, 
    optionIndicator: { 
     width: 30, 
     height: 30, 
     justifyContent: 'center', 
     alignItems: 'center' 
    } 
}; 

Antwort

1

Ich glaube, Sie einige Tippfehler gemacht, sollte es ItemSeparatorComponent, nicht itemSeparatorComponent sein.

0

Flatlist Listenelemente sind reine Komponenten, wenn Sie mit überprüfen möchten ausgewählt werden Sie dies in der Datenquelle einstellen sollten Sie passieren Andernfalls werden die Requisiten für das Element bleiben. das gleiche und die Komponente wird nicht neu rendern.

Für den Teiler können Sie versuchen, itemSeparatorComponent = {} Divider

Verwandte Themen