Компоненты могут содержать некоторые данные или состояние в виде параметра data - в принципе как и объекты приложения Vue. Например:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue 3</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <counter></counter> </div> <script src="https://unpkg.com/vue"></script> <script> const app = Vue.createApp({}); app.component('counter', { data(){ return { header: 'Counter Program' } }, template:'<div><h2>{{header}}</h2></div>' }); app.mount('#app'); </script> </body> </html>
Подобным образом можно определять данные в локально регистрируемых компонентах:
<div id="app"> <counter></counter> </div> <script src="https://unpkg.com/vue"></script> <script> const comp = { template:'<div><h2>{{header}}</h2></div>', data(){ return { header: 'Counter Program' } } }; const app = Vue.createApp({ components:{ 'counter':comp }}); app.mount('#app'); </script>
Может возникнуть вопрос, а что если и объект приложения, и компонент этого приложения одновременно определяют свойство с одинаковым называнием. В этом случае компонент будет использовать свое собственное свойство. Например:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue 3</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <h2>{{ header }}</h2> <counter></counter> </div> <script src="https://unpkg.com/vue"></script> <script> const comp = { template:'<div><h3>{{header}}</h3></div>', data(){ return { header: 'Component Header' } } }; const app = Vue.createApp({ data(){ return { header: 'App Header' } }, components:{ 'counter':comp }}); app.mount('#app'); </script> </body> </html>
Кроме состояния компоненты могут определять поведение в виде методов, которые определяются через параметр methods, как и в объектах Vue:
<!DOCTYPE html> <html> <head> <title>Компоненты Vue 3</title> <meta charset="utf-8" /> </head> <body> <div id="app"> <counter></counter> </div> <script src="https://unpkg.com/vue"></script> <script> const app = Vue.createApp({}); app.component('counter', { data(){ return { header: 'Counter Program', count:0 } }, template:`<div><h2>{{header}}</h2> <button v-on:click="increase">+</button> <span>{{count}}</span> </div>`, methods:{ increase:function(){ this.count++; } } }); app.mount('#app'); </script> </body> </html>
В данном случае по нажатию на кнопку вызывается метод increase, который увеличивает значение свойства count.