В предыдущем посте мы говорили о взаимодействии родительских и дочерних компонентов. Этот пост будет посвящен взаимодействию одноуровневых компонентов.
Итак, как мы можем добиться этого в 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.