Директива v-scope определяет реактивный контекст
компонента и связывает состояние с разметкой. Такой контекст позволяет
Petite-Vue обновлять DOM при изменении данных без необходимости писать
дополнительный код управления жизненным циклом.
v-scope используется как атрибут HTML-элемента. Внутри
передается объект, определяющий реактивные свойства, методы и
вычисления. Значение передается в виде JavaScript-выражения.
<div v-scope="{ count: 0 }">
{{ count }}
</div>
Любое изменение count автоматически отражается в DOM.
Petite-Vue применяет минимальный механизм реактивности, что делает
синтаксис лаконичным и предсказуемым.
Объект, переданный в v-scope, может содержать методы.
Методы вызываются непосредственно из шаблона. Petite-Vue не требует
декларации специальных полей или ключевых слов.
<div v-scope="{
count: 0,
inc() { this.count++ }
}">
<button @click="inc">+</button>
{{ count }}
</div>
this в методах всегда указывает на реактивный объект.
Это облегчает перенос логики в шаблон и поддерживает единый стиль.
Вместо явных вычисляемых свойств допускается использование методов или выражений в шаблоне. Petite-Vue не реализует отдельную систему computed-полей, что упрощает модель и снижает порог входа.
<div v-scope="{
a: 2,
b: 3,
sum() { return this.a + this.b }
}">
{{ sum() }}
</div>
Значение пересчитывается при каждом обновлении DOM.
v-scope может ссылаться на функцию, возвращающую объект.
Такой прием используется, когда требуется выполнение логики при создании
компонента.
<div v-scope="() => ({
items: ['A', 'B'],
add(x) { this.items.push(x) }
})">
<button @click="add('C')">Добавить</button>
{{ items }}
</div>
Функция вызывается единожды, результат становится реактивным.
v-scopeКомпоненты на основе v-scope могут быть вложенными.
Внутренний контекст не перекрывает внешний полностью, а дополняет его
через цепочку доступа.
<div v-scope="{ a: 1 }">
<span>{{ a }}</span>
<div v-scope="{ b: 2 }">
{{ a + b }}
</div>
</div>
Контекст разрешается от внутреннего к внешнему, если свойство не найдено в текущем объекте.
v-scope допускает передачу ссылки на заранее объявленный
объект или модуль. Такой подход используется в более крупных
приложениях.
<script>
const model = {
value: 10,
double() { return this.value * 2 }
}
</script>
<div v-scope="model">
{{ double() }}
</div>
В этом случае объект становится реактивным целиком, без дополнительного кода обертки.
Значение v-scope может включать любые корректные
выражения JavaScript, включая операторы, вызовы функций или
импортированные сущности. Petite-Vue не вводит отдельной DSL, что
сохраняет естественный вид кода.
v-scope активируется только при монтировании Petite-Vue.
Компонент не содержит сложного жизненного цикла и не создает лишних
вычислений. Обновления происходят только при изменении реактивных
свойств.
Вместе с v-scope обычно применяется директива
@event. Реактивный объект обрабатывает события напрямую,
что позволяет сосредоточиться на логике.
<div v-scope="{
toggle: false,
flip() { this.toggle = !this.toggle }
}">
<button @click="flip">Switch</button>
{{ toggle ? 'ON' : 'OFF' }}
</div>
При вложенном v-scope обмен осуществляется через поиски
по цепочке контекстов. Для более сложных случаев используется внешнее
хранилище (например, собственный объект или подписки). Petite-Vue не
навязывает архитектуру и не предоставляет встроенный глобальный
стор.
v-effectv-effect выполняется при изменении зависимостей и
работает поверх v-scope. Директива фиксирует реактивные
зависимости в момент выполнения эффекта.
<div v-scope="{ x: 1 }">
<span v-effect="console.log(x)"></span>
</div>
Каждое обновление x вызывает повторный вывод. Такой
подход обеспечивает гибкость без внедрения специального API.
Основной способ переиспользования в Petite-Vue связан с
функциями-фабриками и передачей объектов в v-scope. Это
формирует легковесную модель компонентов, не требующую декларации
классов или предварительной компиляции.
v-scope корректно взаимодействует с v-for.
Каждый элемент списка получает свой собственный реактивный контекст.
<ul v-scope="{ items: [1,2,3] }">
<li v-for="n in items" v-scope="{ n }">
{{ n }}
</li>
</ul>
Объекты внутри цикла могут расширяться методами и состоянием без влияния на родительский контекст.
v-scope представляет собой центральный механизм
реактивного связывания. Petite-Vue намеренно избегает сложной
терминологии, пропов и строгой типизации контекста. Это позволяет
использовать библиотеку в качестве дополнения к существующей разметке,
без пересмотра архитектуры проекта.