В предыдущем посте мы говорили о взаимодействии родительских и дочерних компонентов. Этот пост будет посвящен взаимодействию одноуровневых компонентов.
Итак, как мы можем добиться этого в vuejs? Простой. Каждый экземпляр vue может прослушивать события и может генерировать события. Мы рассмотрим простую реализацию использования этого в проекте.

Мы будем использовать два компонента, первый и второй (скрытый). Два компонента являются входными данными, которые представляют собой два шага. Первый шаг принимает пользовательский ввод, когда пользователь оставляет ввод, второй компонент уведомляется, и поэтому появляется второй шаг/ввод, и пользователь может продолжить.

Получить полный код можно на github:



Начальный код для html содержит два наших компонента, а именно один и два.

<!DOCTYPE html>
<html>
<head>
        <title>Component communication</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.27/css/uikit.min.css" />
    </head>
<body>
<div id="root" class="uk-section">
     <div class="uk-container">
         <one></one>
         <two></two>
     </div>
</div>
<script src="https://unpkg.com/vue"></script>
<script src="app.js"></script>
</body>
</html>

Стартовый код для app.js:

Vue.component('one', {
template: `
    <div>
        <p>Step 1: Enter a pin number: <input v-model="pin"> </p>
    </div>
    `,
data () {
        return {
            pin: ""
        }
    },
methods: {
}
})
Vue.component('two', {
template: `
        <div v-if="showMessage">
            <p>Step 2: Enter your username:  <input> </p>
        </div>
    `,
data () {
        return {
            showMessage: false
        }
    },
mounted () {
    },
methods: {
    }
})
new Vue ({
el: '#root',
})

Способ добиться этого — создать пустой экземпляр Vue, который мы будем использовать для глобального запуска и прослушивания событий в любом месте, где это необходимо.

 const event = new Vue(); //add this to top of our js file

Это сделает доступными для нас два метода:

event.$emit('event-name')
event.$on('event-name')

Примечание. Чтобы это работало правильно, мы должны убедиться, что это событие доступно глобально. Как вы это сделаете, будет зависеть от структуры вашего приложения. В приложениях на основе модулей вы экспортируете этот экземпляр экземпляра vue, который мы используем в качестве события, из определенного файла, а затем импортируете его туда, где это необходимо. По мере роста сложности вашего приложения вы можете использовать для этого Vuex.

Продолжите наш проект, обновите шаблон компонента 1 до этого:

<div>
    <p>Step 1: Enter a pin number: <input v-model="pin" @blur="goToStepTwo"> </p>
</div>

и это метод для этого:

methods: {
    goToStepTwo () {
        event.$emit('step-two');
    }
}

Таким образом, после того, как пользователь вводит и оставляет ввод, вызывается метод goToStepTwo, который запускает событие под названием «шаг-два».

Чтобы появился второй вход, второй компонент должен прослушивать событие «шаг-два». Как? Обновите второй метод компонента следующим образом:

mounted () {
   event.$on('step-two', () => this.alertMessageReceived())
},

При монтировании второго компонента он должен прослушивать событие, называемое step-two. Как только это событие будет получено, второй компонент вызовет метод alertMessageReceived, чтобы отобразить входные данные для второго шага.

methods: {
    alertMessageReceived () {
        this.showMessage = true
    }
}

Сделанный! Мы добились взаимодействия между компонентами в vuejs.