【问题标题】:How can i get back my data list after searching by words?按单词搜索后如何取回我的数据列表?
【发布时间】:2021-01-23 15:02:35
【问题描述】:

我使用 Flatlist 并在 renderHeader() 函数上按单词搜索。我可以过滤,但是当我删除字母时,我无法再次获得主列表。我认为有一个逻辑问题,但我尝试了一些东西后我找不到......

当我解决问题时,我得到了一个新的。我试图解决,但我做不到,我应该把问题摆在专家面前:)

import React, {Component, useState} from 'react'
import {
  Text,
  StyleSheet,
  View,
  FlatList,
  SafeAreaView,
  ScrollView,
  Image,
  TextInput,
} from 'react-native'
import data from '../../data'

const Flatlistexample = () => {
  //main list state
  let [list, setList] = useState(data);
  //search state
  const [search, setSearch] = useState('');
  //search filter
  searchFilter = text => {
    // onChangeText
    const newData = list.filter(item => {
      const listItem = `${item.name.toLowerCase()} ${item.company.toLowerCase()}`

      return listItem.indexOf(text.toLowerCase()) > -1;
    })
    setList(newData)
  }
  //search function
  renderHeader = () =>{
    return (
      <View style={styles.seachContainer}>
        <TextInput
          style={styles.textInput}
          placeholder={'Search...'}
          value={search}
          onChangeText={text => {
           
            //setStates

            searchFilter(text)
            setSearch(text)
          }}></TextInput>
        <Text
          style={{
            alignItems: 'flex-start',
            color: 'black',
            fontSize: 22,
          }}>
          {search}
        </Text>
      </View>
    )
    
  }
  return (
    <SafeAreaView
      style={{
        flex: 1,
      }}>
      <FlatList
        data={list}
        renderItem={({item, index}) => {
          return (
            <ScrollView>
              <SafeAreaView
                style={[
                  styles.container,
                  {backgroundColor: index % 2 === 0 ? '#fafafa' : '#bbb'},
                ]}>
                <Image style={styles.profile} source={{uri: item.picture}} />
                <View style={styles.rightside}>
                  <Text style={styles.name}>{item.name}</Text>
                  <Text style={styles.company}>{item.company}</Text>
                </View>
              </SafeAreaView>
            </ScrollView>
          )
        }}
        keyExtractor={item => item._id}
        //called search function
        ListHeaderComponent={renderHeader()}
      />
    </SafeAreaView>
  )
}

export default Flatlistexample

const styles = StyleSheet.create({
  container: {
    flexDirection: 'row',
    alignItems: 'center',
    borderBottomWidth: 1,
    borderColor: 'gray',
  },
  profile: {
    width: 50,
    height: 50,
    borderRadius: 25,
    marginLeft: 10,
  },
  rightside: {
    marginLeft: 20,
    justifyContent: 'space-between',
    marginVertical: 5,
  },
  name: {
    fontSize: 22,
    marginBottom: 10,
  },
  searchContainer: {
    padding: 10,
    borderWidth: 2,
    borderColor: 'gray',
  },
  textInput: {
    fontSize: 16,
    backgroundColor: '#f9f9f9',
    padding: 10,
  },
})

感谢您的帮助

【问题讨论】:

标签: javascript react-native use-state flatlist


【解决方案1】:

过滤数据

onSearchText = (value) => {
  this.setState({searchText: value})
  if(value.trim() == "" || value == null){
    this.setState({list: this.state.list}
  } else {
    let filter = this.state.list.fillter(data => {
    // data fillter logic //
    return data;
    })
    this.setState({filterData: filter})
    }

渲染平面列表

<FlatList
  extradata={this.state}
  data={searchText ? filterData : list}
 />

【讨论】:

    【解决方案2】:

    我修好了……

    怎么做?

    我的主要数据状态是恒定的,我正在使用过滤器状态过滤数据列表。所以我的数据列表不会随时改变。

    import React, {Component, useState} from 'react'
    import {
      Text,
      StyleSheet,
      View,
      FlatList,
      SafeAreaView,
      ScrollView,
      Image,
      TextInput,
    } from 'react-native'
    import data from '../../data'
    
    const Flatlistexample = () => {
      //main list state
      let [list, setList] = useState(data)
      //search state
      const [search, setSearch] = useState('')
      //filter state
      const [updated, setUpdated] = useState(data)
      //search filter
      searchFilter = text => {
        // onChangeText
        if (text) {
          const newData = list.filter(item => {
            const listItem = `${item.name.toLowerCase()} ${item.company.toLowerCase()}`
            return listItem.indexOf(text.toLowerCase()) > -1
          })
            setUpdated(newData)
          
      }
      //search function
      renderHeader = () => {
        return (
          <View style={styles.seachContainer}>
            <TextInput
              style={styles.textInput}
              placeholder={'Search...'}
              value={search}
              onChangeText={text => {
                searchFilter(text)
                setSearch(text)
              }}></TextInput>
            <Text
              style={{
                alignItems: 'flex-start',
                color: 'black',
                fontSize: 22,
              }}>
              {search}
            </Text>
          </View>
        )
      }
    
      return (
        <SafeAreaView
          style={{
            flex: 1,
          }}>
          <FlatList
          //i'm showing filter state
            data={updated}
            renderItem={({item, index}) => {
              return (
                <ScrollView>
                  <SafeAreaView
                    style={[
                      styles.container,
                      {backgroundColor: index % 2 === 0 ? '#fafafa' : '#bbb'},
                    ]}>
                    <Image style={styles.profile} source={{uri: item.picture}} />
                    <View style={styles.rightside}>
                      <Text style={styles.name}>{item.name}</Text>
                      <Text style={styles.company}>{item.company}</Text>
                    </View>
                  </SafeAreaView>
                </ScrollView>
              )
            }}
            keyExtractor={item => item._id}
            //called search function
            ListHeaderComponent={renderHeader()}
          />
        </SafeAreaView>
      )
    }
    
    export default Flatlistexample
    
    const styles = StyleSheet.create({
      container: {
        flexDirection: 'row',
        alignItems: 'center',
        borderBottomWidth: 1,
        borderColor: 'gray',
      },
      profile: {
        width: 50,
        height: 50,
        borderRadius: 25,
        marginLeft: 10,
      },
      rightside: {
        marginLeft: 20,
        justifyContent: 'space-between',
        marginVertical: 5,
      },
      name: {
        fontSize: 22,
        marginBottom: 10,
      },
      searchContainer: {
        padding: 10,
        borderWidth: 2,
        borderColor: 'gray',
      },
      textInput: {
        fontSize: 16,
        backgroundColor: '#f9f9f9',
        padding: 10,
      },
    })
    
    /*
    else if(text.length > uzunluk){
          setList(data)
          const newData = list.filter(item => {
            const listItem = `${item.name.toLowerCase()} ${item.company.toLowerCase()}`
      
            return listItem.indexOf(text.toLowerCase()) > -1;
          }) 
          setList(newData)
        }else if(text.length<uzunluk){
          setList(data)
          const newData = list.filter(item => {
            const listItem = `${item.name.toLowerCase()} ${item.company.toLowerCase()}`
      
            return listItem.indexOf(text.toLowerCase()) > -1;
          }) 
          setList(newData)
        }
    */

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2021-10-14
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多