我正在开发一个我有3个组件的应用程序:Component1
,Component2
和Component3
。所有组件都使用AJAX从RESTful服务检索数据。初始化应用程序时,Component1
将检索数据列表。 Componet1
中的每个项目都是一个链接,用于在点击时根据其键/ ID检索Component2
的数据。 Component2
也是如此,它将以相同的方式检索Component3
的数据。
因此,如果我们想象以下主要成分:
var ComponentItems = React.createClass({
render: function() {
return <li className="list-group-item" key={this.props.data.id}><a onClick={this.handleClick}>{this.props.data.name}</a></li>;
},
handleClick: function () {
this.props.onClick(this);
}
});
var Component1 = React.createClass({
getInitialState: function() {
return {componentsList: []};
},
componentWillMount: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setState(data);
console.log(data);
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
render: function() {
var componentItems = this.state.componentsList.map(function (item) {
return <ComponentItem data={item} onClick={this.handleClick} />;
});
return (
<div className="col-lg-3">
<ul className="list-group">
{componentItems}
</ul>
</div>
);
},
handleClick: function (aComponent) {
alert("test");
}
});
var MainComponent = React.createClass({
render: function() {
return (
<div>
<Component1 url="/api/dataSource1/" />
<Component2 />
<Component3 />
</div>
);
}
});
正如您在此示例中所见,我尚未实施Component2
或Component 3
。但是当点击ComponentItem
时,我想在Component2
中使用其密钥调用AJAX URL,例如。如果该项目有密钥3:
<Component2 url="/api/dataSource2/3`>
我不确定我应该如何构建程序以及点击处理是否应该在MainComponent
或Component1
内完成?
可能有点超出此示例范围的另一件事是多次选择Component 2
,它将传递一个key / id数组。
答案 0 :(得分:1)
在我看来,最好在MainComponent中处理click,因为它可以直接访问component2。
在ComponentItem
var ComponentItem = React.createClass({
render: function() {
return <li className="list-group-item" key={this.props.data.id}><a onClick={this.handleClick}>{this.props.data.name}</a></li>;
},
handleClick: function () {
this.props.onClick(this.props.data);
}
});
在Component1
中,渲染方法可以如下所示,以获取点击项目的键。
handleClick: function (aComponent) {
this.props.onClick(aComponent);
}
render: function() {
var componentItems = this.state.componentsList.map(function (item) {
return <ComponentItem data={item} onClick={this.handleClick.bind(this)} />;
}, this);
return (
<div className="col-lg-3">
<ul className="list-group">
{componentItems}
</ul>
</div>
);
},
在MainComponent
中,您可以引用Component2,一旦捕获到事件,您就可以执行以下操作
var MainComponent = React.createClass({
handleClick: function(index){
this.refs.component2.setState({
url: '/api/dataSource2/' + index
});
},
render: function() {
return (
<div>
<Component1 url="/api/dataSource1/" onClick={this.handleClick}/>
<Component2 ref="component2" />
<Component3 />
</div>
);
}
});
希望这有帮助。