Menus

QuickStart 01 - Quick Start (2021.01.16) - 图1

Create a new vue3 project base on vite

npm init vite-app hello-vue3

Just like npx usage

Different mounting from vue2

In vue2, we init vue instance by using new Vue(...) .

Now you can init like this:

  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. import './index.css'
  4. createApp(App).mount('#app')

Setup Function

In vue2, we have data function, methods option, computed option and watch option etc.

In vue3, we can write our functional logics in our setup function. This feature is one of composition api’s features. I feel it’s very useful because I can reuse functional logics very easily.

Now let’s write a simple demo:

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{author.name}}</p>
  5. <p>author age: {{author.age}}</p>
  6. <br>
  7. <p>author msg: {{msg}}</p>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'SetupFunction',
  13. setup() {
  14. const author = {
  15. name: '冬沐',
  16. age: 23
  17. }
  18. let msg = 'hello, my name is 冬沐.'
  19. return {
  20. author,
  21. msg
  22. }
  23. }
  24. }
  25. </script>
  26. <style>
  27. </style>

Like vue2, our data is rendered in page.

Then let’s try to change our data value:

  1. import { onMounted } from 'vue'
  2. export default {
  3. name: 'SetupFunction',
  4. setup() {
  5. let author = {
  6. name: '冬沐',
  7. age: 23
  8. }
  9. let msg = 'hello, my name is 冬沐.'
  10. let count = 0
  11. onMounted(() => {
  12. setInterval(() => {
  13. count++
  14. author.age++
  15. if (count % 2 === 0) {
  16. author.name = '冬沐'
  17. msg = 'hello, my name is 冬沐.'
  18. } else {
  19. author.name = 'Bill Ann'
  20. msg = 'hello, my english name is Bill Ann.'
  21. }
  22. }, 1000)
  23. })
  24. return {
  25. author,
  26. msg
  27. }
  28. }
  29. }

We’ll find that the view is not rendered. Our data can’t reflect to our view.

Reactive and Ref

We should use reactive or ref api to make our data attributes reactive.

Now let’s try them.

  1. import { onMounted, reactive, ref } from 'vue'
  2. export default {
  3. name: 'SetupFunction',
  4. setup() {
  5. let author = reactive({
  6. name: '冬沐',
  7. age: 23
  8. })
  9. let msg = ref('hello, my name is 冬沐.')
  10. let count = ref(0)
  11. onMounted(() => {
  12. setInterval(() => {
  13. count.value++
  14. author.age++
  15. if (count.value % 2 === 0) {
  16. author.name = '冬沐'
  17. msg.value = 'hello, my name is 冬沐.'
  18. } else {
  19. author.name = 'Bill Ann'
  20. msg.value = 'hello, my english name is Bill Ann.'
  21. }
  22. }, 1000)
  23. })
  24. return {
  25. author,
  26. msg,
  27. }
  28. }
  29. }

First, we get reactive or ref api from vue.

For object, we use reactive api. For basic type, we use ref api. Different from reactive api, we should operate [attr name].value .

ToRefs

If we want to use object’s attributes directly on template, we can use toRefs api.

let’s try it.

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{name}}</p>
  5. <p>author age: {{age}}</p>
  6. <br>
  7. <p>author msg: {{msg}}</p>
  8. </div>
  9. </template>
  10. <script>
  11. import { onMounted, reactive, ref, toRefs } from 'vue'
  12. export default {
  13. name: 'SetupFunction',
  14. setup() {
  15. let author = reactive({
  16. name: '冬沐',
  17. age: 23
  18. })
  19. let { name, age } = toRefs(author)
  20. let msg = ref('hello, my name is 冬沐.')
  21. let count = ref(0)
  22. onMounted(() => {
  23. setInterval(() => {
  24. count.value++
  25. author.age++
  26. if (count.value % 2 === 0) {
  27. author.name = '冬沐'
  28. msg.value = 'hello, my name is 冬沐.'
  29. } else {
  30. author.name = 'Bill Ann'
  31. msg.value = 'hello, my english name is Bill Ann.'
  32. }
  33. }, 1000)
  34. })
  35. return {
  36. name,
  37. age,
  38. msg,
  39. }
  40. }
  41. }
  42. </script>
  43. <style>
  44. </style>

If we don’t use reactive or ref api to declare an attibute, we can excute code in the form of below.

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{name}}</p>
  5. <p>author age: {{age}}</p>
  6. <br>
  7. <p>author msg: {{desc}}</p>
  8. <br>
  9. <p>normal attribute: {{normalAttribute.attr1}}</p>
  10. </div>
  11. </template>
  12. <script>
  13. import { onMounted, onUnmounted, reactive, ref, toRefs, computed } from 'vue'
  14. export default {
  15. name: 'SetupFunction',
  16. setup() {
  17. let author = reactive({
  18. name: '冬沐',
  19. age: 23
  20. })
  21. let { name, age } = toRefs(author)
  22. let msg = ref('hello, my name is 冬沐.')
  23. let count = ref(0)
  24. let normalAttribute = {
  25. attr1: 1
  26. }
  27. let desc = computed(() => {
  28. return name.value === '冬沐' ? 'hello, my name is 冬沐.' : 'hello, my english name is Bill Ann.'
  29. })
  30. let timer
  31. onMounted(() => {
  32. timer = setInterval(() => {
  33. count.value++
  34. age.value++
  35. normalAttribute.attr1++
  36. if (count.value % 2 === 0) {
  37. name.value = '冬沐'
  38. } else {
  39. name.value = 'Bill Ann'
  40. }
  41. }, 1000)
  42. console.log('vue instance is now mounted.')
  43. })
  44. onUnmounted(() => {
  45. clearInterval(timer)
  46. console.log('vue instance is now mounted.')
  47. })
  48. return {
  49. name,
  50. age,
  51. msg,
  52. desc,
  53. normalAttribute
  54. }
  55. }
  56. }
  57. </script>
  58. <style>
  59. </style>

In setInterval function, we use reactive attributes while increasing attr1. And attr1 can be reactive now. (just when we use reactive attributes at the same time)

I think it’s caused by the side effect function feature.

How to create a computed attribute

In vue3, we can use computed api to create a computed attribute.

Now let’s try it.

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{name}}</p>
  5. <p>author age: {{age}}</p>
  6. <br>
  7. <p>author msg: {{desc}}</p>
  8. </div>
  9. </template>
  10. <script>
  11. import { onMounted, reactive, ref, toRefs, computed } from 'vue'
  12. export default {
  13. name: 'SetupFunction',
  14. setup() {
  15. let author = reactive({
  16. name: '冬沐',
  17. age: 23
  18. })
  19. let { name, age } = toRefs(author)
  20. let msg = ref('hello, my name is 冬沐.')
  21. let count = ref(0)
  22. let desc = computed(() => {
  23. return name.value === '冬沐' ? 'hello, my name is 冬沐.' : 'hello, my english name is Bill Ann.'
  24. })
  25. onMounted(() => {
  26. setInterval(() => {
  27. count.value++
  28. age.value++
  29. if (count.value % 2 === 0) {
  30. name.value = '冬沐'
  31. } else {
  32. name.value = 'Bill Ann'
  33. }
  34. }, 1000)
  35. })
  36. return {
  37. name,
  38. age,
  39. msg,
  40. desc
  41. }
  42. }
  43. }
  44. </script>
  45. <style>
  46. </style>

How to use watch in vue3

In vue3, we can use watch api to add a listener of an attribute.

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{name}}</p>
  5. <p>author age: {{age}}</p>
  6. <br>
  7. <p>author msg: {{desc}}</p>
  8. <p>language: {{lang}}</p>
  9. </div>
  10. </template>
  11. <script>
  12. import { onMounted, reactive, ref, toRefs, computed, watch } from 'vue'
  13. export default {
  14. name: 'SetupFunction',
  15. setup() {
  16. let author = reactive({
  17. name: '冬沐',
  18. age: 23
  19. })
  20. let { name, age } = toRefs(author)
  21. let msg = ref('hello, my name is 冬沐.')
  22. let count = ref(0)
  23. let desc = computed(() => {
  24. return name.value === '冬沐' ? 'hello, my name is 冬沐.' : 'hello, my english name is Bill Ann.'
  25. })
  26. let lang = ref('中文')
  27. watch(count, (val, oldVal) => {
  28. if (count.value % 2 === 0) {
  29. name.value = '冬沐'
  30. lang.value = '中文'
  31. } else {
  32. name.value = 'Bill Ann'
  33. lang.value = 'english'
  34. }
  35. })
  36. onMounted(() => {
  37. setInterval(() => {
  38. count.value++
  39. author.age++
  40. }, 1000)
  41. })
  42. return {
  43. name,
  44. age,
  45. msg,
  46. desc,
  47. lang
  48. }
  49. }
  50. }
  51. </script>
  52. <style>
  53. </style>

OnMounted and OnUnmounted in vue3

Same with above usage, vue3 use onMounted and onUnmounted api to listen mounted and unmounted.

let’s try them.

  1. <template>
  2. <div>
  3. <h2>setup function</h2>
  4. <p>author name: {{name}}</p>
  5. <p>author age: {{age}}</p>
  6. <br>
  7. <p>author msg: {{desc}}</p>
  8. </div>
  9. </template>
  10. <script>
  11. import { onMounted, onUnmounted, reactive, ref, toRefs, computed } from 'vue'
  12. export default {
  13. name: 'SetupFunction',
  14. setup() {
  15. let author = reactive({
  16. name: '冬沐',
  17. age: 23
  18. })
  19. let { name, age } = toRefs(author)
  20. let msg = ref('hello, my name is 冬沐.')
  21. let count = ref(0)
  22. let desc = computed(() => {
  23. return name.value === '冬沐' ? 'hello, my name is 冬沐.' : 'hello, my english name is Bill Ann.'
  24. })
  25. let timer
  26. onMounted(() => {
  27. timer = setInterval(() => {
  28. count.value++
  29. age.value++
  30. if (count.value % 2 === 0) {
  31. name.value = '冬沐'
  32. } else {
  33. name.value = 'Bill Ann'
  34. }
  35. }, 1000)
  36. console.log('vue instance is now mounted.')
  37. })
  38. onUnmounted(() => {
  39. clearInterval(timer)
  40. console.log('vue instance is now mounted.')
  41. })
  42. return {
  43. name,
  44. age,
  45. msg,
  46. desc
  47. }
  48. }
  49. }
  50. </script>
  51. <style>
  52. </style>