Отдельно рассмотрим передачу в компонент через props сложных объектов и массивов.
Например, передадим сложный объект:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue.js</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <input type="text" v-model="user.name" /><br><br> <input type="number" v-model.number="user.age" /><br><br> <userinfo v-bind:user="user"></userinfo> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> Vue.component('userinfo', { props: ["user"], //как альтернатива props: {user: Object} template: `<div> <h2>User</h2> <p>Name: {{user.name}}</p> <p>Age: {{user.age}}</p> </div>` }); new Vue({ el: "#app", data: { user: { name: 'Tom', age: 18 } } }); </script> </body> </html>
Здесь компонент получает данные в целом именно как один объект user. И после этого в шаблоне компонента можно обращаться к свойствам этого объекта через user.name и user.age.
Но если мы не передадим значение для свойства user из props:
<userinfo></userinfo>
То в этом случае свойство user в компоненте будет неопределено, и программа завершит свою работу с ошибкой. В этом случае мы можем предусмотреть значение по умолчанию для этого свойства с помощью параметра default. При этом для сложных объектов, а также для массивов этот параметр должен представлять функцию, которая возращает начальное значение для свойства.
В частности, изменим компонент следующим образом:
Vue.component('userinfo', { props: { user: { type: Object, default: function(){ return { name: 'Bob', age: 22 } } } }, template: `<div> <h2>User</h2> <p>Name: {{user.name}}</p> <p>Age: {{user.age}}</p> </div>` });
Теперь если извне не передается значение для props, программа будет использовать значение по умолчанию.
Рассмотрим передачу массивов:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue.js</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <userslist :users="users"></userslist> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script> Vue.component('userslist', { props: ["users"], template: `<ul> <li v-for="user in users"> <p>Name: {{user.name}}</p> <p>Age: {{user.age}}</p> </li> </ul>` }); new Vue({ el: "#app", data: { users: [{ name: 'Tom', age: 18 },{ name: 'Bob', age: 23 },{ name: 'Alice', age: 21 }] } }); </script> </body> </html>
Здесь извне компоненту передается массив users, состоящий из сложных объектов. В компоненте мы можем с помощью директивы v-for пробежаться по всему массиву и получить отдельные его элементы.
Также можно выполнить более точную настройку свойства users, например, задать для него значение по умолчанию:
Vue.component('userslist', { props: { users:{ type: Array, default: function(){ return [] } } }, template: `<ul> <li v-for="user in users"> <p>Name: {{user.name}}</p> <p>Age: {{user.age}}</p> </li> </ul>` });