2016-07-14 4 views
1

Я пытаюсь создать простое приложение поиска в реальном времени, чтобы узнать React.js. Я смог имитировать его с использованием фиктивных данных, но у меня возникают проблемы при попытке сделать то же самое с json из url/api. Я не хочу никакого события onClick, поэтому я использовал изменение состояния для поиска.Поиск в реальном времени с использованием response.js из url api

URL-адрес, с которого я буду получать данные должны быть как

URL = 'myurl/апи =' + SearchString;

Так что я хочу, чтобы данные были собраны в тот момент, когда я что-то набираю. Это возможно?

Пожалуйста, дайте мне знать, если я смогу это сделать без включения события onClick.

Вот мой fiddle для этого:

var SearchStock = React.createClass({ 

    getInitialState: function() { 
    return {searchString: '', data : []}; 
    }, 

    handleChange: function(e) { 
    this.setState({searchString: e.target.value}); 
    }, 

    componentDidMount: function() { 
    var url = 'myurl/api' + searchString; 
    this.serverRequest = $.get(url, function(result) { 
     var quote = result; 
     this.setState({quote}); 
    }.bind(this)); 
    }, 
    componentWillUnmount: function() { 
    this.serverRequest.abort(); 
    }, 

    render: function() { 
    var stocks = this.props.items, searchString = this.state.searchString.trim().toLowerCase(); 
    // var stocks = this.state.data, searchString = this.state.searchString.trim().toLowerCase(); 

    if (searchString.length > 0) { 
     stocks = stocks.filter(function(l) { 
     return l[Object.keys(l)[0]]["symbol"].toLowerCase().match(searchString); 
     }); 
    } 

    return <div > 
     < input type = "text" value = {this.state.searchString} onChange = {this.handleChange} placeholder = "Type here"/> 
     <ul> 
     {stocks.map(function(l) { 
      return <li > {l[Object.keys(l)[0]]["name"]} < /li> 
     }) 
     } 
     < /ul> 
    < /div>; 
    } 
}); 

var stocks = [{"F": {"symbol": "F", "name": "Ford Motor", "bidPrice": 13.41, "askPrice": 13.36}}]; 

// ReactDOM.render(< SearchStock />,document.getElementById('container')); 
ReactDOM.render(< SearchStock items = {stocks}/>, document.getElementById('container')); 

Я был бы признателен за любую помощь я могу получить. Пожалуйста, дайте мне знать, если есть ошибка. :)

ответ

3

Ваш пример только сделает запрос на поиск при установке компонента. Это конкретное событие жизненного цикла будет срабатывать только один раз, когда элемент сначала отображается в DOM, см.: https://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount.

Существует несколько способов управления этим типом функции, я бы рекомендовал сделать запрос на поиск в методе handleChange. Это первый момент, когда у нас есть доступ к данным, которые пользователь набрал, поэтому он идеально подходит для вашей функции. Я бы также рекомендовал разучивать обработчик, чтобы ваши запросы не выполнялись для символов, которые пользователь на самом деле не собирался искать. Вот хорошая статья об debouncing: https://davidwalsh.name/javascript-debounce-function

+0

Да, это имеет смысл. Но теперь, когда я проверю это. Я не думаю, что даже могу получить какие-либо данные, когда я жестко кодирую значение url, он все равно ничего не дает. Я сожалею, что я новичок в реакции, и я знаю, что это должно быть очень глупая ошибка на моем конце. Но я был бы признателен, если бы вы могли посмотреть на мою скрипку и проверить, что не так с тем, как я получаю данные с URL-адреса, поскольку я чувствую, что следил за их документацией для загрузки. Вначале я ожидаю «Форд Моторс» в списке. –

+0

Вот обновленный jsfiddle: http://jsfiddle.net/69z2wepo/49204/, однако этот код не будет работать. Ваш сервер не отвечает заголовками CORS, поэтому запросы от внешних серверов, таких как JSFiddle, будут отклонены. См. Https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS XMLHttpRequest не может загрузить http://data.benzinga.com/rest/richquoteDelayed?symbols=F. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Следовательно, «Начало» http://fiddle.jshell.net 'не допускается. –

Смежные вопросы