Результаты AsyncTypeahead не отображаются на экране - PullRequest
1 голос
/ 14 апреля 2019

Я пытался интегрировать функциональность AsyncTypeahead из библиотеки реагировать на начальную загрузку.Я пытаюсь использовать это с TheMovieDB поиск API .Я могу видеть из вывода консоли разработчика, что я делаю запросы API, и результаты передаются обратно в компонент AsyncTypeahead, но он говорит: «Не найдено ни одного совпадения».на моем экране.

Я скопировал большую часть кода из их github для реализации AsyncTypeahead и даже вижу, что результаты отклика передаются в опции компонента Typeahead.Поэтому я не уверен, что мне не хватает, чтобы они отображались на экране, как в их примерах.

Мой компонент реализации поиска

import React from 'react';
import {AsyncTypeahead} from 'react-bootstrap-typeahead';
import axios from 'axios';
import SearchResultMenuItem from './SearchResultMenuItem';

//Needs to be a class based component, as we have to handle state
class SearchBar extends React.Component {
    state = { 
        term: '',
        options: [],
        isLoading: false
    };

    onFormSubimit = (event) => { //Arrow function makes sure the value of 'this' is always the instance of the search bar 
        event.preventDefault(); //Stops browser from submitting form automatically and refreshing the pagee
        this.props.onSubmit(this.state.term);
    }

    onHandleSearch = async (term) => {
        this.setState({isLoading: true});
        const response = await axios.get('https://api.themoviedb.org/3/search/movie?api_key=c055530078ac3b21b64e0bf8a0b3b9e1&language=en-US&page=1&include_adult=false', {
            params: { query: term }
        });

        //Extract details from the search 
        const searchResults = response.data.results.map((i) => ({
            title: i.original_title,
            id: i.id,
          }));

        this.setState({
            isLoading: false,
            options: searchResults
        })     
    }


    render() {
        return (
            <div className="ui segment">
                <form onSubmit={this.onFormSubimit} className="ui form">
                    <div className="field">
                        <label>Image Search</label>
                        <AsyncTypeahead
                            {...this.state}
                            labelKey="original_title"
                            isLoading={this.state.isLoading}
                            onSearch={this.onHandleSearch}
                            placeholder="Enter a Movie Title..."
                            renderMenuItemChildren={(option, props) => (
                                <SearchResultMenuItem key={option.id} item={option} />
                              )}
                        />
                    </div>                    
                </form>
            </div>
        );
    }
}

export default SearchBar;

Мой компонент SearchResultMenuItem

import PropTypes from 'prop-types';
import React from 'react';

const SearchResultMenuItem = ({item}) => (
    <div>
        <img
            style={{
                height: '24px',
                marginRight: '10px',
                width: '24px',
            }}
        />
        <span>{item.original_title}</span>
  </div>
);

SearchResultMenuItem.propTypes = {
    item: PropTypes.shape({
        original_title: PropTypes.string.isRequired,
    }).isRequired,
};

export default SearchResultMenuItem;

Ожидаемые результаты

Я ожидаю, что список названий фильмов будет отображаться как варианты выбора, которые будут получены из ответа на запрос API-интерфейса TheMovieDB.

Фактические результаты

Простой пользовательский интерфейс отображает на экране сообщение Совпадений не найдено .

В консоли появляется предупреждающее сообщение: Предупреждение: [response-bootstrap-typeahead] Пропеллер id необходим, чтобы сделать Menu доступным для пользователей вспомогательных технологий, таких как программы чтения с экрана. Я попытался найти это, но не нашел никаких решений.

Ниже приведены скриншоты с консоли разработчика Warning message

Developer console output

Результаты поиска API можно найти в options array выше

Update UI After Fix

Update UI

1 Ответ

4 голосов
/ 15 апреля 2019

Пожалуйста, используйте labelKey="title" в AsyncTypeahead, так как ваш объект параметров имеет заголовок. Также в SearchResultMenuItem измените <span>{item.title}</span>, также измените также реквизиты title: PropTypes.string.isRequired. Это должно решить проблему. Кроме того, чтобы удалить предупреждение об идентификаторе, просто предоставьте уникальное имя идентификатора компоненту AsyncTypeahead, например id="some_unique_id" (это может быть любой случайный идентификатор)

...