Подача данных Ajax в React

Я все еще относительно новичок в 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')
);

Вы подтвердили, что получаете данные обратно? Например. console.info(data) в обратном вызове ajax?

Fermin 05.03.2019 15:56

Нет, он не возвращает данные. Однако, когда я конвертирую его в babel на странице cshtml, я могу вернуть данные, и таблица заполняется. (Я не хочу использовать Babel).

K.Reed 05.03.2019 16:00
this.isMounted() здесь бесполезен, метод componentDidMount вызывается, когда ваш компонент уже смонтирован, на что указывает имя метода
Treycos 05.03.2019 16:01

Когда вы говорите «преобразовать его в Babel» — вы просто используете вышеизложенное в файле js и ссылаетесь на него ??

Fermin 05.03.2019 16:20

Несколько небольших изменений, но да, в значительной степени. Я использую вышеизложенное в файле cshtml с тегом script «text/babel».

K.Reed 05.03.2019 16:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не должны предоставлять такие реквизиты, вы фактически создаете экземпляр компонента, когда вы должны только предоставить класс или функцию для создания экземпляра в других компонентах.

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>;
    }

Другие вопросы по теме