Есть несколько способов сделать это, и некоторые из них упоминаются в других ответах:
(в произвольном порядке, подробнее читайте в разделах ниже)
- Используйте глобальную шину событий
- Используйте свойства для компонентов
- Используйте атрибут v-модели
- Используйте модификатор синхронизации
- Используйте Vuex.
Что касается двусторонней привязки, имейте в виду, что она может вызвать цепочку мутаций, которые трудно поддерживать, цитируется из документации:
К сожалению, истинное двустороннее связывание может создать проблемы с обслуживанием, поскольку дочерние компоненты могут изменять родительский элемент, при этом источник этой мутации не является очевидным как для родительского, так и для дочернего компонентов.
Вот некоторые подробности доступных методов:
1.) Используйте глобальную шину событий
Я бы настоятельно не рекомендовал использовать этот подход для любого вида общего взаимодействия между компонентами, как это обсуждалось во многих местах, например в здесь
2.) Используйте опоры для компонентов
Реквизиты просты в использовании и являются идеальным способом решения наиболее распространенных проблем.
Благодаря как Vue наблюдает за изменениями: все свойства должны быть доступны для объекта, иначе они не будут реагировать. Если какие-либо свойства добавляются после того, как Vue завершил работу над ними, 'set' должен будет использоваться.
//Normal usage
Vue.set(aVariable, 'aNewProp', 42);
//This is how to use it in Nuxt
this.$set(this.historyEntry, 'date', new Date());
Объект будет реактивным как для компонента, так и для родителя:
Если вы передадите объект / массив в качестве опоры, это будет двусторонняя синхронизация автоматически - измените данные в дочернем элементе, они будут изменены в родительском.
Если вы передаете простые значения (строки, числа) через реквизиты, вы должны явно использовать . модификатор синхронизации
Как указано в -> https://stackoverflow.com/a/35723888/1087372
3.) Используйте атрибут v-model
Атрибут v-model - это синтаксический сахар, который обеспечивает простую двустороннюю привязку между родительским и дочерним объектами. Он делает то же самое, что и модификатор синхронизации, только он использует определенную опору и определенное событие для привязки.
Этот:
<input v-model="searchText">
то же самое, что и это:
<input
v-bind:value="searchText"
v-on:input="searchText = $event.target.value"
>
Где свойство должно быть значением, а событие должно быть входом
4.) Используйте модификатор синхронизации.
Модификатор sync также является синтаксическим сахаром и делает то же самое, что и v-model, только имена свойств и событий устанавливаются тем, что используется.
В родительском его можно использовать следующим образом:
<text-document v-bind:title.sync="doc.title"></text-document>
От дочернего элемента может быть отправлено событие, чтобы уведомить родительский элемент о любых изменениях:
this.$emit('update:title', newTitle)
5.) Используйте Vuex
Vuex - это хранилище данных, доступное из каждого компонента. На изменения можно подписаться.
Используя хранилище Vuex, легче увидеть поток мутаций данных, и они явно определены. Используя инструменты разработчика vue, можно легко отлаживать и откатывать сделанные изменения.
Этот подход требует немного большего количества шаблонов, но, если он используется на протяжении всего проекта, он становится гораздо более понятным способом определения того, как и откуда вносятся изменения.
См. руководство по началу работы
person
SanBen
schedule
30.04.2020
.sync
, который имеет удален из vue. Но, конечно же, есть много других существующих вопросов, на которые провайдер отвечает в этой ситуации. - person PatrickSteele   schedule 29.01.2018