我正在使用 react.js 为我的 Web 应用程序重写 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')
);
});
现在,我可以通过为TaskForm
添加一个getDataMixin
来添加一个select
元素,获取数据并构建可能选项的列表,但是我需要有包含多个列表的表单,并且这种方法似乎不具备扩展性(由于命名冲突;或者我需要使用其他东西而不是mixins)。
所以我想创建一个单独的React类
,它只包含getDataMixin
,通过父级设置其props
来接收API URL,并渲染<select>
元素;然后在表单中使用这个类。
但是我不知道如何访问所选值(因为父级无法访问它的子级的refs
)。
因此,我需要另一种将所选值“传递”上去的方法。
或者,如果这不可能,那就给我个正确方向的提示——我不想最终得到大量不能重复使用的代码(我切换到React的一部分原因是使用mixins并将代码保持在合理和可读的最低限度)。
this.forceUpdate()
。虽然大多数情况下只是个人偏好。 我已编辑我的答案进行更新。 - Mike Driver