Реагировать на родной плоский список, а не на ожидаемое поведение

1

Привет, я начинаю использовать компонент FlatList вместо ListView, и у меня возникают некоторые проблемы с попыткой рендеринга разделителя, я сделал компонент с несколькими вариантами, и он работает нормально, но я не понимаю, почему он не отображает разделитель из списка, если я помещаю разделитель внутри функции renderItem, он работает нормально, но я хочу использовать его из flatlist в качестве опоры.

Любопытно, что если я удалю элемент itemSeparatorComponent из FlatList в методе рендеринга, компонент перестанет обновлять галочку (renderIndicator()), которая указывает, что элемент выбран, так что это действительно раздражает, я положил весь код, пожалуйста, проверьте его,

React native: 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'
  }
};
Теги:
react-native
react-native-flatlist

2 ответа

1
Лучший ответ

Я думаю, вы сделали опечатку, это должен быть ItemSeparatorComponent, а не itemSeparatorComponent.

0

Элементы списка списка избранного - это чистые компоненты, если вы хотите проверить, выбраны, вы должны установить это в источнике данных, в котором вы проходите. В противном случае реквизиты для элемента остаются теми же, и компонент не будет перезагружен.

Для разделителя вы можете попробовать itemSeparatorComponent = {Divider}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню