Я начинаю играть с vuejs (2.0). Я построил простую страницу с одним компонентом. На странице есть один экземпляр Vue с данными. На этой странице я зарегистрировался и добавил компонент в HTML. Компонент имеет один input[type=text]
. Я хочу, чтобы это значение отражалось на родителе (основной экземпляр Vue).
Как правильно обновить родительские данные компонента? Передача привязанного реквизита от родителя не годится и выдает некоторые предупреждения на консоль. У них есть что-то в их документе, но это не работает.
javascript
vue.js
vue-component
Гал Зив
источник
источник
Ответы:
Двусторонняя привязка в Vue 2.0 устарела в пользу использования более управляемой событиями архитектуры. В общем, ребенок не должен мутировать свои реквизиты. Скорее это должно
$emit
события и позволить родителю реагировать на эти события.В вашем конкретном случае вы можете использовать пользовательский компонент с
v-model
. Это специальный синтаксис, который допускает нечто близкое к двустороннему связыванию, но на самом деле это сокращение для управляемой событиями архитектуры, описанной выше. Вы можете прочитать об этом здесь -> https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events .Вот простой пример:
Документы утверждают, что
эквивалентно
Вот почему опору для ребенка нужно назвать по значению, и почему ребенок должен $ эмитировать событие с именем
input
.источник
undefined
до первого изменения. Смотрите эту скрипку, где я закомментировалprops: ['value']
. Обратите внимание на начальное значениеundefined
вместоhello
: jsfiddle.net/asemahle/8Lrkfxj6 . После первого изменения Vue динамически добавляет значение prop к компоненту, чтобы оно работало.Из документации :
Как передать реквизит
Ниже приведен код для передачи реквизитов дочернему элементу:
Как создать событие
HTML:
JS:
источник
В дочернем компоненте:
В родительском компоненте:
источник
Дочерний компонент
Используйте
this.$emit('event_name')
для отправки события в родительский компонент.Родительский компонент
Для того чтобы прослушать это событие в родительском компоненте, мы делаем
v-on:event_name
и метод (ex. handleChange
), который мы хотим выполнить для этого события, происходитГотово :)
источник
Я согласен с ответами о событиях и v-model для вышеупомянутых. Однако я подумал, что опубликую то, что я нашел, о компонентах с несколькими элементами формы, которые хотят отправить обратно своим родителям, так как эта статья кажется одной из первых статей, возвращаемых Google.
Я знаю, что в вопросе указывается один вход, но это кажется самым близким совпадением и может сэкономить людям некоторое время с подобными компонентами vue. Кроме того, никто не упомянул
.sync
модификатор.Насколько я знаю,
v-model
решение подходит только для одного ввода, возвращающего их родителю. Я потратил немного времени на его поиск, но документация Vue (2.3.0) действительно показывает, как синхронизировать несколько реквизитов, отправляемых в компонент, к родителю (конечно, через emit).Это соответственно называется
.sync
модификатором.Вот что говорится в документации :
Вы также можете синхронизировать несколько одновременно, посылая через объект. Проверьте документацию здесь
источник
Более простой способ использования
this.$emit
Father.vue
Child.vue
Мой полный пример: https://codesandbox.io/s/update-parent-property-ufj4b
источник
Также возможно передавать реквизиты как объект или массив. В этом случае данные будут двусторонне связаны:
(Это отмечено в конце темы: https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow )
источник
Правильный путь -
$emit()
это событие в дочернем компоненте, которое слушает основной экземпляр Vue .источник
1) Дочерний Compnent: вы можете использовать как это в дочернем компоненте, напишите так: this.formValue для отправки некоторых данных в родительский компонент
2) Parrent Compnenet: и в теге parrent-компонента получают переменную send, например, вот так: и это код для получения данных дочернего компонента в теге родительского компонента.
источник
Другой способ - передать ссылку вашего установщика от родителя в качестве реквизита на дочерний компонент, аналогично тому, как они это делают в React. Скажем, у вас есть метод
updateValue
на родителе для обновления значения, можно создать экземпляр компонента ребенка следующим образом:<child :updateValue="updateValue"></child>
. Тогда на ребенке вы будете иметь соответствующую опору:props: {updateValue: Function}
и в шаблоне вызова метода при изменении входного:<input @input="updateValue($event.target.value)">
.источник
Я не знаю почему, но я только что успешно обновил родительские данные, используя данные в качестве объекта,
:set
иcomputed
Parent.vue
Child.vue
источник
его пример расскажет вам, как передать входное значение родителю при нажатии кнопки «Отправить».
Сначала определите eventBus как новое Vue.
источник
Я думаю, что это добьется цели:
@change="$emit(variable)"
источник