私は、検索に基づいてOMDb APIからムービーデータをロードする単純なReactアプリケーションを作成しています。親コンポーネント内から子コンポーネントの参照にアクセスする
しかし、私はアプリをリファクタリングし、親のコンテナコンポーネントにデータフェッチロジックを追加しました。現在、検索フィールドの値にrefs
でアクセスして、コンテナコンポーネント内からアクセスできません。
私のコンポーネント階層は(独自のファイル内の各コンポーネント)を次のようになります。
state
と
props
は大丈夫であるように見えるし、正しく渡されています。これは、主成分のためのJSです - 私は、APIからデータをフェッチするaxiosを使用しています:
class SearchForm extends Component {
constructor() {
super();
this.state={
searchText: ''
};
}
_onSearchChange(e) {
const searchText = e.target.value;
this.setState({ searchText: searchText });
}
_handleSubmit(e) {
if (e) e.preventDefault();
this.props.onSearch(this.state.Search);
}
render() {
return (
<form className="search-form" onSubmit={this._handleSubmit.bind(this)} >
<label className="is-hidden" for="search">...</label>
<input type="search"
onChange={this._onSearchChange.bind(this)}
name="search"
ref="query"
placeholder="Search a Title..." />
<button type="submit" id="submit" className="search-button">...</button>
</form>
);
}
}
:
class MovieSearchContainer extends Component {
constructor(props) {
super(props);
this.state = {
Search: []
};
this._performSearch = this._performSearch.bind(this);
}
_performSearch() {
var _this = this;
let query = I WANT TO ACCESS THE SEARCH FIELD VALUE HERE, maybe?;
this.serverRequest =
axios
.get(`http://www.omdbapi.com/?s=${query}&r=json`)
.then(function(result) {
_this.setState({
Search: result.data.Search
});
})
.catch((error) => {
console.log('Error fetching and parsing data', error);
});
}
render() {
return(
<Application query={this.state.Search}
onSearch={this._performSearch} />
);
}
}
ReactDOM.render(<MovieSearchContainer />, document.getElementById('app'));
をその後、さらにネストされた、私は次のJSと<SearchForm />
コンポーネントを持っています
大きな質問は、<SearchForm />
内のinput
のref
(または値)に、<MovieSearchContainer />
からアクセスして、その値をAPI呼び出しに渡すことができますか?
// MovieSearchContainer
_performSearch() {
var _this = this;
let query = I WANT TO ACCESS THE SEARCH FIELD VALUE HERE, maybe?;
this.serverRequest =
axios
.get(`http://www.omdbapi.com/?s=${query}&r=json`)
.then(function(result) {
_this.setState({
Search: result.data.Search
});
})
}
このロジックは他の場所に配置する必要がありますか?
ReactDOM.findDOMNode(this.refs.query).value
などの方法を試しましたが、運がありません。
もっとコードを提供する必要がある場合はお知らせください。 :)
[React:コンテナコンポーネントに返信しますか?](http://stackoverflow.com/questions/37595888/react-send-ref-back-to-container-component) – azium
それはすべてのようですあなたのコンポーネントには上から下に渡す 'onSearch'プロパティがあります。そして、 'SearchForm'は値をコンポーネントツリーの上に渡しています。 '_performSearch(query)'に対応する引数を追加するだけです。 –
ありがとう!しかし、それはまだ未定義として返すように見えます。 – Guilh