[解決済み】ReactJS 2つのコンポーネントが通信しています。
質問
ReactJSを始めたばかりですが、ある問題で少し行き詰っています。
私のアプリケーションは、基本的にフィルタとレイアウトを変更するためのボタンを持つリストです。
今のところ、3つのコンポーネントを使用しています。
<list />
,
< Filters />
と
<TopBar />
での設定を変更すると、明らかに
< Filters />
で何らかのメソッドを起動させたい。
<list />
を使用してビューを更新します。
この3つのコンポーネントが相互に作用するようにするにはどうすればよいでしょうか。それとも、ある種のグローバルなデータモデルが必要で、そこに変更を加えるだけでよいのでしょうか。
どのように解決するのですか?
最適な方法は、これらのコンポーネントをどのように配置するかによります。今すぐ思いつくシナリオの例をいくつか挙げてみましょう。
-
<Filters />
の子コンポーネントです。<List />
-
両方
<Filters />
と<List />
は、親コンポーネントの子コンポーネント -
<Filters />
と<List />
は完全に別のルートコンポーネントに住んでいます。
私が考えていない他のシナリオもあるかもしれません。もし、あなたのものがこれらのシナリオに当てはまらないのであれば、私に教えてください。以下は、私が最初の2つのシナリオをどのように扱っているかの、非常に大まかな例です。
シナリオ#1
からのハンドラを渡すことができます。
<List />
から
<Filters />
で呼び出すことができます。
onChange
イベントを使用して、現在の値でリストをフィルタリングします。
/** @jsx React.DOM */
var Filters = React.createClass({
handleFilterChange: function() {
var value = this.refs.filterInput.getDOMNode().value;
this.props.updateFilter(value);
},
render: function() {
return <input type="text" ref="filterInput" onChange={this.handleFilterChange} placeholder="Filter" />;
}
});
var List = React.createClass({
getInitialState: function() {
return {
listItems: ['Chicago', 'New York', 'Tokyo', 'London', 'San Francisco', 'Amsterdam', 'Hong Kong'],
nameFilter: ''
};
},
handleFilterUpdate: function(filterValue) {
this.setState({
nameFilter: filterValue
});
},
render: function() {
var displayedItems = this.state.listItems.filter(function(item) {
var match = item.toLowerCase().indexOf(this.state.nameFilter.toLowerCase());
return (match !== -1);
}.bind(this));
var content;
if (displayedItems.length > 0) {
var items = displayedItems.map(function(item) {
return <li>{item}</li>;
});
content = <ul>{items}</ul>
} else {
content = <p>No items matching this filter</p>;
}
return (
<div>
<Filters updateFilter={this.handleFilterUpdate} />
<h4>Results</h4>
{content}
</div>
);
}
});
React.renderComponent(<List />, document.body);
シナリオ#2
シナリオ#1 と似ていますが、親コンポーネントはハンドラ関数を
<Filters />
に、フィルタリングされたリストを渡します。
<List />
. 私はこの方法の方が好きです。
<List />
から
<Filters />
.
/** @jsx React.DOM */
var Filters = React.createClass({
handleFilterChange: function() {
var value = this.refs.filterInput.getDOMNode().value;
this.props.updateFilter(value);
},
render: function() {
return <input type="text" ref="filterInput" onChange={this.handleFilterChange} placeholder="Filter" />;
}
});
var List = React.createClass({
render: function() {
var content;
if (this.props.items.length > 0) {
var items = this.props.items.map(function(item) {
return <li>{item}</li>;
});
content = <ul>{items}</ul>
} else {
content = <p>No items matching this filter</p>;
}
return (
<div className="results">
<h4>Results</h4>
{content}
</div>
);
}
});
var ListContainer = React.createClass({
getInitialState: function() {
return {
listItems: ['Chicago', 'New York', 'Tokyo', 'London', 'San Francisco', 'Amsterdam', 'Hong Kong'],
nameFilter: ''
};
},
handleFilterUpdate: function(filterValue) {
this.setState({
nameFilter: filterValue
});
},
render: function() {
var displayedItems = this.state.listItems.filter(function(item) {
var match = item.toLowerCase().indexOf(this.state.nameFilter.toLowerCase());
return (match !== -1);
}.bind(this));
return (
<div>
<Filters updateFilter={this.handleFilterUpdate} />
<List items={displayedItems} />
</div>
);
}
});
React.renderComponent(<ListContainer />, document.body);
シナリオ#3
コンポーネントが何らかの親子関係で通信できない場合は のドキュメントでは、グローバルなイベントシステムを設定することを推奨しています。 .
関連
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] JavaScriptで2次元の配列を作成するにはどうすればよいですか?
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み] ReactJSでコンポーネントがtext型の非制御入力を制御エラーに変更する場合
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
-
[解決済み】ReactJS - "setState "が呼ばれるたびにrenderが呼び出されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み】React.jsで親コンポーネントにpropsを渡す。
-
[解決済み】React.js: あるコンポーネントを別のコンポーネントにラップする
-
[解決済み】Reduxで非同期アクションを実行するモーダルダイアログを表示するにはどうすればよいですか?