简体   繁体   English

如何使我的搜索栏在 React Native 中正常工作?

[英]How to make my search bar in react native working?

I am learning react native by myself.我正在自学 React Native。 I try to create a research bar but nothing seems to work.我尝试创建一个研究栏,但似乎没有任何效果。 I know how to get one element from my data list, but I don't understand why it is not working and how to make it work properly.我知道如何从我的数据列表中获取一个元素,但我不明白为什么它不起作用以及如何使其正常工作。 To be more specific I have a list of farmer and I want to filter them based on the city they work.更具体地说,我有一份农民名单,我想根据他们工作的城市过滤他们。

My code is:我的代码是:

import React from 'react'
import { FlatList, View, TextInput, Button, StyleSheet } from 'react-native'
import { ListItem, SearchBar } from 'react-native-elements';
import data from '../Helpers/FarmersData.js'
import FarmerItem from './FarmerItem'
import { registerRootComponent } from 'expo';

// return data.filter(function (e){return e.City == text}).map(element => <FarmerItem farmer={element} key={element.id} /> );

class Search extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
          farmers: [],
          searchedText: "" 
        }
    }

    _searchTextInputChanged(text) {
        this.setState({ searchedText: text })
    }

    _loadFarmer() {


        if (this.state.searchedText.length > 0) { // Seulement si le texte recherché n'est pas vide
            data.filter(e => e.City == this.state.searchedText).map(element => <FarmerItem farmer={element} key={element.id} /> ).then(data => {
              this.setState({ element: data.results })
          })          
        }
    }

    render() {
        return (
            <View style={styles.main}>
                <TextInput style={styles.textinput} placeholder='Nom du maraicher'/>
                <Button title='Rechercher' onPress={() => {this._loadFarmer()}}/>
                {data.map(element => <FarmerItem farmer={element} key={element.id} /> )} 

            </View>
        );
    }
}


I followed lot of tutorial, but nothing seems to work.我遵循了很多教程,但似乎没有任何效果。 I am completely despair.我彻底绝望了。 It is certainly something easy but for a non-developer like me, it's kinda difficult.这当然很容易,但对于像我这样的非开发人员来说,这有点困难。 I hope someone can help.我希望有人能帮帮忙。 Thank you in advance and sorry for my bad english: :)提前谢谢你,对不起我的英语不好::)

Step 1: in constructor we are set our all farmers to farmers第 1 步:在构造函数中,我们将所有农民设置为农民

Step 2: TextInput has onChangeText so we can use our text directly like you show in第 2 步:TextInput 具有 onChangeText,因此我们可以像您在中显示的那样直接使用我们的文本

Step 3: in _searchTextInputChanged we can access our text so we are filtering our text with our farmers data.第 3 步:在 _searchTextInputChanged 中,我们可以访问我们的文本,因此我们使用我们的农民数据过滤我们的文本。

You can see if we have farmers with city then we are assign it to our state else we are set our all data to state as you can see in _searchTextInputChanged您可以看到我们是否有拥有城市的农民,然后我们将其分配给我们的州,否则我们将所有数据设置为州,如您在 _searchTextInputChanged 中所见

import React from 'react'
import { FlatList, View, TextInput, Button, StyleSheet , Text } from 'react-native'
import { ListItem, SearchBar } from 'react-native-elements';
import data from '../Helpers/FarmersData.js'
import FarmerItem from './FarmerItem'
import { registerRootComponent } from 'expo';

// return data.filter(function (e){return e.City == text}).map(element => <FarmerItem farmer={element} key={element.id} /> );

class Search extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
          farmers: data ,
          searchedText: "" // Initialisation de notre donnée searchedText dans le state
        }
    }

    _searchTextInputChanged = async (text) => {
        const newData = await data.filter(e => e.City.toLowerCase() === text.toLowerCase() );

        //change your logic as per your requirement 
        if( newData.length > 0 ){
        this.setState({farmers : newData})
        }else{
        this.setState({farmers : data })
        }
    }

    render() {
        return (
          <>
            <View style={styles.main}>
                <TextInput style={styles.textinput} onChangeText = {(text) => this._searchTextInputChanged(text)} placeholder='Nom du maraicher'/>
                {this.state.farmers.map(element => <FarmerItem farmer={element} key={element.id} /> )}

            </View>
            </>
        );
    }
}

// Components/Search.js
const styles = StyleSheet.create({
    main: {
        flex:1,
        marginTop:30,
        backgroundColor:'white'
    },
    textinput: {
        marginLeft: 5,
        marginRight: 5,
        height: 50,
        borderColor: '#86d972',
        borderWidth: 1,
        paddingLeft: 5
    }
  })

export default Search

Thisd is a working solution:这是一个可行的解决方案:

snack-expo Do check once with abc as input, for more doubts i can clarify: snack-expo请检查一次 abc 作为输入,更多疑问我可以澄清:

import React from 'react'
import { FlatList, View, TextInput, Button, StyleSheet,Text } from 'react-native'
import { ListItem, SearchBar } from 'react-native-elements';
// import data from '../Helpers/FarmersData.js'
// import FarmerItem from './FarmerItem'
import { registerRootComponent } from 'expo';

// return data.filter(function (e){return e.City == text}).map(element => <FarmerItem farmer={element} key={element.id} /> );

export default class App extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
          farmers: [],
          searchedText: "" ,
          data:[{
            name:'a',
            city:'ABC'
          },{
            name:'b',
            city:'WOW'
          }
          ],
          dataShown:[{
            name:'a',
            city:'ABC'
          },{
            name:'b',
            city:'WOW'
          }]
        }
    }

    _searchTextInputChanged = (text) => {

        let newDataF = [];
        this.state.data.map((e) => {
          if(e.city.toLowerCase() == text.toLowerCase())
          {
            newDataF.push(e)
          }
        })


        this.setState({ searchedText: text, dataShown:newDataF })
    }


    render() {

        return (
            <View style={{marginTop:100}} >
                <TextInput onChangeText={this._searchTextInputChanged} placeholder='Nom du maraicher'/>
                <Button title='Rechercher' onPress={() => {this._loadFarmer()}}/>
                {this.state.dataShown.map(element => <Text>{element.city}</Text> )} 

            </View>
        );
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM