我正在react.js 中重写我的网络应用程序的UI,并且我对以下问题有点困惑。
我有一个页面显示通过 AJAX 请求获取的数据,在该页面下方显示一个用于提交新数据的表单。都好。
现在,我想添加一个<select>
元素到表单,并从不同的位置 (url) 获取值。
当前代码(不带<select>
)看起来像这样(稍微简化了一点,但所有工作细节都是相同的;它主要遵循react.js网站上的教程):
var tasks_link = $('#tasks_link');
var getDataMixin = {
loadDataFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentDidMount: function() {
this.loadDataFromServer();
}
};
var sendDataMixin = {
handleDataSubmit: function(senddata) {
$.ajax({
url: this.props.url,
dataType: 'json',
contentType: 'application/json',
type: 'POST',
data: senddata,
success: function(data) {
var curr_d = this.state.data;
var curr_d_new = curr_d.concat([data]);
this.setState({data: curr_d_new});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
}
};
var taskForm = React.createClass({
handleSubmit: function() {
var name = this.refs.task_name.getDOMNode().value.trim();
if (!name) {
return false;
}
this.props.onTaskSubmit(JSON.stringify({name: name}));
this.refs.task_name.getDOMNode().value = '';
return false;
},
render: function () {
return (
<form className="well base_well new_task_well" onSubmit={this.handleSubmit}>
<div className="form-group">
<div className="input-group">
<span className="input-group-addon no_radius">Task name</span>
<input type="text" className="form-control no_radius" id="add_new_project_input" ref="task_name"/>
</div>
</div>
<button type="button" className="btn btn-default no_radius add_button" id="add_new_task_btn" type="submit">Add task</button>
</form>
);
}
});
var taskBox = React.createClass({
mixins: [getDataMixin, sendDataMixin],
render: function () {
return (
<div id="project_box" className="taskBox"> <taskList data={this.state.data} />
<taskForm onTaskSubmit={this.handleDataSubmit}/> </div>
);
}
});
tasks_link.click(function() {
React.renderComponent(
<taskBox url="/api/tasks/" />,
document.getElementById('content_container')
);
});
现在,我可以添加一个select
元素通过添加一个getDataMixin
to TaskForm
,获取数据并构建可能选项的列表,但我需要拥有包含许多列表的表单,并且该方法似乎无法扩展(由于命名冲突;或者我需要使用 mixin 以外的东西) 。
所以我想创建一个单独的React class
,这只会有getDataMixin
,通过父级设置接收 API urlprops
,并渲染<select>
元素;并在表单中使用此类。
但我不知道如何访问所选值(因为父级无法访问其子级的值)refs
)。
所以我需要另一种方法来“向上”传递所选值。
或者,如果这是不可能的,那就朝正确的方向轻推——我不想最终得到大量不可重用的代码(我转而使用 React 的部分原因是使用 mixins 并保留代码保持在合理且可读的最低限度)。