Code Example 1: Простые значения
❓ Какой инструмент реактивности (ref или reactive) используется здесь для простых значений и почему это правильный выбор?
<template>
<div>
<p>Загрузка: {{ isLoading ? 'Да' : 'Нет' }}</p>
<p>Счётчик: {{ count }}</p>
<p>Сообщение: {{ message }}</p>
</div>
</template>
<script setup>
import { ref } from 'vue'
const isLoading = ref(false)
const count = ref(0)
const message = ref('')
function startLoading() {
isLoading.value = true
}
function increment() {
count.value++
}
</script>
Code Example 2: Данные из API
❓ Почему для данных из API, которые могут быть null, используется ref, а не reactive?
<template>
<div v-if="user">
<h2>{{ user.name }}</h2>
<p>{{ user.email }}</p>
</div>
<p v-else>Загрузка...</p>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const user = ref(null)
onMounted(async () => {
const response = await fetch('/api/user')
user.value = await response.json()
})
</script>
Code Example 3: Форма — reactive vs ref
❓ Сравните два варианта реализации формы. Какие различия в работе с данными и сбросе формы между reactive и ref?
reactive:
<template>
<form @submit.prevent="submitForm">
<input v-model="form.email" type="email" />
<input v-model="form.password" type="password" />
<label>
<input v-model="form.rememberMe" type="checkbox" />
Запомнить меня
</label>
<button type="submit">Войти</button>
</form>
</template>
<script setup>
import { reactive } from 'vue'
const form = reactive({
email: '',
password: '',
rememberMe: false
})
function submitForm() {
console.log(form.email, form.password)
}
function resetForm() {
Object.assign(form, {
email: '',
password: '',
rememberMe: false
})
}
</script>
ref:
<template>
<form @submit.prevent="submitForm">
<input v-model="form.email" type="email" />
<input v-model="form.password" type="password" />
<label>
<input v-model="form.rememberMe" type="checkbox" />
Запомнить меня
</label>
<button type="submit">Войти</button>
</form>
</template>
<script setup>
import { ref } from 'vue'
const form = ref({
email: '',
password: '',
rememberMe: false
})
function submitForm() {
console.log(form.value.email, form.value.password)
}
function resetForm() {
form.value = {
email: '',
password: '',
rememberMe: false
}
}
</script>
Code Example 4: Composable
❓ Почему в composable возвращаются ref-значения? Что произойдёт при деструктуризации, если вернуть reactive?
// composables/useCounter.js
import { ref, computed } from 'vue'
export function useCounter(initial = 0) {
const count = ref(initial)
const doubled = computed(() => count.value * 2)
function increment() {
count.value++
}
function decrement() {
count.value--
}
return {
count,
doubled,
increment,
decrement
}
}
<script setup>
import { useCounter } from '@/composables/useCounter'
const { count, doubled, increment } = useCounter(10)
</script>
Code Example 5: Локальное состояние компонента
❓ Здесь используется reactive для хранения состояния компонента. В чём преимущество такого подхода и какие ограничения у него есть?
<script setup>
import { reactive, computed } from 'vue'
const state = reactive({
users: [],
isLoading: false,
error: null,
currentPage: 1,
searchQuery: ''
})
const filteredUsers = computed(() => {
return state.users.filter(u =>
u.name.includes(state.searchQuery)
)
})
async function fetchUsers() {
state.isLoading = true
state.error = null
try {
const response = await fetch('/api/users')
state.users = await response.json()
} catch (e) {
state.error = e.message
} finally {
state.isLoading = false
}
}
</script>
Code Example 6: Передача в watch — ref vs reactive
❓ Почему для отслеживания свойства reactive-объекта используется геттер-функция, а для ref — передаётся напрямую?
<script setup>
import { ref, reactive, watch } from 'vue'
const countRef = ref(0)
const stateReactive = reactive({ count: 0 })
watch(countRef, (newVal) => {
console.log('ref изменился:', newVal)
})
watch(
() => stateReactive.count,
(newVal) => {
console.log('reactive.count изменился:', newVal)
}
)
</script>
Code Example 7: Шаблонные refs
❓ Почему для шаблонных refs (доступ к DOM-элементам и компонентам) всегда используется ref, а не reactive?
<template>
<input ref="inputRef" />
<ChildComponent ref="childRef" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
const inputRef = ref(null)
const childRef = ref(null)
onMounted(() => {
inputRef.value.focus()
childRef.value.someMethod()
})
</script>