Я новичок в React. Я просто пытаюсь создать таблицу данных, поступающих из API, который я получил из него. Но теперь я хочу сделать данные в виде таблицы.
Моя проблема в том, что одним из столбцов является lo go, который приходит с URL index.php?Action=GetLogo&id=51
. Количество результатов превышает 300. Несмотря на то, что я уже использую нумерацию страниц, рендеринг таблицы идет медленно, особенно столбец logo
. Все данные загружаются, но я вижу, что каждый lo go выводится строка за строкой, давая пользователю медленный опыт.
Есть ли какой-нибудь способ, которым React может подойти для решения этой проблемы? Кто-то, пожалуйста, укажите мне правильное направление, как справиться с этим.
Спасибо всем.
Обновление Кто-то посоветовал мне использовать функцию синхронизации / ожидания для загрузки изображений , Затем я обновляю код. Тем не менее, моя главная проблема по-прежнему со мной: загрузка данных, в частности столбца lo go. Отрисовываются все данные, кроме столбца lo go, тогда каждый lo go начинает отображаться один за другим, выглядя очень медленно. Я думал, что функция async/await
облегчит это.
import React from 'react';
import ReactDOM from 'react-dom';
import FormData from 'form-data';
class FilterableSupplierTable extends React.Component {
constructor(props) {
super(props);
this.state = {
suppliers: []
}
}
componentDidMount() {
let formData = new FormData();
formData.append('AjaxMethodName', 'GetSuppliers');
const options = {
method: 'POST',
headers: {
'Accept': '*/*'
},
body: formData
};
fetch(`?Model=route_to_controller`, options)
.then(response => response.json())
.then(data => {
this.setState({ suppliers: JSON.parse(data.response_data) })
});
}
async getLogos(suppliers) {
return await Promise.all(
suppliers.map(async supplier => {
supplier.new_logo = !!supplier.has_logo ?
<img style={{maxWidth: "100px"}} src={supplier.logo} alt={supplier.supplier_id} /> :
<i className="icon icon-warning no_logo"> No Logo</i>;
return supplier;
});
);
}
render() {
const rows = [];
const suppliers = this.state.suppliers;
this.getLogos(suppliers)
.then(results => {
results.map(supplier => {
rows.push(
<tr>
{/* supplier.logo is index.php?Action=GetLogo&id=51, etc */}
<td><img src={supplier.new_logo} /></td>
<td>{supplier.name}</td>
</tr>
);
});
});
return (
<table>
<thead>
<tr>
<th colSpan="4">Suppliers</th>
</tr>
<tr>
<th>Logo</th>
<th>Name</th>
</tr>
</thead>
<tbody>{rows}</tbody>
</table>
);
}
}
ReactDOM.render(
<FilterableSupplierTable />,
document.getElementById('suppliers_list')
);