计算属性computed

计算属性来描述依赖响应式状态的复杂逻辑
使用时需要引入 computed

  1. <template>
  2. <p>Has published books:</p>
  3. <span>{{ publishedBooksMessage }}</span>
  4. </template>
  5. <script setup>
  6. import { reactive, computed } from 'vue'
  7. const author = reactive({
  8. name: 'John Doe',
  9. books: [
  10. 'Vue 2 - Advanced Guide',
  11. 'Vue 3 - Basic Guide'
  12. ]
  13. })
  14. // 返回值为一个计算属性 ref
  15. const publishedBooksMessage = computed(() => {
  16. return author.books.length > 0 ? 'Yes' : 'No'
  17. })
  18. </script>

侦听器 watch

watch 的第一个参数可以是不同形式的“来源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter函数、或多个来源组成的数组:

  1. //首先要引入 watch
  2. import { ref, watch } from 'vue'
  3. const x = ref(0)
  4. const y = ref(0)
  5. // 单个 ref
  6. watch(x, (newX) => {
  7. console.log(`x is ${newX}`)
  8. })
  9. // getter 函数
  10. watch(
  11. () => x.value + y.value,
  12. (sum) => {
  13. console.log(`sum of x + y is: ${sum}`)
  14. }
  15. )
  16. // 多个来源组成的数组
  17. watch([x, () => y.value], ([newX, newY]) => {
  18. console.log(`x is ${newX} and y is ${newY}`)
  19. })

注意,你不能侦听响应式对象的 property,例如:

  1. const obj = reactive({ count: 0 })
  2. // 这不起作用,因为你是向 watch() 传入了一个 number
  3. watch(obj.count, (count) => {
  4. console.log(`count is: ${count}`)
  5. })

用 getter 函数 可以解决这个问题

  1. // 提供一个 getter 函数
  2. watch(
  3. () => obj.count,
  4. (count) => {
  5. console.log(`count is: ${count}`)
  6. }
  7. )