Реквизиты не обновляются при изменении ввода в компоненте

У меня есть этот простой компонент, в котором я пытаюсь привязать реквизиты в обе стороны, но он работает только в одну сторону. Когда я меняю текст в своих полях ввода, он показывает «Начальное свойство 1» как значение myprop1, хотя я изменил ввод. Что могло быть не так?

Мой компонент

Vue.component('simple-input', {

    template: `
        <div>
            <input type = "text" :myprop1 = "myprop1" :value = "myprop1" @input = "$emit('input', $event.target.value)">
            <input type = "text" :myprop2 = "myprop2" :value = "myprop2" @input = "$emit('input', $event.target.value)">
        </div>
    `,

    props: ['myprop1', 'myprop2']

});

main.js

new Vue({
    el: '#root',

    data: {
        myprop1: 'Initial property 1',
        myprop2: 'Initial property 2',
    },

    methods: {
        showMe()
        {
            alert('prop1 - ' + this.myprop1);
            alert('prop2 - ' + this.myprop2);

            this.myprop1 = 'new value';
            this.myprop2 = 'new value';
        }
    }
});

HTML

<simple-input :myprop1 = "myprop1" :myprop2 = "myprop2"></simple-input>

<button @click = "showMe">Show me!</button>

потому что я не знаю, как, если у меня есть 2 реквизита - по одному для каждого входа

Liga 08.12.2018 11:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть 2 основные проблемы:

  1. Ваш дочерний компонент генерирует событие input для обоих входов. Вам нужно генерировать разные события, чтобы вы могли различать их в родительском компоненте. Также:

    • :myprop1 = "myprop1" ничего не делает с входным элементом, такого свойства / атрибута myprop1 на входах нет.
    • myprop - ужасное имя, используйте вместо него value.

    Vue.component('simple-input', {
      template: `
        <div>
          <input type = "text" :value = "value1" @input = "$emit('update:value1', $event.target.value)">
          <input type = "text" :value = "value2" @input = "$emit('update:value2', $event.target.value)">
        </div>
      `,
      props: ['value1', 'value2'],
    });
    
  2. В родительском компоненте вам необходимо прослушивать события update:value1 и update:value2, чтобы вы могли получать новые значения от дочернего.

    <simple-input
      :value1 = "value1"
      :value2 = "value2"
      @update:value1 = "value1 = $event"
      @update:value2 = "value2 = $event"
    ></simple-input>
    

    Фактически, поскольку мы использовали соглашение об именах update:prop для события, мы можем использовать модификатор sync, чтобы сделать привязку двусторонней. Так становится просто:

    <simple-input
      :value1.sync = "value1"
      :value2.sync = "value2"
    ></simple-input>
    

Другие вопросы по теме