Кнопка-счётчик
До сих пор данные не менялись, пока работало приложение. Но в приложениях они меняются постоянно: покупатель добавляет в заказ эспрессо, и число на странице растёт. Вот кнопка, которая это делает:
<script setup>
import { ref } from "vue";
const espressos = ref(0);
function addEspresso() {
espressos.value++;
}
</script>
<template>
<button @click="addEspresso">Добавить эспрессо</button>
<p>Эспрессо в заказе: {{ espressos }}</p>
</template>Работать это заставляют три новинки:
import { ref } from "vue";берёт из Vue функциюref, чтобы скрипт мог ею пользоваться, так же какmain.jsберётcreateApp.ref(0)создаёт реф — значение, за которым следит Vue; здесь оно начинается с 0. В скрипте значение лежит вespressos.value, поэтому функция увеличиваетespressos.value. В шаблоне пишут просто{{ espressos }}, без.value.@click="addEspresso"запускает функциюaddEspressoпри каждом щелчке по кнопке, как это делалaddEventListener("click", addEspresso)на курсе JavaScript.
Самое важное — то, чего здесь нет: ни одна строка не выводит новое число на страницу. Когда espressos.value меняется, Vue обновляет каждое место в шаблоне, где показан espressos. На курсе JavaScript после каждого изменения вам приходилось самим менять textContent, и об этом легко было забыть.
Зачем нужны ref и .value? С обычной переменной, let espressos = 0;, число тоже менялось бы, но Vue об этом не знал бы, и страница продолжала бы показывать 0. В уроке «Состояние и события» объясняется, как работают рефы, и рассказывается про события гораздо больше. Пока достаточно повторять этот образец.
Задание
- 1
В заказе должна быть и цена. В
<script setup>создайте подespressosвторой реф:const total = ref(0);В конец шаблона добавьте абзац, который его показывает:
<p>Итого: €{{ total }}</p>. Нажмите «Запустить»: страница покажетИтого: €0. - 2
Эспрессо стоит €2, поэтому каждый щелчок должен прибавлять к итогу 2. В
addEspressoдобавьте строкуtotal.value += 2;. Несколько раз нажмите на кнопку: оба числа растут.