Vue.js 3.0 Tutorial
Vue.js 3.0 Component Advanced
Vue.js 3.0 Transitions & Animations
Vue.js 3.0 Reusable & Combinable
Vue.js 3.0 Advanced
Vue.js 3.0 Tools
Vue.js 3.0 Scale
Vue.js 3.0 Accessibility
Vue.js 3.0 Migrating from Vue2
Vue.js 3.0 Contribute Documentation
Vue.js 3.0 API References
Vue.js 3.0 Style Guide
In Vue 3.0, the way to define component's data properties and methods has been slightly changed if you're using the Composition API, compared to the traditional Options API that was commonly used in Vue 2. However, both ways are still valid in Vue 3. Let's look at examples for both.
1. Options API (Vue 2 Style)
This is the traditional way of handling data properties and methods in Vue, and it still works in Vue 3.
Here's a simple Vue component:
<template> <div> <p>{{ message }}</p> <button @click="reverseMessage">Reverse Message</button> </div> </template> <script> export default { data() { return { message: 'Hello Vue!' }; }, methods: { reverseMessage() { this.message = this.message.split('').reverse().join(''); } } } </script>
In the above code:
data
function returns an object that contains all the data properties for the component. These properties are reactive, meaning that Vue will automatically update the DOM when these properties change.methods
object contains all the methods for the component. These can be called from within the component (for example, as a result of a user action).2. Composition API (Vue 3 Style)
In Vue 3, the Composition API was introduced, which provides a more flexible way to compose component logic.
Here's how you could rewrite the previous component using the Composition API:
<template> <div> <p>{{ message }}</p> <button @click="reverseMessage">Reverse Message</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const message = ref('Hello Vue!'); function reverseMessage() { message.value = message.value.split('').reverse().join(''); } return { message, reverseMessage, }; } } </script>
In the above code:
setup
function is a new component option provided by the Composition API. It serves as the entry point for using the Composition API inside components.data
function, we define a ref
for each piece of reactive data.methods
object, we just define them as regular JavaScript functions inside setup
.The setup
function should return an object that exposes the properties and methods you want to use in your template. In this case, we're exposing the message
ref and the reverseMessage
function.
Whether to use the Options API or the Composition API is a matter of personal preference, the size and complexity of your project, and your team's familiarity with Vue. Both are powerful and flexible ways to build components in Vue 3.
Vue 3.0 Reactive Data in Components:
<!-- ReactiveDataComponent.vue --> <template> <div> <p>{{ message }}</p> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const message = ref('Hello, Reactive Data!'); return { message, }; }, }; </script>
Vue 3.0 Methods in Components:
<!-- MethodsComponent.vue --> <template> <div> <button @click="sayHello">Say Hello</button> </div> </template> <script> export default { methods: { sayHello() { alert('Hello, Methods!'); }, }, }; </script>
Vue 3.0 Data Binding Examples:
<!-- DataBindingExamples.vue --> <template> <div> <p>{{ message }}</p> <input v-model="inputValue" /> <p>Input Value: {{ inputValue }}</p> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const message = ref('Data Binding Examples'); const inputValue = ref(''); return { message, inputValue, }; }, }; </script>
Vue 3.0 Data Property Reactivity:
<!-- DataReactivity.vue --> <template> <div> <p>{{ message }}</p> <button @click="updateMessage">Update Message</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const message = ref('Reactivity Example'); function updateMessage() { message.value = 'Updated Message!'; } return { message, updateMessage, }; }, }; </script>
Vue 3.0 Methods vs Computed Properties:
<!-- MethodsVsComputed.vue --> <template> <div> <p>{{ getComputedMessage }}</p> <button @click="updateMessage">Update Message</button> </div> </template> <script> import { ref, computed } from 'vue'; export default { setup() { const message = ref('Methods vs Computed'); const getComputedMessage = computed(() => { return `Computed: ${message.value}`; }); function updateMessage() { message.value = 'Updated Message!'; } return { getComputedMessage, updateMessage, }; }, }; </script>
Vue 3.0 Accessing Data in Templates:
<!-- AccessDataInTemplate.vue --> <template> <div> <p>{{ message }}</p> <button @click="updateMessage">Update Message</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const message = ref('Accessing Data in Templates'); function updateMessage() { message.value = 'Updated Message!'; } return { message, updateMessage, }; }, }; </script>
Vue 3.0 Lifecycle Hooks and Data:
<!-- LifecycleHooksData.vue --> <template> <div> <p>{{ message }}</p> </div> </template> <script> import { ref, onMounted } from 'vue'; export default { setup() { const message = ref('Lifecycle Hooks and Data'); onMounted(() => { console.log('Component mounted'); }); return { message, }; }, }; </script>