Riot.js строится на компонентной архитектуре, где каждый компонент инкапсулирует собственное состояние и разметку. Эффективная организация передачи данных между компонентами позволяет создавать динамичные и масштабируемые приложения.
Наиболее прямой способ передачи данных в Riot — использование
атрибутов компонента при его включении в родительскую
разметку. Атрибуты становятся свойствами компонента и доступны через
объект props.
// Компонент child.riot
<child name={props.name}>
<p>Привет, {props.name}!</p>
</child>
// Родительский компонент parent.riot
<parent>
<child name="Иван"></child>
</parent>
Ключевые моменты:
props.Для передачи данных от дочернего компонента к родительскому
применяются кастомные события. В Riot.js компоненты
могут вызывать события через метод this.trigger:
// child.riot
<child>
<button oncl ick={sendData}>Отправить</button>
<script>
export default {
sendData() {
this.trigger('dataSent', { message: 'Привет из дочернего компонента' });
}
}
</script>
</child>
// parent.riot
<parent>
<child ondataS ent={handleData}></child>
<script>
export default {
handleData(event) {
console.log(event.message);
}
}
</script>
</parent>
Особенности:
Для более сложных приложений с большим числом компонентов удобно использовать общее состояние (store). Riot.js поддерживает реактивные объекты, которые могут быть подписаны несколькими компонентами.
// store.js
import { observable } from 'riot';
export const store = observable({
count: 0,
increment() {
this.count += 1;
this.trigger('update');
}
});
// component.riot
<counter>
<p>Счетчик: {store.count}</p>
<button oncl ick={increment}>+</button>
<script>
import { store } from './store.js';
export default {
onBeforeMount() {
store.on('update', () => this.update());
},
increment() {
store.increment();
}
}
</script>
</counter>
Преимущества:
Riot.js позволяет передавать данные через контекст
компонента, что удобно для deeply nested компонентов. Контекст
создается с помощью объекта opts и передается при вызове
дочернего компонента.
// parent.riot
<parent>
<child {opts}></child>
<script>
export default {
opts: { theme: 'dark', language: 'ru' }
}
</script>
</parent>
В дочернем компоненте доступ к контексту осуществляется через
props:
// child.riot
<p>Тема: {props.theme}, Язык: {props.language}</p>
Особенности:
Riot.js поддерживает реактивные выражения внутри шаблонов. С помощью них можно передавать данные и автоматически обновлять DOM при изменении состояния:
<parent>
<child name={name}></child>
<input onin put={e => this.name = e.target.value} value={name}>
<script>
export default {
name: 'Иван'
}
</script>
</parent>
Ключевые моменты: