Я все еще относительно новичок в React. Медленно я пытаюсь интегрировать реакцию в качестве внешнего интерфейса для моего веб-сайта MVC, однако, похоже, я застрял на переносе вызова AJAX в свою таблицу EmployeeGrid. Для моего индекса я делаю следующее
<Route exact path='/' component = {Intro} />
<Route exact path='/Home/GSC' component = {GSC} />
Интро работает нормально, а GSC работает частично. Данные не отображаются в таблице. Это то, что у меня есть в моем GSC.js
import React from 'react';
function EmployeeGridRow() {
<tr>
<td>{this.props.item.AccountID}</td>
<td>{this.props.item.AccountName}</td>
<td>{this.props.item.SenderName}</td>
<td>{this.props.item.SenderEmail}</td>
<td>{this.props.item.ITEmailReceipients}</td>
<td>{this.props.item.Active}</td>
</tr>;
}
class EmployeeGridTable extends React.Component {
getInitialState() {
return {
items: []
};
}
componentDidMount() {
//Fetch data via ajax
$.get(this.props.dataUrl, function (data) {
if (this.isMounted()) {
this.setState({
items: data
});
}
}.bind(this));
}
render() {
var rows = [];
this.state.items.forEach(function (item) {
rows.push(
<EmployeeGridRow key = {item.AccountID} item = {item} />);
});
return (
<table className = "table table-bordered table-responsive">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Sender</th>
<th>Email</th>
<th>IT Support</th>
<th>Active</th>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>);
}
}
export default EmployeeGridTable(dataUrl = "/Home/GetEmployeeData");Какие-либо предложения?
Обновлять
Я думаю, что, может быть, я плохо объяснил. Следующее ниже работает, но только если я вставлю его в .cshtml. Есть ли способ преобразовать это в файл JS или JSX?
<script type = "text/babel">
@* Here we will create 2 react component 1 for rows and another for table *@
var EmployeeGridRow = React.createClass({
render : function(){
return (
<tr>
<td>{this.props.item.AccountID}</td>
<td>{this.props.item.AccountName}</td>
<td>{this.props.item.SenderName}</td>
<td>{this.props.item.SenderEmail}</td>
<td>{this.props.item.ITEmailReceipients}</td>
<td>{this.props.item.Active}</td>
</tr>
);
}
});
var EmployeeGridTable = React.createClass({
getInitialState: function(){
return {
items:[]
}
},
componentDidMount:function(){
@* Fetch data via ajax *@
$.get(this.props.dataUrl, function(data){
if (this.isMounted()){
this.setState({
items: data
});
}
}.bind(this));
},
render : function(){
var rows = [];
this.state.items.forEach(function(item){
rows.push(
<EmployeeGridRow key = {item.AccountID} item = {item} />);
});
return (
<table className = "table table-bordered table-responsive">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Sender</th>
<th>Email</th>
<th>IT Support</th>
<th>Active</th>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>);
}
});
ReactDOM.render(
<EmployeeGridTable dataUrl = "/Home/GetEmployeeData" />,
document.getElementById('griddata')
);
Нет, он не возвращает данные. Однако, когда я конвертирую его в babel на странице cshtml, я могу вернуть данные, и таблица заполняется. (Я не хочу использовать Babel).
this.isMounted() здесь бесполезен, метод componentDidMount вызывается, когда ваш компонент уже смонтирован, на что указывает имя метода
Когда вы говорите «преобразовать его в Babel» — вы просто используете вышеизложенное в файле js и ссылаетесь на него ??
Несколько небольших изменений, но да, в значительной степени. Я использую вышеизложенное в файле cshtml с тегом script «text/babel».





Вы не должны предоставлять такие реквизиты, вы фактически создаете экземпляр компонента, когда вы должны только предоставить класс или функцию для создания экземпляра в других компонентах.
export default EmployeeGridTable;
В других компонентах:
<Route exact path='/' component = {Intro} />
<Route exact path='/Home/GSC' component = {() => <GSC dataUrl = "/Home/GetEmployeeData" />} />
Функциональный компонент EmployeeGridRow получает props в качестве параметра, поэтому для доступа к элементу он должен быть props.item, а не this.props.item.
Изменять
function EmployeeGridRow() {
<tr>
<td>{this.props.item.AccountID}</td>
<td>{this.props.item.AccountName}</td>
<td>{this.props.item.SenderName}</td>
<td>{this.props.item.SenderEmail}</td>
<td>{this.props.item.ITEmailReceipients}</td>
<td>{this.props.item.Active}</td>
</tr>;
}
К
function EmployeeGridRow(props){
<tr>
<td>{props.item.AccountID}</td>
<td>{props.item.AccountName}</td>
<td>{props.item.SenderName}</td>
<td>{props.item.SenderEmail}</td>
<td>{props.item.ITEmailReceipients}</td>
<td>{props.item.Active}</td>
</tr>;
}
Вы подтвердили, что получаете данные обратно? Например.
console.info(data)в обратном вызове ajax?