从平面列表中获取索引

时间:2019-10-13 09:35:50

标签: reactjs react-native native react-native-flatlist

所以我基本上是在寻找错误以及我在做什么错, 我得到了每个数据都有不同密钥的数据,并且我试图获取activeRow的数据, 由于某种原因,我由于某种原因而无法定义,这是怎么回事?谢谢! 尝试记录已经调用了constructor(props)和super(props)的“ this.props.index”后,我变得未定义,所以我不知道为什么为什么要尝试记录我的prop却显示未定义而不是给我索引或项目...

有我的渲染器!

render() {
  const swipeSettings = {
    autoClose: true,
    buttonWidth: 130,
    onClose: (secId, rowId, direction) => {
      if (this.state.activeRowKey != null) {
        this.setState({ activeRowKey: null })
      }
    },
    onOpen: (secId, rowId, direction) => {
      this.setState({ activeRowKey: this.props.index })
      console.log(this.state.activeRowKey)
    },
    right: [
      {
        onPress: () => {

        },
        text: 'Verify', type: 'default', backgroundColor: 'lime', color: 'black', component: (
          <View
            style={{
              flex: 1,
              alignItems: 'center',
              justifyContent: 'center',
              flexDirection: 'column',
            }}
          >
            <Ionicons name="md-checkmark" size={40} />
          </View>
        )
      }
    ],
    left: [
      {
        onPress: () => {

        },
        text: '', type: 'default', backgroundColor: '#e6e6e6', color: 'black', component: (
          <View
            style={{
              flex: 1,
              alignItems: 'center',
              justifyContent: 'center',
              flexDirection: 'column',
            }}
          >
            <Ionicons style={{ color: 'green' }} name="ios-call" size={40} />
          </View>
        )
      }
    ],
    rowId: this.props.index,
    sectionId: 1
  };
  if (this.state.loading) {
    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <ActivityIndicator />
      </View>
    );
  }
  return (
    <View style={{ flex: 1, backgroundColor: 'grey' }}>
      <SearchBar
        placeholder="Type Here..."
        lightTheme
        round
        height={60}
        onChangeText={text => this.searchFilterFunction(text)}
        autoCorrect={false}
        value={this.state.value}
      />
      <FlatList
        data={this.state.data}
        renderItem={({ item,index }) => (
          <Swipeout {...swipeSettings}>
            <ListItem
              keyExtractor={this.keyExtractor}
              index={index}
              titleStyle={{ textAlign: 'center', fontWeight: 'bold', color: 'black', fontSize: 20, height: 60, maxHeight: 35, justifyContent: 'center' }}
              title={`${item.guestname}`}
            />
          </Swipeout>
        )}
        keyExtractor={item => item.key}
        contentContainerStyle={{ margin: 5, textAlign: 'center', }}
        ItemSeparatorComponent={this.renderSeparator}
      />
      <SafeAreaView style={{ height: 100, backgroundColor: '#3271e7', justifyContent: 'center', alignItems: 'center' }}>
        <TouchableOpacity style={{ justifyContent: 'center', alignItems: 'center' }}>
          <Ionicons style={styles.imagestyle} size={60} name="ios-barcode" />
        </TouchableOpacity>
      </SafeAreaView>
    </View>
  );
}

1 个答案:

答案 0 :(得分:0)

在您尝试恢复this.props.index的地方,您没有该值,但我建议将open和rowid道具传递给Swipeout并按原样恢复索引:

    render() {
    const swipeSettings = {
        autoClose: true,
        buttonWidth: 130,
        onClose: (secId, rowId, direction) => {
            if (this.state.activeRowKey != null) {
                this.setState({ activeRowKey: null })
            }
        },
        right: [
            {
                onPress: () => {

                },
                text: 'Verify', type: 'default', backgroundColor: 'lime', color: 'black', component: (
                    <View
                        style={{
                            flex: 1,
                            alignItems: 'center',
                            justifyContent: 'center',
                            flexDirection: 'column',
                        }}
                    >
                        <Ionicons name="md-checkmark" size={40} />
                    </View>
                )
            }
        ],
        left: [
            {
                onPress: () => {

                },
                text: '', type: 'default', backgroundColor: '#e6e6e6', color: 'black', component: (
                    <View
                        style={{
                            flex: 1,
                            alignItems: 'center',
                            justifyContent: 'center',
                            flexDirection: 'column',
                        }}
                    >
                        <Ionicons style={{ color: 'green' }} name="ios-call" size={40} />
                    </View>
                )
            }
        ],
        sectionId: 1
    };
    if (this.state.loading) {
        return (
            <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
                <ActivityIndicator />
            </View>
        );
    }
    return (
        <View style={{ flex: 1, backgroundColor: 'grey' }}>
            <SearchBar
                placeholder="Type Here..."
                lightTheme
                round
                height={60}
                onChangeText={text => this.searchFilterFunction(text)}
                autoCorrect={false}
                value={this.state.value}
            />
            <FlatList
                data={this.state.data}
                renderItem={({ item, index }) => (
                    <Swipeout
                        {...swipeSettings}
                        onOpen={(secId, rowId, direction) => {
                            this.setState({ activeRowKey: index })
                            console.log(this.state.activeRowKey)
                        }
                        }
                        rowId={index}
                    >
                        <ListItem
                            keyExtractor={this.keyExtractor}
                            index={index}
                            titleStyle={{ textAlign: 'center', fontWeight: 'bold', color: 'black', fontSize: 20, height: 60, maxHeight: 35, justifyContent: 'center' }}
                            title={`${item.guestname}`}
                        />
                    </Swipeout>
                )}
                keyExtractor={item => item.key}
                contentContainerStyle={{ margin: 5, textAlign: 'center', }}
                ItemSeparatorComponent={this.renderSeparator}
            />
            <SafeAreaView style={{ height: 100, backgroundColor: '#3271e7', justifyContent: 'center', alignItems: 'center' }}>
                <TouchableOpacity style={{ justifyContent: 'center', alignItems: 'center' }}>
                    <Ionicons style={styles.imagestyle} size={60} name="ios-barcode" />
                </TouchableOpacity>
            </SafeAreaView>
        </View>
    );
}