此处的CodePen(减去删除Ajax请求):http://codepen.io/martincarlin87/pen/KzPWOw
我一直在尝试学习React几天,并尝试在我的Web应用程序中转换一个页面以使用它,而不仅仅是jQuery和Vanilla JS。
目前,有一个HTML表,该表显示数据库表中的行,其中的列包含用于编辑和删除行的链接。在收到有关上一个问题的帮助后,我最终设法在昨天完成了删除工作,因此我现在尝试扩展它并允许编辑。
我正在使用handleEditModel
,但是我不确定如何从那里填充并显示模式,其次,一旦单击模式页脚中的“提交”按钮,如何发送ajax请求。
使用jQuery,我会做类似的事情:
$(document).on('shown.bs.modal', '#edit_model_modal', function () {
$('#edit_model_form input[name="model[property_1]"]').focus();
});
$('#edit_blackhole_form input').keypress(function (e) {
if (e.which == 13) {
$('#edit_model').click();
}
});
$(document).on('click', '.edit_model_link', function() {
// get data and populate modal form, then show:
$('#edit_model_modal').modal('show');
});
然后是另一个处理提交和ajax请求的功能
$(document).on('click', '#edit_model', function() {
// validate form
$.ajax({
...
});
});
上面不是问题,但是我只是无法理解如何做,所以我只是想更新Web应用程序中最简单的页面以使其更加熟悉,以便可以在其他应用程序上开始使用它。页面。
对于问题中的大量代码表示歉意,但我只想提供一个完整的图片,但是如果我能得到这个,我想我将能够完成其余工作。
var Models = React.createClass({
getInitialState: function() {
return {models: this.props.models};
},
handleEditModel: function(id) {
// populate and show modal from here
// and then be able to click the submit button to send the ajax request
},
handleRemoveModel: function(id) {
$.ajax({
url: '/model/ajax_delete',
data: { model_id: id },
type: 'POST',
cache: false,
success: function(data) {
this.setState({ models: data });
}.bind(this),
error: function() {
console.log('error');
}.bind(this)
});
},
render: function() {
var rows = [];
this.state.models.map(function(model) {
rows.push(
<Model
model={model}
key={model.id}
onRemove={this.handleRemoveModel}
onEdit={this.handleEditModel}
/>
);
}, this);
return (
<div className="row">
<div className="col-md-12">
<table id="models_list" className="table table-striped table-bordered table-hover">
<thead>
<tr role="row" className="heading">
<th>Property 1</th>
<th>Property 2</th>
<th className="text-center">Options</th>
</tr>
</thead>
<tbody>{rows}</tbody>
</table>
</div>
</div>
);
}
});
var Model = React.createClass({
handleEditModel: function() {
this.props.onEdit(this.props.model.id);
},
handleRemoveModel: function() {
this.props.onRemove(this.props.model.id);
},
render: function() {
return (
<tr id={"model_" + this.props.model.id}>
<td>{this.props.model.property_1}</td>
<td>{this.props.model.property_2}</td>
<td className="text-center">
<a href="javascript:;" className="btn btn-xs" onClick={this.handleEditModel}><i className="fa fa-pencil"></i></a> <a href="javascript:;" className="btn btn-xs" onClick={this.handleRemoveModel}><i className="fa fa-remove"></i></a>
</td>
</tr>
);
}
});
var EditModelModal = React.createClass({
render: function () {
return (
<div id="edit_model_modal" className="modal fade" tabIndex="-1" role="basic" aria-hidden="true">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<button type="button" className="close" data-dismiss="modal" aria-hidden="true"></button>
<h4 className="modal-title">Edit Model</h4>
</div>
<div className="modal-body">
<form id="edit_model_form" action="#" className="form-horizontal">
<input type="hidden" name="model_id" value="" />
<div className="form-group">
<label className="col-md-3 control-label">Property 1 <span className="mandatory" aria-required="true">*</span></label>
<div className="col-md-9">
<input type="text" className="form-control input-medium" name="model[property_1]" />
</div>
</div>
<div className="form-group">
<label className="col-md-3 control-label">Property 2</label>
<div className="col-md-9">
<input type="text" className="form-control" name="model[property_2]" />
</div>
</div>
</form>
</div>
<div className="modal-footer">
<button type="button" className="btn" data-dismiss="modal">Cancel</button>
<button type="button" id="edit_model" className="btn" data-dismiss="modal">Edit</button>
</div>
</div>
</div>
</div>
);
}
})
ReactDOM.render(
<Models models={<%= @models.to_json %>} />,
document.getElementById('react')
);
最佳答案
我认为您不应该自行管理模态详细信息。我建议您看一下https://react-bootstrap.github.io/(在Bootstrap modal in React.js中建议)。这是一个文档齐全的库,并且其中包含一个不错的Modal。
var Modal = ReactBootstrap.Modal
然后将其用作
<Modal/>
。请注意,
Modal
具有show
属性,当它是true
时,将显示模式。最好使用它是将其包装在存储状态
{show : true/false}
的自己的组件中。然后声明一个打开和关闭方法,以相应地更改状态。var BootstrapModal = React.createClass({
getInitialState : function () {
return {
show : false
}
},
close: function() {
if (!this.state.saving) {
this.setState({
show: false
});
}
},
open: function() {
this.setState({
show : true
});
},
render: function() {
return (
<Modal show={this.state.show}>
...
</Modal>
);
},
});
当您在外部组件中使用它时,您可以执行以下操作:
var MyComponent = React.createClass({
handleSomeEventInARowSomewhere : function () {
....
this.refs.mymodal.open();
},
render : function () {
return (
...
<BootstrapModal ref="mymodal"/>
...
)
}
});
这样,您可以在需要时打开模式,看到可以在open方法中传递内容,因此可以根据自己的需要随意调整此示例。
关于javascript - React-如何填充并显示模态,然后在提交时发送AJAX请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35624858/