Riot.js предоставляет встроенные возможности для выполнения
асинхронных HTTP-запросов, что позволяет легко интегрировать серверные
данные в компоненты без необходимости подключения сторонних библиотек.
Основой работы с AJAX является объект fetch, который
используется внутри методов компонента для получения или отправки
данных.
В Riot.js AJAX-запросы обычно выполняются в жизненном цикле
компонента, особенно в методах onMounted или
onBeforeUpdate, чтобы данные подгружались в момент
отображения компонента или перед его обновлением.
import { component, mount } from 'riot';
component('user-list', {
state: {
users: []
},
onMounted() {
fetch('/api/users')
.then(response => response.json())
.then(data => this.update({ users: data }))
.catch(error => console.error('Ошибка загрузки данных:', error));
},
template: `
<ul>
<li each={user in users}>{user.name}</li>
</ul>
`
});
mount('user-list');
Ключевой момент — использование метода update для
реактивного обновления состояния компонента после получения данных. Это
позволяет автоматически перерисовывать шаблон без дополнительного
вмешательства.
Riot.js поддерживает выполнение POST-запросов для отправки данных на
сервер. Для этого используется объект fetch с указанием
метода и заголовков:
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Иван', age: 30 })
})
.then(response => response.json())
.then(data => console.log('Ответ сервера:', data))
.catch(error => console.error('Ошибка при отправке данных:', error));
При работе с формами обычно применяются методы компонента,
связывающие отправку данных с событиями submit:
submitForm(e) {
e.preventDefault();
fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(this.state.formData)
})
.then(response => response.json())
.then(data => this.update({ users: [...this.state.users, data] }))
.catch(error => console.error(error));
}
Состояние формы (formData) может обновляться через
привязку oninput к полям ввода, что делает работу с AJAX
полностью реактивной.
Для упрощения чтения кода можно использовать синтаксис
async/await, который полностью совместим с Riot.js.
Асинхронные методы компонента позволяют обрабатывать данные
последовательно и удобно:
async loadUsers() {
try {
const response = await fetch('/api/users');
const data = await response.json();
this.update({ users: data });
} catch (error) {
console.error('Ошибка загрузки:', error);
}
}
onMounted() {
this.loadUsers();
}
Такой подход улучшает читаемость и управление потоками данных, особенно при сложных сценариях с несколькими последовательными запросами.
Riot.js позволяет комбинировать AJAX с внутренними событиями компонента. Например, можно создать кнопку для обновления списка пользователей:
updateUsers() {
this.loadUsers();
}
template: `
<button oncl ick={updateUsers}>Обновить список</button>
<ul>
<li each={user in users}>{user.name}</li>
</ul>
`
Комбинация реактивного состояния и методов с AJAX обеспечивает полностью интерактивные интерфейсы без сторонних фреймворков.
Для улучшения пользовательского опыта рекомендуется хранить состояние загрузки и ошибки:
state: {
users: [],
loading: false,
error: null
},
async loadUsers() {
this.update({ loading: true, error: null });
try {
const response = await fetch('/api/users');
const data = await response.json();
this.update({ users: data });
} catch (error) {
this.update({ error: 'Не удалось загрузить данные' });
} finally {
this.update({ loading: false });
}
}
template: `
<div if={loading}>Загрузка...</div>
<div if={error}>{error}</div>
<ul if={!loading && !error}>
<li each={user in users}>{user.name}</li>
</ul>
`
Использование реактивных состояний loading и
error делает интерфейс интерактивным и информативным, что
особенно важно при работе с сетевыми запросами.
Riot.js позволяет легко интегрировать параметры запроса при работе с AJAX. Например, фильтрация данных на сервере:
async searchUsers(query) {
try {
const response = await fetch(`/api/users?search=${encodeURIComponent(query)}`);
const data = await response.json();
this.update({ users: data });
} catch (error) {
console.error(error);
}
}
Подобный подход позволяет создавать динамические интерфейсы с интерактивным поиском и фильтрацией данных без перегрузки страницы.
Эффективный Riot.js-компонент для работы с серверными данными включает следующие элементы:
update для
реактивного перерисовывания.Такой подход обеспечивает полное использование встроенных возможностей Riot.js для работы с AJAX и создание масштабируемых, интерактивных приложений.