Как выделить результаты поиска в React-Native FlatList?

Я новичок в React-native. Мне нужно выделить результаты поиска в моем FlatList, пока я печатаю в строке поиска. Есть 2 компонента: react-native-highlight-words и react-native-text-highlight, но я не могу понять, как используйте их! вот мой код:

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({
 ...

Я хочу, чтобы результаты выглядели так:

введите здесь описание изображения

Любая помощь будет принята с благодарностью.


person simaAttar    schedule 28.02.2019    source источник
comment
@simaAttar- поделитесь кодом компонента ListItem.   -  person Rocky    schedule 01.03.2019
comment
@Rocky Я отредактировал свой вопрос и включил весь код.   -  person simaAttar    schedule 01.03.2019


Ответы (3)


Вы можете передать текст или пользовательское представление в ListItem компонент как props для title . Я использую React Native Highlight Words, чтобы выделить текст, как вы сказали.

добавьте React Native Highlight Words, добавив следующую строку:

import Highlighter from 'react-native-highlight-words';

Код обновления для компонента ListItem для желаемого результата:

<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 }}
/>
person Rocky    schedule 05.03.2019

Вы можете выделить, используя свои собственные стили.

Вот простой пример:

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"
  }
})

В вашем случае вы можете настроить containerStyle из <ListItem />.

person J. Hesters    schedule 28.02.2019
comment
хммм..спасибо @J. Хестерс. Дай мне посмотреть, что я могу сделать :| - person simaAttar; 28.02.2019
comment
@simaAttar Дайте мне знать, если вы не можете этого сделать, и я могу помочь вам больше. - person J. Hesters; 28.02.2019
comment
На самом деле я не понимаю, как реализовать ваш код на моем, к вашему сведению, это приложение-словарь, которое будет искать слова в flatList, поэтому, если вы все еще считаете, что ваш код подходит, пожалуйста, объясните подробнее. Большое спасибо - person simaAttar; 28.02.2019
comment
Я не вижу достаточно кода для этого. Кроме того, код отформатирован таким образом, что его трудно читать. - person J. Hesters; 28.02.2019

 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
  }
})

};

Вызовите указанную выше функцию onChangeText() вашего поля поиска.

person ishab acharya    schedule 05.03.2019