2017-06-14 6 views
2

私のアプリでlast.fm APIが動作しています。私は関連するアーティストをつかんでいます。だからアイデアはアーティストを検索し、関連するアーティストのリストを返します。React.js - onChange undefined

私は 'onClick'を使用すると、入力値を取得するので完璧に機能しますが、 'onChange'を使用したいので間違った結果を返すようです。私はそれがいくつかのステージや何かで未定義だからだと思う!

これを修正する方法はありますか?

// AJAX

import axios from "axios"; 

module.exports = { 
    fetchArtistCategory: (artist) => { 
    let key = "12345"; 
    let encodedURI = window.encodeURI('http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=' + artist + '&api_key=' + key + '&format=json'); 
    return axios.get(encodedURI) 
    .then((res) => { 
     return res 
    }); 
    } 
} 

//アプリケーション

import React from "react"; 
import {render} from "react-dom"; 
import Artists from "./components/Artists.js"; 
import Api from "./components/Api.js"; 

class App extends React.Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     artist: [], 
    } 

    this.searchArtist = this.searchArtist.bind(this); 
    } 
    componentDidMount() { 

    } 
    searchArtist() { 
    Api.fetchArtistCategory(this.searchArtists.value) 
    .then((res) => { 
     this.setState({ 
     artist: res.data.similarartists.artist 
     }); 
    }) 
    } 
    render() { 
    return (
     <div> 
     <Artists artistValue={this.state.artist} /> 
     <input type="text" placeholder="Search artist" ref={(ref) => this.searchArtists = ref} onChange={this.searchArtist} /> 
     <input type="submit"/> 
     </div> 
    ) 
    } 
} 

render(<App />, document.getElementById("main")); 
+0

'this.searchArtist'メソッドの中の' console.log(this.searchArtists) 'の出力は何ですか? – webdeb

答えて

2

「間違った結果を返す」ということを知らずに問題を診断するのは難しいです。私の最初の推測では、あなたは誤ってonChangeを考えているということです。

onchangeすべてのテキストの変更ごとに発生します。 "B"、 "Bo"、 "Bob"、 "Bobe"、 "Bob"(eを削除する)などの入力時に、変更するたびにonChangeが1回点火します。 "ボブ "...)。したがって、多くのAPIリクエストが発生します。これはオートコンプリートでは問題ありませんが、レート制限やスマートレスポンスの注文などが必要です。これはあなたとは異なるユースケースです。

ユーザーが思考を完了した後でAPIリクエストを1回だけ実行したいと思うようです。これを行うには、onfocusoutまたはonblur属性を試してください。名前が示すとおり、ユーザーが入力を完了してテキストフィールドを終了したときに発生します。

+0

こんにちは、 あなたの説明は正しいです、それはまさに私が探しているものです。 APIの入力が必要な場合は、アーティストの最終的な手紙を入力した後に正しい結果を得られないのはなぜですか? FWIW onBlurは外部をクリックしても機能しますが、入力の途中で間違いなくその例を見ることができます。 –

+0

人々が1秒あたり約5文字を入力すると仮定すると、毎秒5回のapi要求を送信しています。各リクエストは、応答するのに予測できない時間を要します。また、いくつかのAPIは、1秒あたりのリクエスト数を制限します。したがって、順序付けられていない応答のストリームが戻ってきており、最新の要求が最新の応答に対応していると想定することはできません。 RxJSは、これを処理し、レート制限を調べるための素晴らしいツールです。 –

+0

ええ、スティーブン・グリッターのビデオがあります。そこではYouTubeのAPI検索を使用していました。多分それは応答するのが速いでしょう! ありがとうございます。 –

-1

あなたはのonChangeハンドラでを通じてイベントを渡すべきではありませんか?

searchArtist(event) { 
    Api.fetchArtistCategory(event.target.value) 
    .then((res) => { 
     this.setState({ 
     artist: res.data.similarartists.artist 
     }); 
    }) 
    } 

^あなたは私が誤解をしていない限り、他のすべてが

し、正しい場合は、参照が必要な場合は変更する必要がなければならないコードの唯一の作品。入力フィールドの値は、イベントハンドラの内部にevent.target.valueとして取得されます。