Inferno, как высокопроизводительный JavaScript-фреймворк для
построения интерфейсов, не включает собственный встроенный механизм для
работы с HTTP-запросами. Взаимодействие с REST API осуществляется через
стандартные браузерные средства, такие как fetch, или
сторонние библиотеки типа Axios. Основная задача — интеграция
асинхронных данных с компонентами Inferno так, чтобы обновление
интерфейса происходило эффективно и без лишних перерисовок.
Метод fetch предоставляет современный интерфейс для
выполнения HTTP-запросов и работы с промисами:
import { Component } from 'inferno';
class UserList extends Component {
constructor(props) {
super(props);
this.state = { users: [], loading: true };
}
componentDidMount() {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(data => this.setState({ users: data, loading: false }))
.catch(error => console.error(error));
}
render() {
const { users, loading } = this.state;
if (loading) return <div>Загрузка...</div>;
return (
<ul>
{users.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}
}
Ключевые моменты:
componentDidMount для выполнения запросов
после монтирования компонента.this.setState, что
инициирует реактивный рендеринг.Axios предоставляет более мощный и удобный интерфейс, включая автоматическое преобразование JSON и поддержку таймаутов:
import { Component } from 'inferno';
import axios from 'axios';
class PostList extends Component {
constructor(props) {
super(props);
this.state = { posts: [], loading: true };
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => this.setState({ posts: response.data, loading: false }))
.catch(error => console.error(error));
}
render() {
const { posts, loading } = this.state;
if (loading) return <div>Загрузка...</div>;
return (
<div>
{posts.map(post => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.body}</p>
</div>
))}
</div>
);
}
}
Преимущества Axios:
async/await.Использование async/await делает код более читаемым и
структурированным:
class CommentList extends Component {
constructor(props) {
super(props);
this.state = { comments: [], loading: true };
}
async componentDidMount() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/comments');
const data = await response.json();
this.setState({ comments: data, loading: false });
} catch (error) {
console.error(error);
}
}
render() {
const { comments, loading } = this.state;
if (loading) return <div>Загрузка комментариев...</div>;
return (
<ul>
{comments.map(comment => <li key={comment.id}>{comment.body}</li>)}
</ul>
);
}
}
Особенности:
async/await позволяет писать асинхронный код в
синхронном стиле.В функциональных компонентах, использующих useState и
useEffect через библиотеку inferno-hooks,
работа с HTTP запросами также возможна:
import { useState, useEffect } from 'inferno-hooks';
function AlbumList() {
const [albums, setAlbums] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function fetchAlbums() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/albums');
const data = await response.json();
setAlbums(data);
setLoading(false);
} catch (error) {
console.error(error);
}
}
fetchAlbums();
}, []);
if (loading) return <div>Загрузка альбомов...</div>;
return (
<ul>
{albums.map(album => <li key={album.id}>{album.title}</li>)}
</ul>
);
}
Преимущества подхода с хуками:
Отправка данных на сервер также возможна через fetch или
Axios:
async function createPost(post) {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(post)
});
const data = await response.json();
console.log('Создан пост:', data);
} catch (error) {
console.error('Ошибка при создании поста:', error);
}
}
Важные моменты:
POST и правильных заголовков.JSON.stringify.При работе с REST API важно минимизировать количество запросов и перерисовок. Используются техники:
Inferno.memo для
предотвращения ненужного рендера.fetch и Axios зависит от сложности проекта
и потребности в дополнительных функциях (таймауты, интерсепторы).async/await улучшает читаемость
асинхронного кода.Работа с HTTP клиентами и REST API в Inferno строится на классическом подходе JavaScript, при этом фреймворк обеспечивает эффективный рендеринг и реактивное обновление интерфейса при изменении данных.