Функции обратного вызова представляют еще один способ взаимодействия между родительским и дочерним компонентами: родительские компоненты могут определять функции, а вызываются они в дочерних компонентах.
Например, определим следующую веб-страницу:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue.js</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <h2>Список пользователей</h2> <userform :addfn="add"></userform> <div> <useritem v-for="(user, index) in users" :user="user" :key="index" :index="index" :removefn="remove"> </useritem> </div> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> Vue.component('userform', { props: ["addfn"], data: function () { return { user: {name:'', age:18} } }, template: `<div> <input type="text" v-model="user.name" /> <input type="number" v-model="user.age" /> <button v-on:click="addfn({name:user.name, age: user.age})">Add</button> </div>` }); Vue.component('useritem', { props: ["user", "index", "removefn"], template: `<div> <p>Name: {{user.name}} <br> Age: {{user.age}}</p> <button v-on:click="removefn(index)">Delete</button> </div>` }); new Vue({ el: "#app", data: { users:[ {name: 'Tom', age: 23}, {name: 'Bob', age: 26}, {name: 'Alice', age: 28} ] }, methods:{ remove: function(index){ this.users.splice(index, 1); }, add: function(user){ this.users.push(user); } } }); </script> </body> </html>
Объект Vue выводит на страницу массив элементов и определяет два метода для управления элементами: add (для добавления) и remove (для удаления).
Для добавления нового элемента определен компонент userform, который представляет форму с полями ввода. В этот компонент передается метод add в виде функции addfn:
<userform :addfn="add"></userform>
Причем функция addfn определена в компоненте userform через props:
Vue.component('userform', { props: ["addfn"],
При нажатии на кнопку эта функция будет вызываться, и ей будут передаваться введенные данные. Что фактически приведет к вызову метода add в родительском объекте Vue.
Аналогичная ситуация с компонентом useritem, который получает метод remove в виде функции removefn, которая также определяется через props. При нажатии на кнопку удаления вызывается функция removefn, ей передается индекс удаляемого элемента, и фактически будет идти вызов метода remove из объекта Vue.
Таким образом, в самих дочерних компонентах никаких действий по управлению массивом и объектами и по генерации событий не определено. Дочерние компоненты просто вызывают те методы, которые определены в родительском объекте.