Функция поиска не работает согласованно в React - PullRequest
0 голосов
/ 02 апреля 2020

Я создал приложение React, используя этот API , а затем попытался добавить функцию поиска. Все работает нормально, но иногда я не вижу результат поиска. Например, если вы посмотрите на этот снимок экрана , вы сможете увидеть то, что я пытаюсь сказать. Кроме того, я хочу игнорировать чувствительность к регистру и хотел бы получить точный результат независимо от его регистра. Я пытался преобразовать искомый термин и страны в верхний регистр, но это не давало правильных результатов.

Приложение. js:

import React, { Component } from 'react'
import Result from './Result';
import Form from 'react-bootstrap/Form';


export default class App extends Component {
  constructor(){
    super();
    this.state = {
      data: [],
      searchText:'',
      searchResult:[],
      isSearch:false
    }
    this.onSearchChange=this.onSearchChange.bind(this);
   // this.fetchSearchResult=this.fetchSearchResult.bind(this);
  }

  onSearchChange= (e) =>{
    console.log("search change "+this.state.searchText)
    this.setState({
      searchText:e.target.value,
      isSearch:!this.state.isSearch
    })
    console.log("api data"+this.state.data)
  }

  /* fetchSearchResult= () =>{
    console.log(this.state.searchText)
    console.log("inside fetch")
   let store= this.state.data.map(item=>{
      let {country}=item
      return(country)
    })
    console.log(store)
    var areEqual = store.includes(this.state.searchText);
     console.log(this.state.areEqual)
     return (areEqual)? 
      store:'not matched'
  //  return store;

  } */

  componentDidMount() {
    const url =
    'https://corona.lmao.ninja/countries?sort=country'
    fetch(url)
      .then(result => result.json())
      .then(result => {
        this.setState({
          data: result,
        })
      })
  }
  render() {
    return (
      <div>

       <Form.Group>
       <Form.Label>Search</Form.Label>
        <Form.Control value={this.state.searchText}onChange={this.onSearchChange} type="text" placeholder="Enter country" />
      </Form.Group>
        <Result data={this.state.data} 
        toSearch={this.state.searchText} 
        searchCheck={this.state.isSearch}
        searchValue={this.state.searchText}/>
      </div>
    )
  }
}

Результат. js

import React  from 'react'
import Table from 'react-bootstrap/Table';

const Result = (props) => {
    console.log('props value is:'+props.data)
    let {searchCheck, searchValue}=props;

   let update=props.data.reverse().map((item)=>{

    const { countryInfo, country, cases, deaths, recovered, active, casesPerOneMillion} = item;
    return(
    (searchCheck)?country.includes(searchValue)?
        <tbody>
        <tr key={countryInfo._id}>
          <td><img style={{height:'25px',width:'50px'}}src={countryInfo.flag}/></td>
         <td>{country}</td>
          <td>{cases}</td>
          <td>{active}</td>
          <td>{recovered}</td>
          <th>{casesPerOneMillion}</th>
          <td>{deaths}</td>
        </tr>
      </tbody>:
      '':
      <tbody>
        <tr key={countryInfo._id}>
          <td><img style={{height:'25px',width:'50px'}}src={countryInfo.flag}/></td>
         <td>{country}</td>
          <td>{cases}</td>
          <td>{active}</td>
          <td>{recovered}</td>
          <th>{casesPerOneMillion}</th>
          <td>{deaths}</td>
        </tr>
      </tbody>
    )  
    })
    return (
      <div>
          <Table striped bordered hover variant="dark">
          <thead>
        <tr>

          <th>Flag</th>
          <th>Country</th>
          <th>Cases</th>
          <th>Active</th>
          <th>Recovered</th>
          <th>Cases per one Million</th>
          <th>Deaths</th>


        </tr>
      </thead>
          {update}
          </Table>
      </div>
    )
  }
export default Result;

Ссылка в песочнице

1 Ответ

0 голосов
/ 02 апреля 2020

Проблема с вашей функцией onSearchChange. Для каждой замены в поле ввода вы пытаетесь сбросить состояние isSearch. Из-за этого поиск становится ложным через нечетные интервалы, в результате чего результаты поиска не фильтруются. Следовательно, вы видите весь список стран, хотя в окне поиска есть какой-то поисковый запрос. Вам вообще не нужен этот поиск. Если в поле поиска есть какой-либо текст, тогда выполняется фильтрация, иначе он отображает весь список.

Вот рабочая демонстрация этого - https://codesandbox.io/s/cool-poitras-tuu55

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...