Je suis novice en React-native. J'ai besoin de mettre en évidence les résultats de la recherche dans ma FlatList pendant que je tape dans la barre de recherche. Il existe deux composants: react-native-highlight-words et react-native-text-highlight , mais je ne sais pas comment faire utilisez-les! voici mon code:
import React, { Component } from 'react'; import {StyleSheet, Text, View, FlatList, TouchableOpacity } from 'react-native'; import { List, ListItem, SearchBar } from 'react-native-elements'; import DropdownMenu from 'react-native-dropdown-menu'; import {Header, Left, Right, Icon} from 'native-base' var SQLite = require('react-native-sqlite-storage') var db = SQLite.openDatabase({name: 'test.sqlite', createFromLocation: '~dictionary.sqlite'}) var data = [["English", "Arabic", "Persian"]]; export default class App extends Component { constructor(props) { super(props) this.state = {record: [], arrayholder : [], query:''}; db.transaction((tx) => { tx.executeSql('SELECT * FROM tblWord', [], (tx, results) => { let row = results.rows.item(); arrayholder = results.rows.raw() record = results.rows.raw() this.setState({arrayholder: arrayholder}) this.setState({ record: record }) }});}); } searchFilterFunction = text => { var newData = this.state.arrayholder; newData = this.state.arrayholder.filter(item => { const itemData = item.word_english.toLowerCase() const textData = text.toLowerCase() return itemData.indexOf(textData) > -1 }); this.setState({query: text,record: newData }); }; render() { return ( <View style = {styles.container}> <Header style={styles.headerStyle}> ... </Header> <View style={styles.menuView}> <DropdownMenu bgColor={"#B38687"} activityTintColor={'green'} titleStyle={{color: '#333333'}} handler={(selection, row) => this.setState({text4: data[selection][row]})} data={data} > </DropdownMenu> </View > <View > <View style={styles.searchBarView}> <SearchBar placeholder="Search" lightTheme value = {this.state.query} onChangeText={text => this.searchFilterFunction(text)} autoCorrect={false} inputStyle={{backgroundColor: 'white'}} containerStyle={{backgroundColor: 'white', borderWidth: 1, borderColor:'#B38687', }} /> </View> <View style={styles.flatListVew}> <List containerStyle={{ flexDirection: 'column-reverse', borderTopWidth: 0, borderBottomWidth: 0 }} > <FlatList data={this.state.record} keyExtractor={((item, index) => "itemNo-" + index)} renderItem={({item}) => ( <ListItem roundAvatar onPress={() => {this.props.navigation.navigate('Screen2', {data: (item.word_english +'\n' + item.word_arabic)} ); }} title={item.word_english} containerStyle={{ borderBottomWidth: 0 }} /> )} /> </List> </View> </View> </View>);} } const styles = StyleSheet.create({ ...
Je veux que les résultats ressemblent à ceci:
Toute aide serait grandement appréciée.
3 Réponses :
Vous pouvez mettre en évidence en utilisant vos propres styles.
Voici un exemple simple:
const myList = [{ text: 'Hi', id: 1 }, ... ] class List extends Component { this.state = { highlightedId: undefined } render() { return ( <FlatList data={myList} renderItem={({item}) => <Text style={item.id === this.state.highlightedId ? styles.hightlighted : undefined}>{item.text}</Text>} /> ) } } const styles = StyleSheet.create({ highlighted: { backgroundColor: "yellow" } })
Dans votre cas, vous pouvez ajuster le containerStyle
du
.
hmmm..merci @J. Hesters. Laisse-moi voir ce que je peux faire: |
@simaAttar Faites-moi savoir si vous ne pouvez pas le faire et je peux vous aider davantage.
En fait, je ne comprends pas comment implémenter votre code sur le mien, pour info c'est une application de dictionnaire qui va rechercher des mots dans la flatList, donc si vous pensez toujours que votre code est approprié, veuillez en expliquer davantage. Merci alooot
Je ne vois pas assez de code pour cela. Le code est également formaté de manière à le rendre difficile à lire.
Vous pouvez transmettre du texte ou une vue personnalisée à ListItem comme accessoires
pour title . J'utilise React Native Highlight Words pour mettre en évidence le texte comme vous l'avez indiqué.
ajoutez React Native Highlight Words
en ajoutant la ligne ci-dessous:
<ListItem roundAvatar onPress={() => {this.props.navigation.navigate('Screen2', {data: (item.word_english +'\n' + item.word_arabic)} ); }} title={ <Highlighter highlightStyle={{backgroundColor: 'yellow'}} searchWords={[this.state.query]} textToHighlight={item.word_english} />} containerStyle={{ borderBottomWidth: 0 }} />
Mettre à jour le code pour le composant ListItem
pour le composant souhaité résultat:
import Highlighter from 'react-native-highlight-words';
handleChangeText = param => { const {categoryList} = this.state; const regEx = "\\s*(" + param + ")\\s*" const validator = new RegExp(regEx, 'i'); let filterData = []; //here is categorylist is the data supplied to flatlist. categoryList.forEach(item => { let flag = validator.test(item.teamtype); if (flag) { //here set the highlighting color } }) };Call the above function onChangeText() of your search field.
@ simaAttar- partage le code du composant
ListItem
.@Rocky J'ai édité ma question et inclus tout mon code.