BayLang использует концепцию Model Component.
Это современный подход для создания полноценных Frontend приложений.
Model - хранит состояние и бизнес логику приложения
Component - отображает состояние на экране и производит рендер при изменения состояния.
BayLang использует Vue фрэймворк для рендера компонентов.
Существуют два вида компонентов:
Использование модели необходимо, если вы хотите управлять состоянием компонента из другого компонента. Например:
Компонент состоит из 3х секций.
<class name="App.Example">
<style>
.example{
color: pink;
}
</style>
<template>
<div class="example">
Example component<br/>
{{ this.message }}
</div>
</template>
<script>
string message = "";
</script>
</class>В стилях указываются CSS стили оформления компонента.
В шаблонах HTML код компонента
В script - функции для работы с фронтенд компонентом. Обычно там указываются функции, необходимые для рендера.
Если вам нужна бизнес логика, обращения по API, то этоn код стоит разместить в модели.
В компоненте может быть несколько шаблонов. Каждый шаблон должен обладать уникальным именем. По умолчанию имя шаблона render. Шаблон можно вызвать из другого шаблона.
Пример:
<class name="App.Example">
<template name="renderItem" args="Map item">
<div class="item">
{{ item }}
</div>
</template>
<template>
<div class="items">
%for (int i=0; i<this.items.count(); i++)
{
%render this.renderItem(this.items.get(i));
}
</div>
</template>
<script>
Map items = [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5",
];
</script>
</class>Виды переменых в шаблоне:
Пример:
<script>
/* Обычная переменная */
string message = "Hello world!";
/* Props */
props string name = "";
/* Имя пользователя */
computed string user_name()
{
return this.name;
}
</script>Пример нажатия на кпопку
<class name="App.Example">
<template>
<div class="example">
<div class="message">Hello, {{ this.message }}!</div>
<button @event:click="this.onClick()">
Click
</button>
</div>
</template>
<script>
string message = "User";
void onClick()
{
this.message ~= "!";
}
</script>
</class><class name="App.Example">
<use name="Runtime.Widget.Button" component="true" />
<template>
<div class="example">
<Button>Click</Button>
</div>
</template>
</class>Чтобы передать из одного компонента в другой шаблоны, нужно использовать слоты
<class name="App.Box">
<template>
<div class="box">
<div class="box_header">
%render this.renderSlot("title");
</div>
<div class="box_content">
%render this.renderSlot("content");
</div>
</div>
</template>
</class>Вызов компонента:
<class name="App.Example">
<use name="App.Box" component="true" />
<template>
<Box>
<slot name="title">
Title
</slot>
<slot name="content">
<p>Content</p>
</slot>
</Box>
</template>
</class>