Я работаю над новым проектом с vue и vue-apollo.
У меня есть один компонент с именем пользователя (UserShow.vue):
<template>
<div v-if="!this.$apollo.queries.user.loading">
Your name is: {{user.firstname}}
</div>
</template>
<script>
import gql from "graphql-tag";
export default {
apollo: {
user: {
query: gql`{
user (id: 1) {
id
firstname
}
}`
}
}
}
</script>
и один компонент для редактирования (UserEdit.vue):
<template>
<div v-if="!this.$apollo.queries.user.loading">
Edit your name: <input v-model="user.firstname" />
</div>
</template>
<script>
import gql from "graphql-tag";
export default {
apollo: {
user: {
query: gql`{
user (id: 1) {
id
firstname
}
}`
}
}
}
</script>
Обакомпоненты показаны на той же странице, абсолютно без мутаций.только эти два простых компонента. Вот и все
Как только я изменю имя в поле ввода, имя пользователя обновляется в представлении.
Мне странно, и мне это не нравится.
Apollo выполняет запрос и заполняет свойство vue data()
каждого компонента.Но почему данные каким-то образом передаются?data
в компоненте vue должен быть закрытым для этого компонента, если я не передаю его субкомпоненту (как с v-моделью в поле ввода).
Если я загляну в свой Apollo DevКонсоль в кеш я не вижу изменения в имени.Так как же это работает?
Если я не хочу такого поведения, у меня есть только одна странная опция:
Я могу добавить еще один атрибут в запрос следующим образом:
<template>
<div v-if="!this.$apollo.queries.user.loading">
Edit your name:
<input v-model="user.firstname" />
</div>
</template>
<script>
import userQuery from "./user";
import gql from "graphql-tag";
export default {
apollo: {
user: {
query: gql`{
user (id: 1) {
id
firstname
age // added to create a different query
}
}`
}
}
}
</script>
Добавление «возраста» к запросу меняет поведение.Это даже незнакомец!Как я могу написать надежные компоненты с таким поведением?Или я пропустил какую-то важную концепцию?
Исходный код можно найти здесь: https://github.com/kicktipp/hello-apollo
Ошибка или функция?